Я хотел бы изменить имя каталога подмодуля Git в моем суперпроекте Git.
Предположим, у меня есть следующая запись в моем .gitmodules
файле:
[submodule ".emacs.d/vimpulse"]
path = .emacs.d/vimpulse
url = git://gitorious.org/vimpulse/vimpulse.git
Что мне нужно ввести, чтобы переместить .emacs.d/vimpulse
каталог, .emacs.d/vendor/vimpulse
не удаляя его сначала (объяснено
здесь и здесь ), а затем повторно добавить его.
Нужен ли Git весь путь в теге submodule?
[submodule ".emacs.d/vimpulse"]
или возможно также сохранить только название подпроекта?
[submodule "vimpulse"]
git
git-submodules
thisch
источник
источник
git mv
командой, прямо в вопросе.git mv
как это. Используйтеdeinit
тогдаrm
как указано stackoverflow.com/a/18892438/8047 .git mv
просто работает и для подмодулей, больше ничего не нужно.1.8.5
перемещение субмодулей поддерживается изначально с помощьюgit mv
команды ( из заметок о выпуске , сначала связанных с самим @thisch). Также здесь ответилиgit mv
перемещает подмодуль в рабочей области и корректно обновляет файлы .git подмодуля, но подпапка в папке .git / modules родительского репозитория остается прежней - это нормально? (Я использую Git 2.19.0 на Windows)Ответы:
Примечание: как упоминалось в комментариях, этот ответ относится к шагам, необходимым для более старых версий git. Git теперь имеет встроенную поддержку для перемещения подмодулей:
Процесс аналогичен удалению подмодуля (см. Как удалить подмодуль? ):
.gitmodules
и измените путь подмодуля соответствующим образом и поместите его в индекс с помощьюgit add .gitmodules
.mkdir -p new/parent
).mv -vi old/parent/submodule new/parent/submodule
).git add new/parent
).git rm --cached old/parent/submodule
..git/modules/old/parent/submodule
со всем его содержимым в.git/modules/new/parent/submodule
..git/modules/new/parent/config
файл, убедитесь, что элемент рабочего дерева указывает на новые местоположения, так что в этом примере это должно бытьworktree = ../../../../../new/parent/module
. Обычно..
в прямом пути в этом месте должно быть больше двух каталогов.Отредактируйте файл
new/parent/module/.git
, убедитесь, что путь в нем указывает на правильное новое местоположение в основной.git
папке проекта , поэтому в этом примереgitdir: ../../../.git/modules/new/parent/submodule
.git status
вывод выглядит так для меня потом:Наконец, внесите изменения.
источник
path
конфигурацию, и имя подмодуля. Например, при перемещении Foo / модуль бар / модуль необходимо изменить в .gitmodules раздел[submodule "foo/module"]
к[submodule "bar/module"]
, и при этом же разделеpath = foo/module
вpath = bar/module
. Кроме того, вы должны изменить в .git / config раздел[submodule "foo/module"]
на[submodule "bar/module"]
.fatal: 'git status --porcelain' failed in...
просто удалите файлы .git или каталоги в подмодуле..git/modules/old/parent/submodule
, перемещение его на новое место, обновлениеgitdir
вold/parent/submodule/.git
...git mv old/submod new/submod
работает как положено и выполняет всю сантехнику за вас. Возможно, вы захотите использовать git 1.9.3+, потому что он включает в себя исправления для перемещения подмодулей.Самый современный ответ, взятый из комментария Валлорика выше:
git mv old/submod new/submod
git status
.)git commit
и вы готовы!Выполнено!
источник
1.9.3
за исключением подмодуля внутри перемещенного подмодуля. Это потребовало некоторой ручной очистки.1.8.5
как описано в примечаниях к выпуску ..gitmodules
файл,old/submod
он все еще будет использоваться в качестве метки для субмодуля, пока путь был изменен. Чтобы изменить метку, кажется, вам нужно переместить путь к каталогу модулей внутри.git
, а затем вручную изменить метку.gitmodules
.В моем случае я хотел переместить подмодуль из одного каталога в подкаталог, например, «AFNetworking» -> «ext / AFNetworking». Вот шаги, которые я выполнил:
[core] worktree
строку. Мой изменен с../../../AFNetworking
на../../../../ext/AFNetworking
gitdir
. Мой изменен с../.git/modules/AFNetworking
на../../git/modules/ext/AFNetworking
git add .gitmodules
git rm --cached AFNetworking
git submodule add -f <url> ext/AFNetworking
Наконец, я увидел в Git статус:
И вуаля. Приведенный выше пример не меняет глубину каталога, что сильно влияет на сложность задачи, и не меняет имя подмодуля (что может и не быть необходимым, но я сделал это, чтобы соответствовать тому, что произойдет, если я добавлю новый модуль по этому пути.)
источник
[Обновление: 2014-11-26] Поскольку Yar подводит итоги ниже, прежде чем что-либо делать, убедитесь, что вы знаете URL-адрес субмодуля. Если неизвестно, откройте
.git/.gitmodules
и осмотрите ключsubmodule.<name>.url
.То, что работало для меня, было удалить старый подмодуль, используя
git submodule deinit <submodule>
затемgit rm <submodule-folder>
. Затем снова добавьте подмодуль с новым именем папки и подтвердите. Проверка состояния git перед фиксацией показывает старый подмодуль, переименованный в новое имя и модифицированный .gitmodule.источник
Хитрость заключается в понимании того, что
.git
каталог для субмодулей теперь хранится в главном репозитории.git/modules
, и каждый субмодуль имеет.git
файл, который указывает на него. Это процедура, которая вам нужна сейчас:.git
файл в рабочем каталоге подмодуля и измените путь, который он содержит, чтобы он указывал на правильный каталог в каталоге главного репозитория.git/modules
..git/modules
каталог главного репозитория и найдите каталог, соответствующий вашему подмодулю.config
файл, обновивworktree
путь таким образом, чтобы он указывал на новое местоположение рабочего каталога подмодуля..gitmodules
файл в корне главного репозитория, обновив путь к рабочему каталогу подмодуля.git add -u
git add <parent-of-new-submodule-directory>
(Важно добавить родителя , а не сам каталог подмодулей.)Несколько заметок:
[submodule "submodule-name"]
строки в.gitmodules
и.git/config
должны соответствовать друг другу, но не соответствуют ни к чему другому..git
каталога должен правильно указывать друг на друга..gitmodules
И.git/config
файлы должны быть синхронизированы.источник
Строка в кавычках после "[submodule" не имеет значения. Вы можете изменить его на «foobar», если хотите. Он используется для поиска подходящей записи в ".git / config".
Поэтому, если вы сделаете изменение до запуска «git submodule init», оно будет работать нормально. Если вы внесете изменение (или получите его с помощью слияния), вам нужно будет либо вручную отредактировать .git / config, либо снова запустить «git submodule init». Если вы сделаете последнее, у вас останется безобидная «застрявшая» запись со старым именем в .git / config.
источник
git submodule sync
изменения распространяются.git/config
автоматическиВы можете просто добавить новый подмодуль и удалить старый подмодуль, используя стандартные команды. (должен предотвращать любые случайные ошибки внутри .git)
Пример настройки:
Пример перемещения 'jquery' в 'vendor / jquery / jquery':
Бонусный метод для больших подмодулей:
Если субмодуль большой и вы предпочитаете не ждать клона, вы можете создать новый субмодуль, используя старый в качестве источника, а затем переключить источник.
Пример (используйте тот же пример настройки)
источник
newPath
.Данное решение не сработало для меня, однако аналогичная версия сработала ...
Это с клонированным репозиторием, поэтому подмодульные репозитории git содержатся в верхних репозиториях .git dir. Все катионы находятся в верхнем хранилище:
Отредактируйте .gitmodules и измените настройку «путь =» для рассматриваемого подмодуля. (Нет необходимости ни менять метку, ни добавлять этот файл в индекс.)
Отредактируйте .git / modules / name / config и измените настройку «worktree =» для рассматриваемого подмодуля
запустить:
Интересно, имеет ли это значение, если репозитории являются атомарными или относительными подмодулями, в моем случае это было относительно (submodule / .git является ссылкой на topproject / .git / modules / submodule)
источник
Просто используйте скрипт оболочки git-submodule-move .
источник
Я только что прошел это испытание вчера, и этот ответ сработал отлично. Вот мои шаги, для ясности:
more .gitmodules
потому что, как только вы удалите подмодуль, он не будет вокругdeinit
,rm
а затемsubmodule add
ПРИМЕР
КОМАНДЫ
ПРИМЕЧАНИЕ: git mv не делает этого. Совсем.
источник
git mv
должно быть лучше в самых последних версиях Git.mv
. Спасибо!