Ответ 1
Я нашел следующий рабочий процесс:
- Обновить .gitmodules
-
mv oldpath newpath
-
git rm oldpath
-
git add newpath
-
git submodule sync
Есть ли простой способ переименовать каталог подмодуля git (кроме прохождения всего движения удаления его и повторного добавления его с новым назначением имя).
И пока мы на нем, почему я просто не могу сделать следующее в родительском каталоге: git mv old-submodule-name new-submodule-name
Я нашел следующий рабочий процесс:
mv oldpath newpath
git rm oldpath
git add newpath
git submodule sync
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
.
$ 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/
Я просто попробовал несколько из предложенных выше. Я бегу:
$ 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!
Отредактируйте файл .gitmodules, чтобы переименовать подмодуль, а затем переименуйте каталог подмодулей.
Думаю, вам может понадобиться сделать git submodule sync
после этого, но я не могу сейчас проверить.
Невозможно переименовать его, поэтому сначала нужно удалить его (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>