Как изменить удаленный репозиторий для подмодуля git?
Я создал репозиторий git с подмодулем в нем. Я могу сказать самому подмодулю изменить путь к удаленному репозиторию, но я не уверен, как сказать родительскому репозиторию, как изменить путь к удаленному репозиторию для подмодуля.
Я не удивлюсь, если мне не повезет, и мне придется что-то делать вручную, поскольку даже удаление подмодулей не так просто.
9 ответов
Вы должны просто иметь возможность редактировать .gitmodules
файл, чтобы обновить URL, а затем запустить git submodule sync
чтобы отразить это изменение в суперпроекте и вашей рабочей копии.
На самом деле, патч был представлен в апреле 2009 года для уточнения gitmodule
роль.
Так что теперь документация по gitmodule еще не включает:
.gitmodules
Файл, расположенный в каталоге верхнего уровня рабочего дерева git, представляет собой текстовый файл с синтаксисом, соответствующим требованиям -g linkgit: git-config 1.
[NEW]:
Поскольку этот файл управляется Git, он отслеживает + записи подмодулей проекта.
Информация, хранящаяся в этом файле, используется в качестве подсказки для заполнения официальной версии записи, хранящейся в файле конфигурации проекта.
В файл конфигурации необходимо внести изменения в записи, относящиеся к конкретному пользователю (например, чтобы учесть различия в URL-адресах субмодуля из-за сетевых ситуаций), а в этот файл следует внестиизменения записи (например, + из-за перемещения источника субмодуля).,
Это в значительной степени подтверждает ответ Джима.
Если вы будете следовать этому учебнику по подмодулям git, вы увидите, что вам нужно "git submodule init
msgstr "добавить 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 вместе с деревом их работы. Дальнейшие вызовы [..] будут пропускать любые незарегистрированные подмодули, пока они не будут снова инициализированы.