Как клонировать репозиторий 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>.