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

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

В частности, у меня есть подмодуль:

  • расположенный в ./ExternalFrameworks/TestFramework, который указывает на git repo [email protected]:userA/TestFramework.git
  • Теперь я хотел бы указать на [email protected]:userB/TestFramework.git.

Проблема заключается в том, что когда я удаляю подмодуль с описанным способом здесь, затем повторно добавьте его с помощью команды

git submodule add [email protected]:userB/TestFramework.git

Я получаю эту ошибку:

A git directory for 'ExternalFrameworks/TestFramework' is found locally with remote(s):
  origin    [email protected]:userA/TestFramework.git
If you want to reuse this local git directory instead of cloning again from
  [email protected]:userB/TestFramework.git
use the '--force' option. If the local git directory is not the correct repo
or you are unsure what this means choose another name with the '--name' option.

Ответы

Ответ 1

Если местоположение (URL) подмодуля изменилось, то вы можете просто:

  1. Измените свой файл .gitmodule чтобы использовать новый URL
  2. Удалите папку субмодуля в rm -rf.git/modules/<submodule>
  3. Удалите папку субмодуля в рабочем каталоге rm -rf <submodule>
  4. Запустите git submodule sync
  5. Запустите git submodule update

Более полную информацию можно найти в другом месте:

Ответ 2

Сначала удалите текущий подмодуль с уже упомянутым методом здесь, который я включил для удобства:

  • Удалить соответствующий раздел из файла .gitmodules
  • Удалить соответствующий раздел из .git/config
  • Запустить git rm --cached path_to_submodule (без косой черты)
  • Зафиксировать и удалить файлы без поддерева подкачки

Теперь добавьте новый подмодуль с флагом --name. Это даст git альтернативное имя для ссылки в .git/config для подмодуля, чтобы деконфликт с подмодулем, который был там исторически, который вы все еще хотите работать в своей предыдущей истории.

Итак, тип:

git submodule add --name UpdatedTestFramework [email protected]:userB/TestFramework.git

и вы получите подмодуль, загруженный на путь, который вы ожидаете.

Ответ 3

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

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

Ответ 4

То, что исправлено для меня, было в корне вашего репозитория git (а не подмодуля), запустите

rm -rf .git/modules/yourmodule

Затем вы сможете добавить как обычно.

Ответ 5

Самый простой способ найти это:

git rm -rf [submodule_dir]
git submodule add --name new_[submodule_name] [new_submodule_url] [submodule_dir]

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

Ответ 6

Если вы хотите изменить удаленный URL только для этого клона:

git config submodule."$submodule_name".url "$new_url"

Это не повлияет на файл .gitmodules в родительском проекте, поэтому он не будет передаваться другим разработчикам.

Это описано как "пользовательские изменения записи" здесь.

Не запустите git submodule sync, так как это будет reset для URL по умолчанию.