2016-12-08 2 views
1

Можно ли использовать один URL-адрес субмодуля на одной машине, но использовать другой URL-адрес подмодуля, когда на другом?Использовать разные URL-адреса подмодуля git на разных машинах

Предположим, у меня есть одна машина, которая имеет аутентифицированный SSH-доступ к репозиторию git на центральном сервере и другой машине, которая не имеет доступа к этому серверу. На аутентифицированной машине я использовал git-daemon для обмена репозиториями с моей машиной, не прошедшей проверку подлинности.

Проблема заключается в том, что клонированный репозиторий имеет несколько зависимостей подмодулей, все из которых являются репозиториями на сервере, для которых требуется аутентифицированный доступ к SSH. В этом случае, у меня есть все подмодулями, хранящиеся на моей машине с проверкой подлинности, так что я могу просто обновить файл .gitmodules от:

[submodule "@sub-a"] 
    url = ssh://<authenticated-url>/<repo> 
    branch = master 

к ...

[submodule "@sub-a"] 
    url = git://<ip-of-authenticated-machine>/<repo> 
    branch = master 

Затем работает git submodule sync и git submodule update --init -r будет получать подмодули непосредственно с моей аутентифицированной машины, а не с сервера.

Мой вопрос в этом, есть ли какой-либо переносной способ сделать это, чтобы я мог свободно перемещаться между машинами и ожидать правильного поведения git-submodule?

ответ

0

Будет ли он считать переносным, если он поставляется с инструкциями?

Возможно, ваш подмодуль в .gitmodules указывает на локальный каталог, например url = ../submodule. Основной репозиторий будет содержать этот путь (тот же для двух машин), но они бы клонировали что-то еще в их соответствующие каталоги submodule, созданные в том же каталоге, что и клон основного репо. Обновление подмодуля, по-видимому, должно выполняться в два этапа: нормальная выборка с сервера на submodule, а затем submodule update от локального клона до основного модуля.

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

Edit: как идентифицировано IrLED в their answerurl в .git/config переопределениях что .gitmodules (see here) и является локальным для каждого клона (не отслеживается, не связан с коммита), так что делает его идеальным решением. Изменение может быть выполнено после (нерекурсивного) клона основного репо и до submodule update. Все кредиты есть!

+0

Не совсем то, что я надеялся, но это определенно может работать. –

+0

Давайте посмотрим, будет ли это привлекать больше ответов, кто-то может доказать, что я ошибаюсь. –

4

Свойства субмодуля можно изменить в .git/config. В вашем случае вы можете изменить url от [submodule "<name>"]. Имейте в виду, что эти свойства не выживут git submodule deinit, git submodule sync
Подробное

git submodule deinit  # deinitialize submodule, relevant section in .git/config will be removed 
rm -fdr .git/modules/ # clear submodules' local repos 
git submodule init  # relevant section will be copied (partially) from .gitmodules to .git/config 
...      #Edit .git/config with new url for submodule 
git submodule update  # submodule will be updated from new url. 
+1

Я действительно пробовал это, но все мои команды 'git' все еще пытаются найти репо на старом' url'. Можете ли вы уточнить точную форму модификации и последующие обновления подмодулей, пожалуйста? –

+1

Запустите 'git subodule deinit', чтобы деинициализировать подмодуль, соответствующий раздел в'.git/config' будет удалена. 'rm -fdr .git/modules /' - локальные репозиции ясных подмодулей. 'git subodule init' - соответствующий раздел будет скопирован (частично) из' .gitmodules' в '.git/config'. Отредактируйте '.git/config' с новым url для подмодуля. Запустить 'git subodule update' - подмодуль будет обновляться с нового URL-адреса. – IrLED

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