Переименуйте подмодуль git

Есть ли простой способ переименовать каталог подмодуля git (кроме прохождения всего движения удаления его и повторного добавления его с новым назначением имя).

И пока мы на нем, почему я просто не могу сделать следующее в родительском каталоге: git mv old-submodule-name new-submodule-name

Ответ 1

Я нашел следующий рабочий процесс:

  • Обновить .gitmodules
  • mv oldpath newpath
  • git rm oldpath
  • git add newpath
  • git submodule sync

Ответ 2

Git1.8.5 (октябрь 2013 г.) должен упростить процесс. Просто выполните:

git mv A B

"git mv A B", при перемещении подмодуля A учили перемещать свое рабочее дерево и настраивать пути в файле .gitmodules.


Подробнее в commit 0656781fadca1:

В настоящее время использование "git mv" на подмодуле перемещает дерево работы подмодуля в дереве суперпроекта. Но настройка пути подмодуля в .gitmodules остается нетронутой, что теперь несовместимо с деревом работы и делает команды git, которые полагаются на правильные path -> name mapping (например, status и diff), ведут себя странно.

Пусть "git mv" помогает здесь не только перемещать дерево работы подмодуля, но также обновлять параметр "submodule.<submodule name>.path" из файла .gitmodules и ставить оба.
Этого не происходит, когда не найден файл .gitmodules и выдается предупреждение, если у него нет раздела для этого подмодуля. Это связано с тем, что пользователь может просто использовать простые gitlinks без файла .gitmodules или уже обновил настройку пути вручную перед выдачей команды "git mv" (в этом случае предупреждение напоминает ему, что mv что для него).
Только когда .gitmodules найден и содержит конфликты слияния, команда mv завершится с ошибкой и попросит пользователя разрешить конфликт, прежде чем повторять попытку.


git 2.9 (Июнь 2016) улучшит git mv для подмодуля:

См. commit a127331 (19 апреля 2016 г.) Стефан Беллер (stefanbeller).
(слияние Junio ​​C Hamano - gitster - в commit 9cb50a3, 29 апреля 2016 г.

mv: разрешить перемещение вложенных подмодулей

"git mv old new" не отредактировал путь для подмодуля, который правильно работает в подкаталоге внутри каталога old/.

Подкатегории

однако, должны обновить свою ссылку в каталоге git, как а также обновления файла .gitmodules.

Ответ 3

$ mv submodule-oldpath submodule-newpath
$ git rm submodule-oldpath
$ git add submodule-newpath
$ git submodule sync

Это решение не работает для меня, потому что при использовании команды git add, подмодуль был включен в проект как простой каталог, а не как подмодуль.

правильное решение:

$ mv submodule-oldpath ~/another-location
$ git rm submodule-oldpath
$ git submodule add submodule-repository-URL submodule-newpath

Источник: http://bcachet.github.io/development/2012/05/25/rename-git-submodule/

Ответ 4

Я просто попробовал несколько из предложенных выше. Я бегу:

$ git --version
git version 1.8.4

Я нашел, что лучше всего де-инициализировать подмодуль, удалить каталог и создать новый подмодуль.

git submodule deinit <submodule name>

git rm <submodule folder name>

git submodule add <address to remote git repo> <new folder name>

По крайней мере, это то, что сработало для меня лучше всего. YMMV!

Ответ 5

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

Думаю, вам может понадобиться сделать git submodule sync после этого, но я не могу сейчас проверить.

Ответ 6

Невозможно переименовать его, поэтому сначала нужно удалить его (deinit) и добавить его снова.

Итак, удалив его:

git submodule deinit <path>
git rm --cached <path>

вы также можете дважды проверить и удалить ссылки на него в:

  • .gitmodules
  • .git/config
  • удалить ссылочную папку из .git/modules/<name> (лучше всего сделать резервную копию), так как каждая папка имеет файл config, где хранится ссылка на ее worktree

затем выполните свои изменения, внеся любые изменения в свое репо:

git commit -am 'Removing submodule.'

и дважды проверьте, нет ли у вас каких-либо нерешенных проблем:

git submodule update
git submodule sync
git submodule status

теперь вы можете снова добавить подмодуль git:

git submodule add --name <custom_name> [email protected]:foo/bar.git <my/path>