我想在个人Git超级项目中更改Git子模块的目录名。 jquery
假设个人.gitmodules
文件中有如下条目: ios
[submodule ".emacs.d/vimpulse"] path = .emacs.d/vimpulse url = git://gitorious.org/vimpulse/vimpulse.git
我须要键入什么来将.emacs.d/vimpulse
目录移动到.emacs.d/vendor/vimpulse
而不先删除它( 在这里和这里解释),而后从新添加它。 git
Git真的须要子模块标签中的整个路径 github
[submodule ".emacs.d/vimpulse"]
或者是否也能够只存储子项目的名称? shell
[submodule "vimpulse"]
给定的解决方案对我不起做用,但相似的版本确实...... vim
这是一个克隆的存储库,所以子模块git repos包含在顶级存储库.git目录中。 全部阳离子都来自顶级存储库: url
编辑.gitmodules并更改相关子模块的“path =”设置。 (无需更改标签,也无需将此文件添加到索引中。) spa
编辑.git / modules / name / config并更改相关子模块的“worktree =”设置 code
跑: 索引
mv submodule newpath/submodule git add -u git add newpath/submodule
我想知道若是存储库是原子的,或者相对的子模块是否有所不一样,在个人状况下,它是相对的(子模块/ .git是ref回到topproject / .git / modules / submodule)
在个人例子中,我想将一个子模块从一个目录移动到一个子目录,例如“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状态中看到:
matt$ git status # On branch ios-master # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # modified: .gitmodules # renamed: AFNetworking -> ext/AFNetworking
瞧瞧。 上面的例子不会改变目录深度,这会对任务的复杂性产生很大的影响,而且不会改变子模块的名称(这可能不是必需的,但我这样作是为了与若是我在那条路径上添加了一个新模块,就会发生。)
诀窍彷佛是要理解子模块的.git
目录如今保存在.git/modules
下的主存储库中,而且每一个子模块都有一个指向它的.git
文件。 这是您如今须要的程序:
.git
文件,并修改它包含的路径,使其指向主存储库的.git/modules
目录中的正确目录。 .git/modules
目录,找到与子模块对应的目录。 config
文件,更新worktree
路径,使其指向子模块工做目录的新位置。 .gitmodules
文件,更新子模块工做目录的路径。 git add -u
git add <parent-of-new-submodule-directory>
(重要的是你要添加父节点 ,而不是子模块目录自己。) 几点说明:
.gitmodules
和.git/config
的[submodule "submodule-name"]
行必须相互匹配,但不能与其余任何内容相对应。 .git
目录必须正确指向彼此。 .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'移动到'vendor / 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 ...
只需使用shell脚本git-submodule-move 。