Что не так при использовании git worktree с подмодулями git

Я недавно обнаружил git worktree команда:

Новый рабочий каталог связан с текущим репозиторием, разделяя все, кроме специфических для рабочего каталога файлов, таких как HEAD, index и т. Д.

Но документы также указывают

… Поддержка подмодулей не завершена. НЕ рекомендуется делать несколько проверок суперпроекта.

без дальнейшего объяснения того, что идет не так.

Может ли кто-нибудь рассказать мне о проблемах, которые стоит ожидать? Например, со мной все будет в порядке, если я буду использовать отдельные рабочие деревья, созданные таким образом, только для изменений, которые не влияют на подмодули?

1 ответ

Совершенно ясно, что коммит a83a66a:

git-submodule.sh надеется $GIT_DIR/config для каждого рабочего дерева, по крайней мере, для submodule.* part,
Здесь я думаю, что у нас есть два варианта:

  • либо обновить config.c также читать $GIT_DIR/config.worktree (что на рабочее дерево) в дополнение к $GIT_DIR/config (общий доступ) и хранить переменные, специфичные для рабочего дерева, в новом месте,
  • или обновить git-submodule.sh читать / писать submodule.* прямо из $GIT_DIR/config.submodule (на рабочее дерево).

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

В целом, где разместить эти подмодули?

Есть пара вариантов:

  • Вы можете сохранить $SUB репо в другом месте (возможно, в центральном месте) за пределами $SUPER, Это также верно для вложенных подмодулей, где суперпроект может быть подмодулем другого суперпроекта.
  • Вы можете сохранить все $SUB репо в $SUPER/modules (или какое-то другое место в $SUPER)
  • Мы могли бы даже продвинуть это дальше и объединить все $SUB репо в $SUPER вместо того, чтобы хранить их отдельно. Но для этого, по крайней мере, потребуется включить пространство имен ref.

Этот коммит был ответом на коммит df56607.


С точки зрения пользователя git это означает git submodule update --init --recursive не знает точно, где оформить заказ субмодулей.
Они дублируются на всех рабочих деревьях или они где-то централизованы? Это еще не указано формально.


Год спустя (и с git 2.9), clacke добавляет в комментариях

путаница была решена, но не оптимальным образом.
Насколько я вижу, субмодули работают нормально, но у каждого рабочего дерева есть свой набор репозиториев подмодулей (под motherrepo.git/worktree/<worktreename>/modules/<submodule> ), поэтому, если у вас большой подмодуль, вы столкнетесь с серьезным использованием диска.


Git псевдонимы для обработки подмодулей в поддеревьях:

Псевдоним git wtas ожидает, что git wta определяется глобально или, по крайней мере, для всех задействованных репо. Гарантия не включена. Ваш любимый питомец может заразиться болезненной инфекцией, если в ваших путевых именах есть пробелы.

Ожидается, что структура вашего репо будет такой же, как и в непроигрышном репо с инициированными подмодулями, поэтому, если у вас есть голое репо, вам придется подражать этой настройке. Подмодуль с именем (не путь) foo идет в <your-.git-directory>/modules/foo (не .../foo.git). Он не вылетит, если какой-либо модуль отсутствует в репо, он просто пропустит его.

Есть возможности для улучшения. Он не обрабатывает подмодули внутри подмодулей, он опускается только на один уровень ниже. Это может работать, чтобы просто изменить подмодуль git wta позвонить git wtas позвоните, но я еще не проверил это.

- clacke


Смотрите также git worktree move (с Git 2.17+, Q2 2018).

Другие вопросы по тегам