Как клонировать определенную фиксацию с глубиной 1?

можно ли мелко клонировать определенную фиксацию в репозитории, т. е. с глубиной 1? Что-то вроде

git clone http://myrepo.git 728a4d --depth 1

чтобы получить состояние репозитория, как оно есть при фиксации с SHA 728a4d...?

мотивация заключается в том, чтобы избежать клонирования всего репозитория, а затем проверить эту конкретную фиксацию, когда нас интересует только состояние репозитория при этой конкретной фиксации.

4 ответов


начиная с Git 2.5.0 (который должен быть доступен в и сторона клиента и сервера) вы можете установить uploadpack.allowReachableSHA1InWant=true на стороне сервера, чтобы включить извлечение определенных SHA1s:

git init
git remote add origin <url>
git fetch --depth 1 origin <sha1>
git checkout FETCH_HEAD

обратите внимание, что я не нашел синтаксис для этого с git clone напрямую.


немедленный ответ: Вы не можете.
Почему? подробное объяснение можно найти здесь:почему нет конкретной опции фиксации git Clone?

что еще можно сделать?

как клонировать репозиторий к определенной фиксации? (полный клон)

# Create empty repository to store your content
git clone <url>
git reset <sha-1> --hard

Подробнее:

как клонировать одну ветку?

git clone <url> --branch <branch_name> --single-branch <folder_name>

как клонировать только последнюю фиксацию из данного бранч?

git clone <url> --depth=1 --branch <branch_name> --single-branch <folder_name>

как мелко клонировать конкретную фиксацию с глубиной 1?

как прокомментировал @sschuberth:--depth подразумевает --single-branch.

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

# fetch a commit (or branch or tag) of interest
# In this case you will have the full history of this commit
git fetch origin <sha1>

попробуйте использовать while в bash:

git clone --depth=1 $url
i=1; while ! git show $sha1; do git fetch --depth=$((i+=1)); done

Это довольно медленно, потому что он извлекает каждую фиксацию индивидуально; вы можете увеличить приращение (для извлечения фиксаций в пакетах и повышения производительности по сети), но это все еще подход грубой силы.


Примечание: мой пример не помогает клонировать хэшем фиксации, но он поможет клонировать тег и иметь легкий репозиторий.

если у вас есть только одна фиксация в вашем "клоне", и вы собираетесь использовать хэш фиксации,короткий ответ: нет.

Я использую эту командную конструкцию (проверено на П2.13.2.окна.1) для тегов:

git clone --depth 1 git@github.com:VENDOR/REPO.git --branch 1.23.0 --single-branch

1.23.0 - это может быть либо хэш фиксации, либо отделение.

полный пример:

$ git clone --depth 1 git@github.com:Seldaek/monolog.git --branch 1.23.0 --single-branch
Cloning into 'monolog'...
remote: Counting objects: 201, done.
remote: Compressing objects: 100% (188/188), done.
remote: Total 201 (delta 42), reused 32 (delta 5), pack-reused 0
Receiving objects: 100% (201/201), 190.30 KiB | 0 bytes/s, done.
Resolving deltas: 100% (42/42), done.
Note: checking out 'fd8c787753b3a2ad11bc60c063cff1358a32a3b4'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b <new-branch-name>

$ cd monolog

.git dir размер (267K vs 2.6 м С помощью full clone):

$ du -h --max-depth=0 .git
267K    .git

Я хотел бы обозначить, --branch можно взять тег/филиала.

https://git-scm.com/docs/git-clone#git-clone---branchltnamegt

--branch также можно взять теги и отсоединить головку при этом фиксации в результате хранилище.

UPD

в двух словах, это может занять "refs". Вы можете прочитать больше здесь: При чем тут ГИТ сервер сообщение об ошибке "не разрешает запрос для объекта нерекламируемых" имеете в виду?

и нет трюки, как:

git fetch --depth 1 origin <COMMIT_HASH>

спасибо @BenjiWiebe за указание мне в моей ошибке.