2009-05-27 4 views
477

Я создал репозиторий git с субмодулем в нем. Я могу сказать, что сам подмодуль изменил путь удаленного репозитория, но я не уверен, как сообщить родительскому репозиторию, как изменить путь удаленного репозитория для подмодуля.Изменение удаленного хранилища для подмодуля git

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

ответ

711

Вы должны просто изменить файл .gitmodules для обновления URL-адреса, а затем запустить git submodule sync, чтобы отразить это изменение в суперпроекте и вашей рабочей копии.

+1

Что аффект должен мерзавец подмодуль синхронизации есть? Я делаю это неправильно в http://gist.github.com/120723, или я ошибаюсь в ожидании изменения .git/config с помощью синхронизации подмодулей git? –

+16

Это, похоже, не обновляет .git/config, по крайней мере, в 1.7.1 или 1.7.3. – notJim

+5

Он обновил '.git/config' для меня, у меня есть git 1.7.5.4. – mxcl

52

На самом деле, патч has been submitted in April 2009 для уточнения gitmodule роль.

Так что теперь gitmodule documentation еще не включают в себя:

.gitmodules файл, расположенный в каталоге верхнего уровня рабочего дерева мерзавца, представляет собой текстовый файл с синтаксисом, соответствующим требованиям -of linkgit: git-config 1.
[NEW]:
Поскольку этот файл управляется Git, он отслеживает + записи субмодулей проекта.
Информация, хранящаяся в этом файле, используется в качестве подсказки, чтобы заполнить авторитетную версию записи, хранящуюся в файле конфигурации проекта.
Изменения в пользовательской записи (например, для учета различий в URL-адресах подмодулей из-за сетевых ситуаций) должны быть внесены в файл конфигурации , в то время как изменения записи, подлежащие распространению (например, + из-за перемещения источника субмодуля), должны быть сделаны к этому файлу.

Это почти все подтвердите Jim's answer.


Если следовать этой git submodule tutorial, вы видите, вам нужно «git submodule init», чтобы добавить репозиторий подмодуль URL-адреса в .git/конфигурации.

«git submodule sync» имеет been added in August 2008 именно для упрощения этой задачи при изменении URL-адреса (особенно если важно количество подмодулей).
ассоциированный скрипт с этой командой достаточно прост:

module_list "[email protected]" | 
while read mode sha1 stage path 
do 
    name=$(module_name "$path") 
    url=$(git config -f .gitmodules --get submodule."$name".url) 
    if test -e "$path"/.git 
    then 
    (
     unset GIT_DIR 
     cd "$path" 
     remote=$(get_default_remote) 
     say "Synchronizing submodule url for '$name'" 
     git config remote."$remote".url "$url" 
    ) 
    fi 
done 

Цель остается: git config remote."$remote".url "$url"

+0

Я хотел изменить URL подмодуля только на этом компьютере. Из родительского проекта я могу изменить запись в '.git/config', выполнив:' git config submodule. '$ Submodule_name ".url" $ new_url " ', который [также описан здесь] (http: // stackoverflow. ком/а/928539/99777). – joeytwiddle

8

Просто измените .git/конфигурационный файл. Например; если у вас есть «общий» подмодуль вы можете сделать это в супер-модуль:

git config submodule.common.url /data/my_local_common 
56

То, что работало для меня (на Windows, используя мерзавец версии 1.8.3.msysgit.0):

  • Обновление .gitmodules с путём к новому репозиторию
  • Удалите соответствующую строку из раздела ".мерзавец/конфигурация «файл
  • Удалите соответствующий каталог в» .git/модулях/внешний»каталог
  • Удалить сам извлеченную каталог подмодуль (неуверенную, если это необходимо)
  • Run git submodule init и git submodule update
  • Убедитесь, что вычисленный подмодуль находится в правильном фиксации, и зафиксируйте это, так как вполне вероятно, что хеш будет отличаться.

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

+2

Большое вам спасибо за это. Это единственный, который работал для меня после того, как я уже запускал обновление god subodule. Следуя другим ответам, не изменилось бы то, что было в директории './Git/modules/external', поэтому попытка обновления приведет к тому, что он потянет неправильный URL-адрес. – NtscCobalt

+0

это кажется немного опасным, и я не уверен, что он сохраняет историю предыдущего подмодуля. Если, например, вы хотите проверить старый фиксатор или ветвь вашего основного хранилища (тот, который содержит подмодуль), я не уверен, что он будет знать, что нужно подключить OLD-подмодуль, связанный с этим старым фиксатором основного , –

+0

Нет, это почти наверняка не узнает - вам придется делать все шаги после первого. Это именно то, что я нашел, работая над тем, чтобы подтолкнуть текущее состояние подмодуля. Я не знаю, изменилось ли состояние вещей с тех пор, как я это написал, ум :) –

71

Эти команды будут выполнять работу в командной строке без изменения каких-либо файлов на локальном хранилище

git config --file=.gitmodules submodule.Submod.url https://github.com/username/ABC.git 
git config --file=.gitmodules submodule.Submod.branch Development 
git submodule sync 
git submodule update --init --recursive --remote 

Пожалуйста, смотрите на блоге для скриншотов: Changing GIT submodules URL/Branch to other URL/branch of same repository

+4

Это сработало но я должен был помнить, чтобы направить изменения на пульт. 'git add .gitmodules'' git commit -m "измененный URL-адрес подмодуля" '' git push origin master' – skulz00

+0

Спасибо за обновление. Я забыл включить команду git add/commit/push. –

+2

Ну, это создало для меня ужасный беспорядок. Команды спускались тихо, но реальный репозиторий подмодулей по-прежнему считает, что его удаленный старый (старый URL). Может быть, эти команды должны сопровождаться другими командами в репозитории подмодуля? –

3

git config --file=.gitmodules -e открывает редактор по умолчанию, в котором вы можете обновить путь

19

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

Отредактируйте файл, либо с помощью команды мерзавца или непосредственно:

git config --file=.gitmodules -e 

или просто:

vim .gitmodules 

затем пересинхронизироваться и обновление:

git submodule sync 
git submodule update --init --recursive --remote 
Смежные вопросы