2014-01-27 2 views
3

При использовании git submodule на Linux у меня может быть .gitmodules с одной или несколькими подсистемами, извлеченными из, например, /mnt/gitrepos/subsystem1.git (центральный доступ на основе файлов).Подмодуль Git для Linux и Windows

[submodule "subsystem1"] 
    path = subsystem11 
    url = /mnt/gitrepos/subsystem1.git/ 

Я хотел бы поддержать и пользователь Windows, который может получить доступ к такому же модулю репо с H:/gitrepos/subsystem1.git/.

Это, например, доля Samba от Linux /mnt/gitrepos/ как доля gitrepos.

Есть ли способ, которым Git может обрабатывать URL-строку в зависимости от ОС? Для Windows .gitmodules будет

[submodule "subsystem1"] 
    path = subsystem11 
    url = H:/gitrepos/subsystem1.git/ 

Таким образом, я хотел бы «что-то вроде» этого общего кода для .gitmodules (спекулятивный синтаксис):

[submodule "subsystem1"] 
    path = subsystem11 
    if Linux 
    url = /mnt/gitrepos/subsystem1.git/ 
    else 
    url = H:/gitrepos/subsystem1.git/ 

ответ

8

No. Подмодули, как правило, предназначены для одного репозитория URL, который работает везде, как правило, на базе сети (например, git://host/path). Механизм предоставления нескольких разных URL-адресов для одного репозитория отсутствует.

Это говорит о том, что Git позволяет настраивать URL-адрес субмодуля. Когда подмодули инициализируются (git submodule init), URL-адрес от .gitmodules копируется в ваш файл .git/config. Теперь вы можете редактировать URL-адреса там до запуска git submodule update.

+0

Именно поэтому для подмодулей существует двухступенчатая инициализация, позволяющая изменять URL-адрес в локальном репозитории до фактического клонирования подмодуля. – Abizern

+0

Ницца! Очень хорошее объяснение. Я могу добавить сценарий конвертера между «git subodule init» и «git subodule update --recursive», –

0

Обходное решение, которое я рассмотрел (но не пробовал), заключается в инициализации базы подмодулей («подсистема1.git» в вашем примере) в качестве независимого локального репозитория. Добавьте в подмодуль «удаленный», который указывает на независимую локальную версию репозитория. Также добавьте «удаленный» в неремодулярную (независимую, локальную) версию вашего подсистемного репозитория, которая указывает на версию подмодуля. Затем вы можете использовать Samba/Windows/Linux для обновления независимой (не подмодульной) версии подсистемы1.git, а затем «git fetch independent» изнутри подмодуля, чтобы скопировать код из репозитория без подмодулей в субмодульный репозиторий.

В конце концов, ваша структура каталогов должна выглядеть примерно так:

/mnt/gitrepos/ 
/mnt/gitrepos/subsystem1.git/ 
/mnt/subsystem1.git/ 

пультов ДУ в каждом из этих хранилищ будет выглядеть следующим образом:

/mnt/gitrepos/.git/config would have one remote block: 
    [remote "origin"] (points to your main, non-local repository) 
/mnt/subsystem1.git/.git/config would have two remote blocks: 
    [remote "origin"] (points to your main, non-local repository) 
    [remote "local_origin"] (points to /mnt/gitrepos/subsystem1.git) 
/mnt/gitrepos/.git/modules/subsystem1.git/config would also have two remote blocks: 
    [remote "origin"] (points to your main, non-local repository) 
    [remote "independent"] (points to /mnt/subsystem1.git) 

Синхронизация код вашего подмодуль с, что на удаленный сервер становится многоступенчатым процессом, так как вы должны использовать «независимый» репозиторий в качестве промежуточной области репозитория/промежуточной области.

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

Смежные вопросы