13 ответов:
обновление 2 С Git 2.5.0 функция, описанная ниже, может быть включена на стороне сервера с переменной конфигурацией
uploadpack.allowReachableSHA1InWantздесь запрос функции GitHub и GitHub commit включение этой функции. Обратите внимание, что некоторые git-серверы активируют эту опцию по умолчанию, например Bitbucket Server включил ее с версия 5.5+. Смотрите это ответ на Stackexchange для примера того, как активируйте параметр конфигурации.обновление 1 для версий Git
1.7 < v < 2.5используйте git clone и git reset, как описано в Вэбов Баджпаи этоесли вы не хотите, чтобы получить полный репозиторий, то вы, вероятно, не следует использовать
clone. Вы всегда можете просто использовать fetch, чтобы выбрать ветку, которую вы хотите получить. Я не специалист по hg, поэтому я не знаю подробностей-rно в Git, вы можете сделать что-то подобное этот.# make a new blank repository in the current directory git init # add a remote git remote add origin url://to/source/repository # fetch a commit (or branch or tag) of interest # Note: the full history up to this commit will be retrieved unless # you limit it with '--depth=...' or '--shallow-since=...' git fetch origin <sha1-of-commit-of-interest> # reset this repository's master branch to the commit of interest git reset --hard FETCH_HEAD
$ git clone $URL $ cd $PROJECT_NAME $ git reset --hard $SHA1чтобы снова вернуться к самой последней фиксации
$ git pull
клонирование репозитория git, точно, клонирует весь репозиторий: нет способа выбрать только одну ревизию для клонирования. Однако, как только вы выполните
git clone, вы можете проверить конкретную ревизию, сделавcheckout <rev>.
Если вы имеете в виду, что хотите получить все с самого начала до определенного момента, ответ Чарльза Бейли идеален. Если вы хотите сделать обратное и получить подмножество истории, начиная с текущей даты, вы можете использовать
git clone --depth [N]где N - количество оборотов истории, которое вы хотите. Однако:--глубина
создайте неглубокий клон с историей, усеченной до указанного числа ревизий. Мелкое хранилище имеет ряд ограничений (вы не можете клонировать или извлекать из него, ни толкать из него, ни в него), но достаточно, если вас интересует только недавняя история большого проекта с длинной историей и вы хотите отправить исправления в виде патчей.
просто чтобы подвести итог (git V. 1.7.2.1):
- обычных
git cloneгде вы хотите РЕПО (получает все на сегодняшний день - я знаю, не то, что хотел, мы туда добираемся)git checkout <sha1 rev>из rev вы хотитеgit reset --hardgit checkout -b master
TL;DR-просто создайте тег в исходном репозитории против фиксации, которую вы хотите клонировать, и используйте тег в команде fetch. Вы можете удалить тег из исходного РЕПО позже, чтобы очистить его.
ну, его 2014 год, и похоже, что принятый ответ Чарльза Бейли с 2010 года хорошо и действительно устарел к настоящему времени и большинство (все?) из других ответов связаны с клонированием, которого многие люди надеются избежать.
следующее решение достигает того, что ОП и многие другие ищут, что является способом создания копии репозитория, включая историю, но только до определенной фиксации.
вот команды, я использовал с Git версии 2.1.2 для клонирования локального РЕПО (т. е. репозиторий в другой директории) до определенного момента:
# in the source repository, create a tag against the commit you want to check out git tag -m "Temporary tag" tmptag <sha1> # create a new directory and change into that directory cd somewhere_else;mkdir newdir;cd newdir # ...and create a new repository git init # add the source repository as a remote (this can be a URL or a directory) git remote add origin /path/to/original/repo # fetch the tag, which will include the entire repo and history up to that point git fetch origin refs/tags/tmptag # reset the head of the repository git reset --hard FETCH_HEAD # you can now change back to the original repository and remove the temporary tag cd original_repo git tag -d tmptagнадеюсь, это решение будет работать еще несколько лет! : -)
вы можете использовать просто
git checkout <commit hash>в этой последовательности
bash git clone [URLTORepository] git checkout [commithash]фиксация хэша выглядит так: "45ef55ac20ce2389c9180658fdba35f4a663d204"
используя 2 из приведенных выше ответов (как клонировать репозиторий git с определенной ревизией / набором изменений? и как клонировать репозиторий git с определенной ревизией / набором изменений?) Помог мне придумать определительное. Если вы хотите клонировать до точки, то эта точка должна быть тегом/ветвью, а не просто SHA или fetch_head запутывается. После ГИТ выборки установить, если вы используете имя ветки или тега, вы получите ответ, если вы просто использовать алгоритм SHA-1 Вы получаете не ответ.
Вот что я сделал:- создайте полный рабочий клон полного РЕПО, из фактического источникаcd <path to create repo> git clone git@<our gitlab server>:ui-developers/ui.gitзатем создайте локальную ветку, в точке, которая интересна
git checkout 2050c8829c67f04b0db81e6247bb589c950afb14 git checkout -b origin_pointзатем создайте мое новое пустое РЕПО, с моей локальной копией в качестве источника
cd <path to create repo> mkdir reduced-repo cd reduced-repo git init git remote add local_copy <path to create repo>/ui git fetch local_copy origin_pointв этот момент я получил такой ответ. Я отмечаю это, потому что если вы используете SHA-1 вместо ветки выше, ничего не происходит, поэтому ответ означает это работал
/var/www/html/ui-hacking$ git fetch local_copy origin_point remote: Counting objects: 45493, done. remote: Compressing objects: 100% (15928/15928), done. remote: Total 45493 (delta 27508), reused 45387 (delta 27463) Receiving objects: 100% (45493/45493), 53.64 MiB | 50.59 MiB/s, done. Resolving deltas: 100% (27508/27508), done. From /var/www/html/ui * branch origin_point -> FETCH_HEAD * [new branch] origin_point -> origin/origin_pointтеперь в моем случае мне нужно было вернуть это на gitlab, как новое РЕПО, поэтому я сделал
git remote add origin git@<our gitlab server>:ui-developers/new-ui.gitчто означало, что я мог бы перестроить свое РЕПО из origin_point с помощью
git --git-dir=../ui/.git format-patch -k -1 --stdout <sha1> | git am -3 -kгадать удаленно, а затем использоватьgit push originчтобы загрузить всю партию обратно в свой новый дом.надеюсь, что это поможет кому-то
моя версия была комбинацией принятых и наиболее популярных ответов. Но это немного отличается, потому что все используют SHA1, но никто не говорит вам, как его получить
$ git init $ git remote add <remote_url> $ git fetch --allТеперь вы можете видеть все ветви и коммиты
$ git branch -a $ git log remotes/origin/master <-- or any other branchнаконец-то вы знаете SHA1 желаемого коммита
git reset --hard <sha1>
его простой. Вам просто нужно установить восходящий поток для текущей ветви
$ git clone repo $ git checkout -b newbranch $ git branch --set-upstream-to=origin/branch newbranch $ git pullвот и все
git clone https://github.com/ORGANIZATION/repository.git(клонировать репозиторий)
cd repository (navigate to the repository)
git fetch origin 2600f4f928773d79164964137d514b85400b09b2
git checkout FETCH_HEAD
клонировать только один конкретный коммит на конкретной ветке или теге используйте:
git clone --depth=1 --branch NAME https://github.com/your/repo.gitк сожалению,
NAMEможет быть только имя ветви или имя тега (не фиксировать SHA).пропустить
--depthфлаг, чтобы загрузить всю историю, а затем проверить эту ветку или тег:git clone --branch NAME https://github.com/your/repo.gitэто работает с последней версией git (я сделал это с версией
2.18.0).
git clone -o <sha1-of-the-commit> <repository-url> <local-dir-name>
gitиспользует словоoriginвместо общеизвестногоrevisionНиже приведен фрагмент из руководства
$ git help clone--origin <name>, -o <name> Instead of using the remote name origin to keep track of the upstream repository, use <name>.
Comments