Як замінити підмодуль git іншим репо?


96

Як замінити підмодуль git на інший git repo?

Зокрема, у мене є підмодуль:

  • розташований у ./ExternalFrameworks/TestFrameworkцих точках на git repogit@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.

Відповіді:


123

Якщо розташування (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-адресу після цього. Будь-які ідеї чому?
Арн

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 docs ...
acannon828

1
Згодом мені довелося cd перейти до каталогу модуля, git перевірити потрібну гілку, потім 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

і ви отримаєте підмодуль завантажений на очікуваний шлях.


2
Хоча цей спосіб і працює, він не настільки чистий, як метод Тіма.
joseph.hainline

4
Це працювало для мене, але мені також довелося видалити .git/modules/<path_to_submodule>.
Нейт

1
Оцініть посилання на --name. Мені не було відомо про проблеми, пов'язані з цим, і я не зміг замінити підмодуль, поки не скористався цим варіантом (завдяки вашій відповіді).
aknuds1

Це стало єдиним методом, який працював на мене, проте я хотів зберегти те саме ім'я каталогу. Він здійснив перевірку правильного шляху і зробив ім'я модуля потрібним іменем, але ім'ям робочої каталоги було нове ім'я репо. Тож якщо ви хочете те саме ім’я, вам потрібно також вказати, що наприкінці URL так: git submodule add --name old-name-to-keep git@github.com:userB/new-repository.git old-name-to-keep
rgb

8

Ці команди будуть виконувати роботу в командному рядку без зміни файлів у локальному сховищі.

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 repo (а не підмодуля), run

rm -rf .git/modules/yourmodule

Тоді ви зможете додати як звичайне.



2

Якщо ви хочете змінити віддалену URL-адресу лише для цього клону :

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

Це не вплине на .gitmodulesфайл у батьківському проекті, тому його не поширюватимуть на інші розробники.

Це описується як «користувач конкретної записи змін» тут .

Не запускайте,git submodule syncоскільки це знову скине URL-адресу за замовчуванням.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.