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

98

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

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

  • расположенный в ./ExternalFrameworks/TestFrameworkэтом месте, указывает на репозиторий gitgit@github.com:userA/TestFramework.git
  • Я хочу сейчас указать на это git@github.com:userB/TestFramework.git.

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

git submodule add git@github.com:userB/TestFramework.git

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

A git directory for 'ExternalFrameworks/TestFramework' is found locally with remote(s):
  origin    git@github.com:userA/TestFramework.git
If you want to reuse this local git directory instead of cloning again from
  git@github.com: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.
joseph.hainline
источник

Ответы:

125

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

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

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

Тим Хениган
источник
4
Также стоит отметить: когда другой пользователь (который уже инициировал подмодуль) получает ваше обновление, он также должен будет выполнить «синхронизацию подмодуля git» один раз, прежде чем новый подмодуль будет работать для него.
joseph.hainline
2
У меня это не сработало. После этого мой подмодуль все еще указывал на старый URL. Есть идеи, почему?
Arne
34
@Arne Возможно, ваш подмодуль не был правильно инициализирован. Мне пришлось, rm -rf .git/modules/<submodule>прежде чем это сработало для меня.
Дэвид Браун
@DavidBraun У меня та же проблема, что и у @Arne, хотя я делаю это git submodule syncпосле того, как rm -rf .git/modules/<submodule>дает fatal: Not a git repository: ../.git/modules/<submodule>. Какие-нибудь советы? Первоначально я создал подмодуль git submodule add https://<submodule-url>в соответствии с документами git ...
acannon828,
1
После этого мне пришлось записать cd в каталог модуля, git checkout нужную ветку, затем git pull.
Николас Рауль
34

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

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

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

Так введите:

git submodule add --name UpdatedTestFramework git@github.com:userB/TestFramework.git

и вы загрузите подмодуль по ожидаемому пути.

joseph.hainline
источник
2
Хотя этот способ действительно работает, он далеко не так чист, как метод Тима.
joseph.hainline
4
Это сработало для меня, но мне также пришлось удалить .git/modules/<path_to_submodule>.
Nate
1
Оцените ссылку на --name. Мне не было известно о проблемах, связанных с этим, и я не мог заменить подмодуль, пока не использовал эту опцию (спасибо за ваш ответ).
aknuds1 03
Это оказалось единственным методом, который работал у меня, однако я хотел сохранить то же имя каталога. Он проверил правильный путь и сделал имя модуля желаемым именем, но имя рабочего каталога было новым именем репо. Итак, если вам нужно такое же имя, вам также необходимо указать это в конце URL-адреса, например: git submodule add --name old-name-to-keep git@github.com:userB/new-repository.git old-name-to-keep
rgb
9

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

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
Паван Сокке Нагарадж
источник
5

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

rm -rf .git/modules/yourmodule

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

Hobberwickey
источник
3

Самый простой способ, который я нашел, - это:

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

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

DerZyklop
источник
2

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

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

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

Это описывается как «пользователь конкретной записи изменений» здесь .

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

Joeytwiddle
источник