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


156

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

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


6
Вам больше не нужно обновлять .gitmodulesвручную при перемещении подмодуля. см. мой ответ ниже
VonC

@ Ответ VonC сработал для меня как обаяние
лаконбас

Модули Git слишком сложны. npmпоказывает, как просто работает. Однажды ... может быть ... кто-то ... перепишет это ... а тем временем ...
Рольф

Ответ @ VonC не является полной историей на сегодняшний день: он действительно изменит .gitmodules, но просто переименует путь, а не имя модуля. Вам нужно дополнительное редактирование .gitmodules, чтобы исправить это, и 'git submodule sync', чтобы завершить весь процесс
zertyz

@zertyz: свойство [submodule "name_of_submodule"] является внутренним именем Git, его можно переименовать, чтобы не вводить себя в заблуждение, но это всего лишь ярлык.
MKesper

Ответы:


101

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

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

Примечание: этот подход не обновляет индекс и .gitmodules должным образом в версиях GIT 2018 года.

Примечание: Вы можете быть в состоянии теперь просто сделать git mv oldpath newpathсейчас, как указано в VonC «s ответ . (Убедитесь, что вы используете последнюю версию git)


22
примечание к себе: для git add newpathне используйте косую черту
atomicules

10
При таком рабочем процессе вы создадите только символическую ссылку на подкаталог, который вы используете в качестве подмодуля. Symlink - это только часть глобальной функциональности субмодуля. Это означает, что когда вы клонируете репозиторий, использующий переименованные подмодули, вы можете завершиться следующей ошибкой: в .gitmodules для пути 'your-oldpath' не найдено сопоставление подмодулей После удаления oldpath (* git rm oldpath ) вы должны использование подмодуль git add REPO-URL newpath вместо «git add newpath *». Когда это будет сделано, состояние git будет отображаться примерно так: renamed: oldpath -> newpath
Bertrand

5
Это решение не работает для меня, потому что при использовании команды git add подмодуль был включен в проект как простой каталог, а не как подмодуль. попробуйте $ mv submodule-oldpath ~ / another-location $ git rm submodule-oldpath $ git submodule добавить субмодуль-репозиторий-URL-адрес submodule-newpath bcachet.github.io/development/2012/05/25/rename-git-submodule
Mahmoud Адам

3
Если у вас есть проблема с рабочим деревом, вы также можете отредактировать .git/modules/SUBMODULE/configфайл так, чтобы он worktreeснова указывал на правильный каталог.
Винсент Кетелаарс

3
Это не работает для меня с мерзавцем 2.13.1. Но просто работа git mv old newработает как шарм. Мне нужно только сделать git commit для завершения изменений.
пользователь

226

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

git mv A B

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


Подробнее в коммите 0656781fadca1 :

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

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


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

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

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

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

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


Примечание для себя: попробуйте это на 1.8.4, и вы будете иметь fatal: source directory is empty, source=my_source, destination=my_destination. Попробуем это снова, когда у 1.8.5 будет стабильный выпуск.
контрольная сумма

@checksum Но 1.8.5 имеет стабильную версию, по крайней мере, несколько ... часов;) github.com/git/git/releases/tag/v1.8.5
VonC

Мне пришлось собрать версию Git 1.8.5.GIT из исходного кода, потому что в репозиториях Ubuntu есть Git v.1.7.5. Как собрать Git из исходного кода
Максим Дмитриев

2
@MaksimDmitriev, а как насчет ppa (личного пакета архивов), о котором я упоминал в stackoverflow.com/a/20918469/6309 ?
VonC

2
git mv просто не работает для этого на моей машине.
Александр Дягилев

13

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

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

Источник: переименовать подмодуль git


2
Ты вытащил это слово в слово из этого места? bcachet.github.io/development/2012/05/25/rename-git-submodule Если это так, пожалуйста, не забудьте указать ссылку на этот сайт в своем ответе.
Джордж Стокер

11

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

$ 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!


7

Переименовать его невозможно, поэтому сначала вы должны удалить его ( 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> git@github.com:foo/bar.git <my/path>

и это на самом деле сегодня
Алексей

Название вопросов - это неправильное название, оно относится к пути, а не к имени
Макс Роббертзе

3

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

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


Это заставляет новое имя подмодуля появляться как новый коммит, а не как переименование. Но, может быть, так оно и должно быть?
Ларс Такманн

1
@Lars: Обязательно удалите старый каталог подмодулей!
Каскабель

3

MacOs : когда я хочу использовать решение VonC, чтобы изменить папку субмодуля Commonв нижний регистр:

git mv Common common

я получил

fatal: переименование Common не удалось: неверный аргумент

Решение - используйте какое-нибудь временное имя папки и переместите дважды:

git mv Common commontemp
git mv commontemp common

Вот и все :)

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.