Как изменить удаленный репозиторий для подмодуля git? - PullRequest
619 голосов
/ 27 мая 2009

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

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

Ответы [ 7 ]

884 голосов
/ 27 мая 2009

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

121 голосов
/ 05 июня 2015

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

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

Пожалуйста, посмотрите в блоге скриншоты: Изменение URL / ветви субмодулей GIT на другой URL / ветку того же хранилища

88 голосов
/ 12 мая 2017

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

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

git config --file=.gitmodules -e

или просто:

vim .gitmodules

, затем выполните повторную синхронизацию и обновление:

git submodule sync
git submodule update --init --recursive --remote
64 голосов
/ 02 октября 2013

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

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

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

58 голосов
/ 27 мая 2009

На самом деле, патч был представлен в апреле 2009 года для уточнения роли gitmodule.

Так что теперь документация gitmodule еще не включает:

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

Это в значительной степени подтверждает ответ Джима .


Если вы будете следовать этому учебнику по подмодулям git , вы увидите, что вам нужно "git submodule init", чтобы добавить URL-адреса хранилища подмодулей в .git / config.

"git submodule sync" было добавлено в августе 2008 года именно для того, чтобы упростить эту задачу при изменении URL (особенно если важно количество подмодулей).
Связать скрипт с этой командой достаточно просто:

module_list "$@" |
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"

9 голосов
/ 30 мая 2009

Просто отредактируйте файл .git / config . Например; если у вас есть подмодуль "common" , вы можете сделать это в супермодуле:

git config submodule.common.url /data/my_local_common
3 голосов
/ 01 апреля 2017

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

...