Как обновить git shallow клон?

Предпосылки

(для tl; dr см. # Вопросы ниже)

У меня есть несколько мелких клонов репозитория git. Я использую неглубокие клоны, потому что они намного меньше по сравнению с глубокими клонами. Каждый клонируется, делая примерно git clone --single-branch --depth 1 .

Это отлично работает, за исключением того, что я не вижу, как его обновить.

Когда я клонирую по тегу, обновление не имеет смысла, так как тег является замороженным моментом времени (насколько я понимаю). В этом случае, если я хочу обновить, это означает, что я хочу клонировать другим тегом, поэтому я просто rm -rf и снова клонирую.

Ситуация усложняется, когда я клонирую HEAD главной ветки, а затем хочу обновить ее.

Я пытался git pull --depth 1, но, хотя я и не собираюсь что-либо отправлять в удаленный репозиторий, он жалуется, что не знает, кто я.

Я пытался git fetch --depth 1, но, хотя это, похоже, что-то обновляет, я проверил, что оно не обновлено (некоторые файлы в удаленном репозитории имеют содержимое, отличное от того, что есть в моем клоне).

После https://stackoverflow.com/a/20508591/279335 я попробовал git fetch --depth 1; git reset --hard origin/master, но две вещи: во-первых, я не понимаю, зачем нужен git reset, во-вторых, хотя файлы, кажется, обновлены, некоторые старые файлы остаются, и git clean -df не удаляет эти файлы.

Вопросы

Пусть клон создан с помощью git clone --single-branch --depth 1 . Как его обновить, чтобы достичь того же результата, что и rm -rf ; git clone --single-branch --depth 1 ? Или rm -rf и снова клонировать единственный путь?

Примечание

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

24
задан Sachin Joseph 26 June 2019 в 10:26
поделиться

1 ответ

О самом процессе мелкого обновления клона см. commit 649b0c3 форма Git 2.12 (первый квартал 2017 года).
Этот коммит является частью:

Commit 649b0c3 , commit f2386c6 , commit 6bc3d8c , commit 0afd307 (06 Dec) 2016) Нгуен Тай Нгц Дуй (pclouds) . См. commit 1127b3c , commit 381aa8e (06.12.2016) by Расмус Виллемес (ravi-prevas) . (Объединено с Хунио С. Хамано - gitster - в commit 3c9979b , 21 декабря 2016 г.)

shallow.c

Этот paint_down() является частью шага 6 58babff (shallow.c: 8 шагов для выбора новых коммитов для .git / shallow - 2013-12-05) .
Когда мы выбираем из мелкого репозитория, нам нужно знать, нужно ли одному из новых / обновленных ссылок новые «мелкие коммиты» в .git/shallow (потому что у нас недостаточно истории этих ссылок) и какой.

Вопрос на шаге 6 заключается в том, какие (новые) мелкие коммиты требуются в других, чтобы поддерживать достижимость по всему хранилищу без сокращения нашей истории?
Чтобы ответить, мы отмечаем все коммиты достижимы из существующих ссылок с помощью UNINTERESTING ("rev-list --not --all"), помечайте мелкие коммиты с помощью BOTTOM, затем для каждой новой / обновленной ссылки проходите по графику фиксации, пока мы не нажмем UNINTERESTING или BOTTOM, отмечая ссылку на коммит, как мы ходить.

1140 После того, как все прогулки пройдены, мы проверяем новые мелкие коммиты. Если мы не видели каких-либо новых ссылок, помеченных на новом мелком коммите, мы знаем, что все новые / обновленные ссылки достижимы, используя только нашу историю и .git/shallow.
Рассматриваемый мелкий коммит не нужен и может быть отброшен.

Итак, код.

Цикл здесь (для обхода коммитов) в основном:

  1. получить один коммит из очереди
  2. игнорировать, если он ВИДЕТ или НЕИНТЕРЕСОВАН [
  3. пройти через всех родителей и ..
    • 5.aa пометить его, если он никогда не был отмечен ранее
    • 5.b положить его в очередь

Что мы делаем в этом патче шаг 5a, потому что в этом нет необходимости.
Коммит, отмеченный 5a, помещается обратно в очередь и будет отмечен на шаге 3 на следующей итерации. Единственный случай, когда он не будет помечен, это когда коммит уже помечен как UNINTERESTING (5a не проверяет это), что будет игнорироваться на шаге 2.

3
ответ дан VonC 26 June 2019 в 10:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: