Как клонировать git-репозиторий с определенной ревизией / набором изменений? - PullRequest
343 голосов
/ 16 августа 2010

Как я могу клонировать git-репозиторий с определенной ревизией, как обычно в Mercurial:

hg clone -r 3 /path/to/repository

Ответы [ 14 ]

786 голосов
/ 30 декабря 2012
$ git clone $URL
$ cd $PROJECT_NAME
$ git reset --hard $SHA1

Чтобы снова вернуться к самому последнему коммиту

$ git pull
167 голосов
/ 16 августа 2010

ОБНОВЛЕНИЕ 2 Начиная с Git 2.5.0 описанная ниже функция может быть включена на стороне сервера с помощью переменной конфигурации uploadpack.allowReachableSHA1InWant, здесь Запрос функции GitHub и фиксация GitHub, включающая эту функцию .Обратите внимание, что некоторые серверы Git активируют эту опцию по умолчанию, например, Bitbucket Server включил ее, начиная с версия 5.5 + .См. Этот ответ на Stackexchange для примера того, как активировать опцию конфигурации.

UPDATE 1 Для версий Git 1.7 < v < 2.5 используйте git clone и git reset, какописано в ответ Вайбхава Баджпаи

Если вы не хотите получать полный репозиторий, то вам, вероятно, не следует использовать clone.Вы всегда можете просто использовать выборку, чтобы выбрать ветку, которую хотите получить.Я не эксперт по 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
50 голосов
/ 16 августа 2010

Клонирование репозитория git удачно клонирует весь репозиторий: нет способа выбрать только одну ревизию для клонирования. Однако, как только вы выполните git clone, вы можете извлечь конкретную ревизию, выполнив checkout <rev>.

30 голосов
/ 16 августа 2010

Если вы имеете в виду, что хотите получить все от начала до определенной точки, ответ Чарльза Бейли будет идеальным. Если вы хотите сделать обратное и получить подмножество истории, начиная с текущей даты, вы можете использовать git clone --depth [N], где N - это количество оборотов истории, которое вы хотите. Однако:

- глубина

Создание мелкого клона с историей, усеченной до указанного количества ревизий. У мелкого репозитория есть ряд ограничений (вы не можете клонировать или извлекать из него, ни выдвигать из него, ни в него), но этого достаточно, если вы заинтересованы только в недавней истории большого проекта с длинной историей и хотели бы отправить исправления в виде исправлений.

24 голосов
/ 05 марта 2012

Просто чтобы подвести итог (git v. 1.7.2.1):

  1. регулярно git clone, где вы хотите репо (получает все на сегодняшний день - я знаю, не то, что нужно, мы добираемся туда)
  2. git checkout <sha1 rev> оборотов, которые вы хотите
  3. git reset --hard
  4. git checkout -b master
19 голосов
/ 19 ноября 2014

TL; DR - Просто создайте тег в исходном репозитории против коммита, который вы хотите клонировать, и используйте тег в команде извлечения.Вы можете удалить тег из исходного репо позже, чтобы очистить его.

Что ж, его 2014 год и похоже, что принятый ответ Чарльза Бэйли от 2010 года хорошо и действительно устарел к настоящему времени, и большинство (все?) Другихответы включают в себя клонирование, которого многие надеются избежать.

Следующее решение позволяет добиться того, что ищет OP и многие другие, - это способ создать копию хранилища, включая историю, но только додля определенного коммита.

Вот команды, которые я использовал с 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

Надеюсь, это решение будет работать еще несколько лет!: -)

12 голосов
/ 04 августа 2013

Вы можете просто использовать git checkout <commit hash>

в этой последовательности

bash git clone [URLTORepository] git checkout [commithash]

коммит хеш выглядит следующим образом "45ef55ac20ce2389c9180658fdba35f4a663d204"

8 голосов
/ 09 августа 2018

Для клонирования только одного отдельного коммита для конкретной ветви или использования тега:

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).

2 голосов
/ 10 июля 2018

git clone https://github.com/ORGANIZATION/repository.git (клонировать репозиторий)

cd repository (navigate to the repository)

git fetch origin 2600f4f928773d79164964137d514b85400b09b2

git checkout FETCH_HEAD

2 голосов
/ 28 октября 2016

Моя версия была комбинацией принятых и наиболее одобренных ответов. Но это немного по-другому, потому что все используют 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>
...