Как изменить удаленный репозиторий для подмодуля git?

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

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

9 ответов

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

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

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

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

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


Если вы будете следовать этому учебнику по подмодулям git, вы увидите, что вам нужно "git submodule initmsgstr "добавить 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"

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

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/ ветку того же репозитория

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

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

git config --file=.gitmodules -e

или просто:

vim .gitmodules

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

git submodule sync
git submodule update --init --recursive --remote

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

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

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

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

git config submodule.common.url /data/my_local_common

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

Подход грубой силы:

  • обновить файл в супермодуле, чтобы он указывал на новый URL-адрес подмодуля,
  • добавить и зафиксировать изменения в supermodule/.gitmodules,
  • создайте новый клон супермодуля в другом месте на вашем компьютере (убедитесь, что последние изменения в .gitmodules файл отражается в клоне),
  • измените свой рабочий каталог на новый клон супермодуля,
  • запустить git submodule update --init --remote path-to-submodule на подмодуле,

и вуаля! Подмодуль в новом клоне супермодуля настроен правильно!

Многие люди (как здесь, так и в Интернете в целом) предлагают решения, требующие ручного редактирования или удаления нескольких файлов. Но это действительно не нужно!

Даже в средах, где Git 2.25 (и поэтому git submodule set-url <path> <newurl>) недоступны, самое простое решение - просто "отменить регистрацию" подмодуля и добавить его снова с новым URL-адресом.

В зависимости от версии Git и настройки подмодуля вам может потребоваться вручную удалить <path>прежде чем добавить его снова. Никаких других ручных действий не требуется!

      git submodule deinit <path>
rm -rf <path>
git submodule add <repository> [<path>]

После этого .gitmodulesфайл будет иметь другой URL и должен быть зафиксирован. Все остальные места (конфигурация, рабочее дерево) уже обработаны git.

Чтобы объяснить, что deinit есть, я хотел бы процитировать руководство Git:

deinit [-f|--force] (--all|[--] <path>…​)

Отменить регистрацию данных подмодулей, т.е. удалить все submodule.$name раздел из .git / config вместе с деревом их работы. Дальнейшие вызовы [..] будут пропускать любые незарегистрированные подмодули, пока они не будут снова инициализированы.

Другие вопросы по тегам