it-swarm.com.ru

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

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

hg clone -r 3 /path/to/repository
338
John

ОБНОВЛЕНИЕ 2 Поскольку Git 2.5. описанная ниже функция может быть включена на стороне сервера с помощью переменной конфигурации 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's master branch to the commit of interest
git reset --hard FETCH_HEAD
165
CB Bailey
$ git clone $URL
$ cd $PROJECT_NAME
$ git reset --hard $SHA1

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

$ git pull
777
Vaibhav Bajpai

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

49
user113292

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

--depth

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

30
Walter Mundt

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

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

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

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

19
JamesG

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

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

bash git clone [URLTORepository] git checkout [commithash]

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

10
M.Othman

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

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

8
Peter Kovac

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

cd repository (navigate to the repository)

git fetch Origin 2600f4f928773d79164964137d514b85400b09b2

git checkout FETCH_HEAD

2
JeffDropsIT

Используя 2 из приведенных выше ответов ( Как клонировать git-репозиторий с определенной ревизией/changeset? и Как клонировать git-репозиторий с конкретной ревизией/changeset? ) Помог мне найти с определительным. Если вы хотите клонировать до какой-либо точки, то эта точка должна быть тегом/ветвью, а не просто 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: подсчет объектов: 45493, выполнено. 
 remote: сжатие объектов: 100% (15928/15928 ), выполнено. 
 удаленно: всего 45493 (дельта 27508), повторно использовано 45387 (дельта 27463) 
 Получающие объекты: 100% (45493/45493), 53,64 МБ | 50,59 МБ/с, выполнено. 
 Разрешение дельт: 100% (27508/27508), выполнено. 
 Из /var/www/html/ui
 * Ответвление Origin_point -> FETCH_HEAD 
 * [новая ветка] 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, чтобы загрузить весь лот обратно в его новый дом.

Надеюсь, что это помогает кому-то

2
sibaz

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

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

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

Это все

0
NEOJPK