Подтвердить что ты не робот

Каковы различия между git clone --shared и --reference?

После прочтения документации я до сих пор не понимаю, что различия между --shared и --reference <repo>. Они кажутся похожими.

  • Каковы различия между --shared и --reference <repo> параметры

  • Могут ли они использоваться для экономии места на диске при создании нескольких локальных клонов другой локальный клон?

  • Может ли каждый локальный клон иметь другую ветвь?

Примечание: Я знаю, что я могу использовать несколько мелких клонов с усеченными истории, используя git clone --depth <depth>, но каждый клон все еще должен дублируйте хотя бы некоторую историю, чтобы сделать это, поэтому я был думая, что, возможно, это не самый оптимальный способ сэкономить место на диске (хотя это лучше ничего).

Фон

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

Однако мне не нужна вся история с каждым клоном, просто обновленные версии моих ветвей, поэтому я мог бы сэкономить много дисков чтобы каждый клон использовал теги, объекты фиксации, дерева и blob из оригинальный локальный клон (например, через символические ссылки для чего-то).

git clone документация

Я проверил документацию git clone, чтобы узнать, есть ли что-нибудь можно использовать.

--shared

Я видел, что есть опция --shared:

Когда репозиторий клонируется на локальном компьютере, вместо использования жесткого ссылки, автоматически настроить .git/objects/info/alternates для совместного использования объектов с исходным хранилищем. Результирующий репозиторий начинается без каких-либо объекта.

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

--reference <repository>

Затем я также увидел параметр --reference <repository>:

Если ссылочный репозиторий находится на локальном компьютере, автоматически настройте .git/objects/info/alternates для получения объектов из ссылки репозиторий. Использование уже существующего репозитория в качестве альтернативы потребует меньше объектов, подлежащих копированию из клонирования клонирования, сокращение сети и локальные затраты на хранение.

ПРИМЕЧАНИЕ: см. ПРИМЕЧАНИЕ для параметра --shared.

Это говорит о том, что это сократит локальные расходы на хранение, поэтому это может быть полезно хорошо.

4b9b3361

Ответ 1

Оба варианта обновляют .git/objects/info/alternates, чтобы указать на исходный репозиторий, что может быть опасно, поэтому предупреждающая записка присутствует в обеих вариантах документации.

Параметр --shared не копирует объекты в клон. Это основное отличие.

В --reference используется дополнительный параметр репозитория. Использование --reference по-прежнему копирует объекты в пункт назначения во время клонирования, однако вы указываете, что объекты копируются из существующего источника, когда они уже доступны в ссылочном репозитории. Это может сократить время сети и IO из исходного репозитория путем передачи пути к репозиторию на более быстром/локальном устройстве с помощью --reference

Смотрите сами

Создайте клон --shared и клон --reference. Подсчитайте объекты в каждом, используя git count-objects -v. Вы заметите, что общий клон не имеет объектов, а ссылочный клон имеет такое же количество объектов, что и источник. Кроме того, обратите внимание на разницу в размерах в вашей файловой системе. Если вы должны переместить источник и протестировать git log в общих и ссылочных репозиториях, журнал недоступен в общем клоне, но отлично работает в клон-ссылке.

Ответ 2

Ссылка в комментариях к вашему вопросу на самом деле является более ясным ответом: --reference подразумевает --shared. Точка --reference заключается в оптимизации сетевого ввода-вывода во время первоначального клонирования удаленного репозитория.

В отличие от вышеприведенного ответа, я обнаружил, что репозитории --shared и --reference - из одного источника - имеют одинаковый размер и оба имеют нулевые объекты. Конечно, если вы используете --reference для некоторого другого репозитория, который основан на общем источнике, размер и объекты будут отражать разницу между репозиториями. Примечание, что в обоих случаях мы не сохраняем место в дереве работ, только .git/objects.

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

Рабочий процесс по поддержанию оптимального использования дискового пространства после начального клона выглядит следующим образом:

  • источник тяги
  • источник repack
  • вытянуть вторичный
  • git gc во вторичном

Вероятно, лучше всего прочитать обсуждение в этом потоке.

Вы можете добавить альтернативу существующим репозиториям, поместив абсолютный путь в исходный каталог objects в secondary/.git/objects/info/alternates и запустив git gc (многие используют git repack -a -d -l, что выполняется git gc).

Вы можете удалить альтернативу, запустив git repack -a -d (no -l) во вторичном, а затем удалив строку из файла alternates. Как описано в потоке, возможно иметь несколько альтернатив.

Я сам так не использовал, поэтому не знаю, как с ошибкой управлять.