Поделитесь рабочим деревом с подмодулями git - PullRequest
5 голосов
/ 06 декабря 2010

Предположим, у меня есть библиотека Common, которая может использоваться автономно и используется проектами P1 и P2, поэтому желаемое дерево выглядит как

/Common/.git
        ...
/P1/.git
    .gitmodules  # points to remote server
    Common/
    ...
/P2/.git
    .gitmodules  # points to remote server
    Common/
    ...

Когда я изменяю /Common, я бы хотел проверить его, используя P1 и P2 перед фиксацией. При обычном наборе команд git submodule мне нужно было бы зафиксировать с /Common, нажать на удаленный, а затем вытащить с обоих /P1/Common и /P2/Common. Если коммит что-то нарушает, он не может быть изменен, потому что плохое изменение уже опубликовано. Кроме того, я мог бы git remote add quicktest /Common из /P?/Common, чтобы иметь возможность вытащить, не касаясь удаленного сервера. Но у этого есть много возможностей для несогласованности, и это грязно, чтобы убрать поврежденные коммиты из /P?/Common, чтобы они могли быть исправлены в /Common.

Я бы предпочел, чтобы во время разработки рабочее дерево из /Common использовалось P1 и P2, но я не могу сделать /P1/Common символической ссылкой на /Common, потому что git submodule распознает символическая ссылка отличается от каталога. Жесткие ссылки на каталоги не разрешены большинством файловых систем. Я могу жестко связать все файлы, используя

rm -rf /P1/Common
cp -rl /Common /P1/Common

, который работает достаточно хорошо, пока новый файл не будет добавлен к /Common, и в этом случае этот процесс необходимо повторить. Есть ли элегантный способ для обоих

  1. продолжает работать git clone --recursive git://remote/P1.git для конечного пользователя и
  2. Позвольте мне легко проверить, что изменения в /Common работают с P1 и P2?

Ответы [ 2 ]

0 голосов
/ 23 июня 2017

Попробуйте функцию git worktree начиная с git 2.5.

  1. Удалить /P1/Common
  2. кд /Common
  3. Создать P1 ветку для предстоящего /P1/Common рабочего дерева
  4. пробег git worktree add ../P1/Common P1

Сделайте то же самое на /P2.

Тогда /P1/Common, /P2/Common and / Common working trees share the same repository / Common / .git`.

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

P.S. вы все еще можете использовать команду git submodule для ежедневной работы с этой функцией git worktree.

0 голосов
/ 06 декабря 2010

Я бы предпочел установить промежуточное голое репо, где:

  • push Common новые коммиты
  • тянуть из-за P1/Common и P2/Common

По крайней мере, если коммиты будут исправлены / удалены позже, это промежуточное репо никогда не публиковалось снаружи, и вы все еще можете сбросить подмодули P1/Common и P2/Common к этому промежуточному репо.

...