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



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



hg clone -r 3 /path/to/repository
1439   13  

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

  1. обычных git clone где вы хотите РЕПО (получает все на сегодняшний день - я знаю, не то, что хотел, мы туда добираемся)
  2. git checkout <sha1 rev> из rev вы хотите
  3. git reset --hard
  4. git 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

    Ничего не найдено.