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

724

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

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

Эндрю Гримм
источник
8
Примечание: Git 2.25 (Q1 2020) поставляется с новой командой ":git submodule set-url [--] <path> <newurl>
VonC

Ответы:

1010

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

Джим Пульс
источник
22
Похоже, это не обновляет .git / config, по крайней мере, в 1.7.1 или 1.7.3.
Давидтбернал
6
это также обновляет конфигурацию URL субмодуля для предыдущих коммитов? Например, если я извлечу старый коммит, он будет указывать на новые субмодули?
maxmelbin
64
Используйте, git submodule foreach -q git config remote.origin.urlчтобы увидеть «фактические» URL-адреса подмодулей
Джоэл Пурра
10
Он не обновлялся .git/configдля меня, используя git 2.1.0. Мне пришлось обновить оба .gitmodulesи .git/configвручную перед запуском, чтобы обновить git submodule sync --recursiveмой подмодуль.
desseim
7
Похоже, что отсутствует ключевой шаг, git submodule update --init --recursive --remoteкоторый фактически меняет хранилище на новый пульт
Джейсон Аксельсон
155

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

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

Паван Сокке Нагарадж
источник
8
Это сработало, но я должен был вспомнить изменения в пульте. git add .gitmodules git commit -m "modified submodule URL" git push origin master
skulz00
5
Ну, это создало ужасный беспорядок для меня. Команды тихо отключались, но реальное хранилище субмодулей все еще думает, что его удаленным является старый (старый URL). Может быть, эти команды должны сопровождаться другими командами в хранилище подмодуля?
Мотти Шнеор
5
Последняя команда немного экстремальна ... Если у вас есть субмодули с субмодулями внутри, это также удаленно обновит субмодули, что вряд ли вам нужно.
Баптист Вихт
7
Обратите внимание, что вам нужно заменить Submod на имя вашего подмодуля!
Шиталь Шах
133

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

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

git config --file=.gitmodules -e

или просто:

vim .gitmodules

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

git submodule sync
git submodule update --init --recursive --remote
Мэтью Уилкоксон
источник
6
git submodule update --initработал для меня, --remoteкажется, привязать его к голове удаленного репо.
Хаим Элия
96

С Git 2.25 (Q1 2020) вы можете изменить его.
См. " URL подмодуля Git изменен " и новая команда

git submodule set-url [--] <path> <newurl>

Оригинальный ответ (май 2009 г., десять лет назад)

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

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

.gitmodulesФайл, расположенный в каталоге верхнего уровня рабочего дерева мерзавца, представляет собой текстовый файл с синтаксисом , соответствующим с требованиями -of linkgit: ГИТ-конфигурация 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"

VonC
источник
Я хотел изменить URL подмодуля только на этом компьютере. Из родительского проекта я мог изменить запись .git/config, выполнив: git config submodule."$submodule_name".url "$new_url" это также описано здесь .
Joeytwiddle
Что делает необязательный двойной тире git submodule set-url [--] <path> <newurl>?
jeverling
1
@jeverling Они помогают отделить параметры от параметров: см. stackoverflow.com/a/1192194/6309
VonC
1
Обратите внимание, что для пользователей Ubuntu с более старой версией git вы можете использовать этот PPA для обновления: launchpad.net/~git-core/+archive/ubuntu/ppa
starbeamrainbowlabs
69

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

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

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

Бен Хаймерс
источник
2
Спасибо тебе большое за это. Это единственный, который работал для меня после того, как я уже запустил git submodule update. Следование другим ответам не изменило бы то, что было в ./git/modules/externalдиректории, поэтому попытка обновления привела бы к тому, что он все еще вытягивал бы неправильный URL.
NtscCobalt
это кажется немного опасным, и я не уверен, что это сохраняет историю предыдущего подмодуля. Если, например, вы хотите проверить старый коммит или ветвь вашего основного репозитория (тот, который содержит подмодуль), я не уверен, что он будет знать, чтобы подключить подмодуль OLD, связанный с этим старым коммитом основного ,
Мотти Шнеор
Нет, он почти наверняка не узнает - вам придется делать все шаги после первого снова. Это как раз то, что я нашел для работы с текущим состоянием подмодуля. Я не знаю, изменилось ли положение вещей с тех пор, как я написал это, запомните :)
Бен Хаймерс,
@MottiShneor это действительно опасно, если вам нужно сохранить предыдущую историю субмодулей, хотя я не уверен в этом. В моем случае это единственное решение, которое сработало, и я хотел в основном заменить оригинальный подмодуль своим собственным форком
arainone
1
Следуя этим шагам, вы обнаружили, что «Удалить сам извлеченный каталог субмодуля (не уверен, если это необходимо)» необходимо, иначе вы встретите «fatal: Not
the
10

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

git config submodule.common.url /data/my_local_common
FelipeC
источник
Это лучший способ, если вы пытаетесь изменить URL-адрес один раз, а не навсегда в супер-проекте. Например, вы хотите клонировать субмодули из локальных копий на диске.
Энди
4

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

Луго
источник