Какая альтернатива git --shallow-начиная с использования git глубины клона - PullRequest
0 голосов
/ 23 апреля 2020

Сервер git, который я клонирую, не поддерживает мелкий процесс. Когда я пытаюсь сделать это, я получаю следующую ошибку:

fatal: Server does not support --shallow-since

Я не против использовать git clone -depth=N, но как я могу определить N для моего коммита?

1 Ответ

1 голос
/ 24 апреля 2020

Технически они различны:

  • --shallow-since=<em>date</em> получает коммиты, отметка времени фиксации которых позже (и, возможно, равна жестким aries границ) заданной отметки времени;
  • --depth=<em>number</em> получает коммиты, чья глубина счета из имен (имена веток, имена тегов и любые другие имена, которые вы скажете Git использовать) находится в пределах заданного количества шагов.

То есть рассмотрим хранилище Git со следующими коммитами:

A--B--C   <-- master
    \
     D--E--F--G   <-- develop

Предположим, что даты для C, E, F и G все в этом году и A, B и D - все в предыдущем году. Если вы сделаете:

git clone --shallow-since=<this year> --no-single-branch

, вы получите коммиты C и E-F-G, например:

...--C   <-- origin/master

...--E--F--G  <-- origin/develop

Однако, если вы сделаете:

git clone --depth=2 --no-single-branch you will get:

...--B--C   <-- origin/master

...--F--G   <-- origin/develop

т.е. два коммита от каждого имени. (Нет связи между G и B, так как для этого требуется вернуться на четыре шага назад от G, чтобы достичь D, и мы сказали Git отключить вещи после двух шагов.)

Поскольку --depth разрешает --single-branch по умолчанию, эта особенность имеет тенденцию скрываться: если вы только говорите своему клону, чтобы он сделал origin/master, не имеет значения, будет ли на той же глубине применяется друг к другу имя тоже. Добавление опции --no-single-branch делает разницу намного яснее.

В любом случае, если у вас нет прямого доступа к серверу, очевидным способом вычисления глубины является полное заполнение (но, необязательно, single-branch) clone, затем проверьте даты коммиттера в репозитории, который вы теперь имеете локально. Затем вы можете посчитать ревизии с последней даты, которую вы хотите, до подсказки ветки, которая сообщает вам, сколько коммитов клонировано.

Конечно, к этому времени у вас есть полный клон, так что вы можете также просто используйте его.

Реальная альтернатива - сделать начальный клон с некоторым фиксированным --depth. Затем проверьте метку времени коммиттера самого раннего коммита. Если эта дата наступает после вашего отсечения, используйте git fetch --deepen (или --depth снова), чтобы углубить мелкий клон. Повторяйте проверку и углубление до тех пор, пока хранилище не станет достаточно глубоким.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...