Способ сохранить неглубокий клон git минимально обновлен?
Моя цель состоит в том, чтобы иметь возможность как создавать последние версии, так и вносить вклад в проект с длинной и объемной историей - и делать это, не используя местное хранилище, чтобы дублировать множество исторических веток и историю, относящуюся к десятилетию и многое другое (что я всегда могу найти в веб-интерфейсе центрального репозитория проекта, если мне когда-либо понадобится, чего я, вероятно, не буду).
Мне, казалось, повезло с первой попытки:
git clone --depth 40 -b master http://github.com/who/what.git/ what
Это дало мне аккуратный локальный клон "что", в котором была только ветка "master
", и достаточно для того, чтобы охватить последние два тегированных релиза.
Тогда я мог бы сделать "git checkout latest-release-tag
" и создать последнюю версию. Yippee!
Как я и ожидал, мне нужно было сделать патч. Все прошло плавно: "git checkout -b my-patch-branch
", внесите мои изменения, зафиксируйте, и я смог вытащить свою ветку патча обратно к клону на github, чтобы проект мог его вытащить. Легко!
Мне кажется, мне повезло, потому что из того, что я читал, например здесь, я бы не смог это сделать до git 1.9.
Но установленная версия оказалась равной 1.9, поэтому мне это удалось.
Теперь следующая очевидная вещь, которую я хотел бы сделать, это извлечь из удаленного и забрать самую последнюю активность на главном сервере (включая восходящее слияние моего патча, так что мне больше не понадобится эта ветка). Я пробовал "git fetch --dry-run upstream" и смотрел в ужасе, когда он гадал бесконечные мегабайты загрузки, а затем дал мне список новых тегов, восходящих к возрасту мастодонтов. Я рад, что сказал --dry-run
!
Я действительно надеялся, что он просто заберет дюжину или около того новых коммитов на "master
" с HEAD моего клона, а затем, возможно, у меня будет клон глубиной 52 вместо 40, но такой вид что я хочу... начать с полезного количества недавней истории, прежде чем я включился, а затем просто отслеживать и расти с этого момента и иметь возможность создавать, разветвлять и нажимать патчи. Кажется, так близко.
Есть ли простой способ сделать git делать то, что я пытаюсь сделать? Я пытаюсь сделать необоснованным?
Изменить: немного больше информации.
(1) upsteam на самом деле опережает меня, ближе к сто коммиттов, моя оценка дюжины была выведена из эфира.
(2) выясняется, что первоначальные 40 коммитов, которые я получил с моим клоном, были полностью неполными. Куча более поздних, которые я пытаюсь извлечь, - это коммиты слияния со вторым родителем в некоторой ветки, к которой мой клон не включал. Могут ли они заставить git втянуть всю свою древнюю историю, потому что самая ранняя фиксация в моем клоне не является общим предком?
Есть ли способ сказать, что я не хочу этого?
Дополнительная информация:
(1) мне пришло в голову, что раньше я использовал протокол http, который фактически не взаимодействует с процессом git на сервере, поэтому у него нет возможности настроить размер загрузки.
Однако, когда я повторил использование git -over-ssh, я все равно получил огромный выбор.
Тогда
(2) вручную, подобно животному, я щелкнул через фиксации слияния, показанные на дисплее github 'newtork', нашел те, которые связаны с ветвями, которые начались до моего мелкого разреза, и добавили их родительские-2 SHA в мой файл .git/shallow
и затем снова попробовал 'git fetch' поверх ssh. Это отлично поработало и загрузило крошечный пакетный файл, который мог бы просто перетащить мою локальную ветвь master
. Я думаю, что это именно то, что я хотел бы git сделать автоматически, но я не нашел способ сделать это. В руке это довольно утомительно.:)
Ответы
Ответ 1
Какую ценность я должен пройти? Если я первоначально клонировал на глубине 40, и есть 100 новых коммитов вверх по течению, я прошу глубину 140?
Git 2.11 (Q4 2016) позволит вам увеличить глубину, поэтому, если ваша выборка принесет 100 новых коммитов, вы можете установить новую глубину до 140
См. commit cccf74e, совершить 079aa97, commit 2997178, зафиксировать cdc3727, commit 859e5df, совершить a45a260, commit 269a7a8, commit 41da711, commit 6d43a0c, commit 994c2aa, совершить 508ea88, commit 569e554, commit 3d9ff4d, commit 79891cb, commit 1dd73e2, commit 0d789a5, commit 45a3e52, зафиксировать 3f0f662, commit 7fcbd37, com mit 6e414e3 (12 июня 2016 г.) Nguyễn Thái Ngọc Duy (pclouds
).
Помощник: Duy Nguyen (pclouds
), Эрик Саншайн (sunshineco
) и Junio C Hamano (gitster
).
(Слияние Юнио С Хамано - gitster
- в совершить a460ea4, 10 октября 2016 г.)
В частности, commit cccf74e:
fetch
, upload-pack
: --deepen=N
продолжит мелкую границу на N
совершает
В git fetch
, --depth
аргумент всегда относителен к последним удаленным ссылкам.
Это затрудняет рассмотрение этого случая использования, когда пользователь хочет сделать мелкую историю, скажем, на 3 уровня глубже.
Это будет работать, если удаленные ссылки еще не были перемещены, но никто не может этого гарантировать, особенно если этот случай использования выполняется через пару месяцев после последнего клона или "git fetch --depth
". Кроме того, изменение мелкой границы с помощью --depth
не очень хорошо работает с клонами, созданными с помощью --since
или --not
.
Этот патч исправляет это.
Новый аргумент --deepen=<N>
добавит <N>
more (*) parent, который фиксирует текущую историю независимо от того, где находятся удаленные ссылки.
(*) Мы могли бы даже поддерживать --deepen=<N>
, где <N>
отрицательно.
В этом случае мы можем вырезать некоторую историю из мелкого клона. Эта операция (и --depth=<shorter depth>
) не требует взаимодействия с удаленной стороной (и более сложно реализовать в результате).