Как Перенести существующий подмодулей в Git в Git-репозиторий?
Я хотел бы изменить имя каталога подмодуля Git в моем суперпроекте Git.
предположим, что у меня есть следующая запись в моем .gitmodules file:
[submodule ".emacs.d/vimpulse"]
path = .emacs.d/vimpulse
url = git://gitorious.org/vimpulse/vimpulse.git
что мне нужно ввести, чтобы переместить
10 ответов:
Примечание: как уже упоминалось в комментариях, этот ответ относится к шагам, необходимым для более старых версий git. Git теперь имеет встроенную поддержку для перемещения подмодулей:
начиная с git 1.8.5,
git mv old/submod new/submodработает, как ожидалось и вся сантехника для вас. Возможно, вы захотите использовать git 1.9.3 или более новую версию, поскольку она включает исправления для перемещения подмодуля.
это похоже на то, как вы удаляете подмодуль (см. Как удалить a подмодуль?):
- Edit
.gitmodulesи измените путь подмодуля соответствующим образом, и поместите его в индекс сgit add .gitmodules.- при необходимости создайте родительский каталог нового расположения подмодуля (
mkdir -p new/parent).- переместить все содержимое из старого в новый каталог (
mv -vi old/parent/submodule new/parent/submodule).- убедитесь, что Git отслеживает этот каталог (
git add new/parent).- Удалите старый каталог с помощью
git rm --cached old/parent/submodule.- переместить каталог
.git/modules/old/parent/submoduleсо всем его содержанием до.git/modules/new/parent/submodule.- редактировать
.git/modules/new/parent/configfile, убедитесь, что элемент worktree указывает на новые местоположения, поэтому в этом примере он должен бытьworktree = ../../../../../new/parent/module. Как правило, должно быть еще два..затем каталоги в прямом пути в этом месте.редактировать файл
new/parent/module/.git, убедитесь, что путь в нем указывает на правильное новое место внутри основного проекта.gitпапка, так что в этом примереgitdir: ../../../.git/modules/new/parent/submodule.
git statusвывод выглядит так для меня потом:# On branch master # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # modified: .gitmodules # renamed: old/parent/submodule -> new/parent/submodule #наконец, сохраните изменения.
самый современный ответ, взятый из комментария Валлорика выше:
- обновление до Git 2.0 (или по крайней мере до 1.9.3)
git mv old/submod new/submod- далее .gitmodules и каталог подмодулей уже размещены для фиксации (вы можете проверить это с помощью
git status.)- зафиксируйте изменения с помощью
git commitи вы хорошо идти!готово!
в моем случае я хотел переместить подмодуль из одного каталога в подкаталог, например "AFNetworking" -> "ext/AFNetworking". Вот шаги, которым я следовал:
- правка .gitmodules изменение имени подмодуля и путь к "ext / AFNetworking"
- переместить каталог git подмодуля из ".git / modules / AFNetworking" to".git / modules / ext / AFNetworking"
- переместить библиотеку из "AFNetworking" в "ext / AFNetworking"
- изменить ".git / modules / ext / AFNetworking / config " и исправить
[core] worktreeлинии. Мой изменился с../../../AFNetworkingдо../../../../ext/AFNetworking- Edit " ext / AFNetworking/.ГИТ" и исправить
gitdir. Мой изменился с../.git/modules/AFNetworkingдо../../git/modules/ext/AFNetworkinggit add .gitmodulesgit rm --cached AFNetworkinggit submodule add -f <url> ext/AFNetworkingнаконец, я увидел в статусе git:
matt$ git status # On branch ios-master # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # modified: .gitmodules # renamed: AFNetworking -> ext/AFNetworkingи вуаля. Приведенный выше пример не изменяет глубину каталога, что имеет большое значение для сложности задача, и не изменяет имя подмодуля (что может быть не очень необходимо, но я сделал это, чтобы соответствовать тому, что произойдет, если я добавлю новый модуль по этому пути.)
[Обновления: 2014-11-26] А Яр красиво приведены ниже прежде чем что-либо делать, убедитесь, что вы знаете URL-адрес подмодуля. если неизвестно, открытого
.git/.gitmodulesи проанализируем основныеsubmodule.<name>.url.то, что сработало для меня, было удалите старый подмодуль используя
git submodule deinit <submodule>следовал поgit rm <submodule-folder>. Затем снова добавьте подмодуль с новым именем папки и зафиксируйте. Проверка состояния git перед фиксацией показывает старый подмодуль, переименованный в новое имя и.gitmodule изменен.$ git submodule deinit foo $ git rm foo $ git submodule add https://bar.com/foo.git new-foo $ git status renamed: foo -> new-foo modified: .gitmodules $ git commit -am "rename foo submodule to new-foo"
трюк, кажется, понимание того, что
.gitкаталог для подмодулей теперь хранится в главном репозитории, под.git/modules, и каждый подмодуль имеет.gitфайл, который указывает на него. Это процедура, которая вам сейчас нужна:
- переместите подмодуль в его новый дом.
- редактировать
.gitфайл в рабочем каталоге подмодуля и измените путь, который он содержит, чтобы он указывал на правильный каталог в главном репозитории.git/modulesсправочник.- войдите в главный репозиторий
.git/modulesкаталог, и найти каталог, соответствующий вашему подмодулю.- редактировать обновление
worktreeпуть так, чтобы он указывал на новое расположение рабочего каталога подмодуля.- редактировать
.gitmodulesфайл в корне главного репозитория, обновляющий путь к рабочему каталогу подмодуля.git add -ugit add <parent-of-new-submodule-directory>(важно, чтобы вы добавляете родитель, а не сам каталог подмодулей.)несколько замечаний:
- The
[submodule "submodule-name"]строки.gitmodulesи.git/configдолжны соответствовать друг другу, но не соответствуют ничему другому.- рабочий каталог подмодуля и
.gitкаталог должен правильно указывать друг на друга.- The
.gitmodulesи.git/configфайлы должны быть синхронизированы.
вы можете просто добавить новый и удалить старый субмодуль субмодуль с помощью стандартных команд. (следует предотвратить любые случайные ошибки внутри .git)
пример настройки:
mkdir foo; cd foo; git init; echo "readme" > README.md; git add README.md; git commit -m "First" ## add submodule git submodule add git://github.com/jquery/jquery.git git commit -m "Added jquery" ## </setup example>пример перемещения 'библиотека jQuery' на 'продавец/библиотека jQuery/jQuery с' :
oldPath="jquery" newPath="vendor/jquery/jquery" orginUrl=`git config --local --get submodule.${oldPath}.url` ## add new submodule mkdir -p `dirname "${newPath}"` git submodule add -- "${orginUrl}" "${newPath}" ## remove old submodule git config -f .git/config --remove-section "submodule.${oldPath}" git config -f .gitmodules --remove-section "submodule.${oldPath}" git rm --cached "${oldPath}" rm -rf "${oldPath}" ## remove old src rm -rf ".git/modules/${oldPath}" ## cleanup gitdir (housekeeping) ## commit git add .gitmodules git commit -m "Renamed ${oldPath} to ${newPath}"
Бонусный метод для больших подмодулей:
Если субмодуль большой и вы предпочитаете не ждать клона, вы можете создать новый подмодуль использует старый в качестве источника, а затем переключает источник.
пример (используйте тот же пример настройки)
oldPath="jquery" newPath="vendor/jquery/jquery" baseDir=`pwd` orginUrl=`git config --local --get submodule.${oldPath}.url` # add new submodule using old submodule as origin mkdir -p `dirname "${newPath}"` git submodule add -- "file://${baseDir}/${oldPath}" "${newPath}" ## change origin back to original git config -f .gitmodules submodule."${newPath}".url "${orginUrl}" git submodule sync -- "${newPath}" ## remove old submodule ...
строка в кавычках после "[подмодуль " не имеет значения. Вы можете изменить его на "foobar", если хотите. Он используется для поиска соответствующей записи в ".git / config".
поэтому, если вы внесете изменения перед запуском "git submodule init", он будет работать нормально. Если вы внесете изменения (или получите изменения через слияние), вам нужно будет либо вручную отредактировать .git / config или снова запустите "git submodule init". Если вы сделаете последнее, вы останетесь с безвредной" многожильной " записью с помощью старое имя .git / config.
данное решение не сработало для меня, однако аналогичная версия сделала...
это с клонированным репозиторием, поэтому подмодули git repos содержатся в верхних репозиториях .ГИТ реж. Все катионы из верхнего репозитория:
правка .gitmodules и измените параметр "path =" для рассматриваемого подмодуля. (Не нужно ни менять метку, ни добавлять этот файл в индекс.)
правка .git / modules / name / config и измените параметр "worktree =" для рассматриваемого подмодуля
run:
mv submodule newpath/submodule git add -u git add newpath/submoduleинтересно, имеет ли значение, являются ли репозитории атомарными или относительными подмодулями, в моем случае это было относительным (submodule/.git-это ссылка обратно в topproject/.git / modules / submodule)
просто использовать shell-скрипт git-submodule-move.
Я только вчера прошел через это испытание и ответ отлично работал. Вот мои шаги, для ясности:
- убедитесь, что подмодуль зарегистрирован и перемещен на свой сервер. Вы также должны знать, какая ветвь его на.
- вам нужен URL вашего подмодуля! использовать
more .gitmodulesпотому что как только вы удалите подмодуль, он не будет вокруг- теперь вы можете использовать
deinit,rmи затемsubmodule addпример
- подмодуль Git находится в: Classes / lib / mustIReally
- переход к: lib / AudioBus
- URL:http://developer.audiob.us/download/SDK.git
команды
git submodule deinit Classes/lib/mustIReally git rm foo git submodule add http://developer.audiob.us/download/SDK.git lib/AudioBus # do your normal commit and push git commit -aПримечание: git mv этого не делает. Совсем.
Comments