Как клонировать репозиторий git с конкретной версией/набором изменений?

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

hg clone -r 3 /path/to/repository

Ответ 1

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

ОБНОВЛЕНИЕ 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 master branch to the commit of interest
git reset --hard FETCH_HEAD

Ответ 2

$ git clone $URL
$ cd $PROJECT_NAME
$ git reset --hard $SHA1

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

$ git pull

Ответ 3

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

Ответ 4

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

- глубина

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

Ответ 5

Просто чтобы суммировать вещи (git v. 1.7.2.1):

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

Ответ 6

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

Ну, его 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

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

Ответ 7

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

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

bash git clone [URLTORepository] git checkout [commithash]

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

Ответ 8

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

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

Ответ 9

Используя 2 из приведенных выше ответов (Как клонировать репозиторий git с помощью конкретной ревизии/набора изменений? и Как сделать clone git с конкретной версией/набором изменений?) Помог мне придумать определенную. Если вы хотите клонировать до точки, то эта точка должна быть тегом/ветвью, а не просто SHA или FETCH_HEAD запутывается. После набора git fetch, если вы используете имя ветки или тега, вы получаете ответ, если вы просто используете SHA-1, вы не получаете ответа.
Вот что я сделал: - создать полный рабочий клон полного репо, от фактического происхождения

cd <path to create repo>
git clone [email protected]<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 [email protected]<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, чтобы загрузить всю партию обратно в свой новый дом.

Надеюсь, что кто-то поможет

Ответ 10

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

Ответ 11

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

cd repository (navigate to the repository)

git fetch origin 2600f4f928773d79164964137d514b85400b09b2

git checkout FETCH_HEAD

Ответ 12

Прост. Вам просто нужно установить восходящий поток для текущей ветки

$ git clone repo
$ git checkout -b newbranch
$ git branch --set-upstream-to=origin/branch newbranch
$ git pull

Что все

Ответ 13

Я использую этот фрагмент с GNU make, чтобы закрыть любой тег ревизии, ветку или хеш

это было протестировано на git версии 2.17.1

${dir}:
    mkdir -p ${@D}
    git clone --recursive --depth 1 --branch ${revison} ${url} ${@} \
 || git clone --recursive --branch ${revison} ${url} ${@} \
 || git clone ${url} ${@}
    cd ${@} && git reset --hard ${revison}
    ls [email protected]




Ответ 14

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