我想在我的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 ".emacs.d/vimpulse"]
或者是否也可以只存储子项目的名称?
[submodule "vimpulse"]
#1楼
给定的解决方案对我不起作用,但类似的版本确实......
这是一个克隆的存储库,因此子模块git repos包含在顶级存储库.git目录中。 所有阳离子都来自顶级存储库:
编辑.gitmodules并更改相关子模块的“path =”设置。 (无需更改标签,也无需将此文件添加到索引中。)
编辑.git / modules / name / config并更改相关子模块的“worktree =”设置
跑:
mv submodule newpath/submodule git add -u git add newpath/submodule
我想知道如果存储库是原子的,或者相对的子模块是否有所不同,在我的情况下,它是相对的(子模块/ .git是ref回到topproject / .git / modules / submodule)
#2楼
在我的例子中,我想将一个子模块从一个目录移动到一个子目录,例如“AFNetworking” - >“ext / AFNetworking”。 这些是我遵循的步骤:
- 编辑.gitmodules将子模块名称和路径更改为“ext / AFNetworking”
- 将子模块的git目录从“.git / modules / AFNetworking”移动到“.git / modules / ext / AFNetworking”
- 将库从“AFNetworking”移动到“ext / AFNetworking”
- 编辑“.git / modules / ext / AFNetworking / config”并修复
[core] worktree
行。 我从../../../AFNetworking
改为../../../../ext/AFNetworking
- 编辑“ext / AFNetworking / .git”并修复
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
瞧瞧。 上面的例子不会改变目录深度,这会对任务的复杂性产生很大的影响,并且不会改变子模块的名称(这可能不是必需的,但我这样做是为了与如果我在那条路径上添加了一个新模块,就会发生。)
#3楼
诀窍似乎是要理解子模块的.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
文件。
#4楼
您只需添加一个新的子模块,然后使用标准命令删除旧的子模块。 (应该防止.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
...
#5楼
只需使用shell脚本git-submodule-move 。
来源:oschina
链接:https://my.oschina.net/u/3797416/blog/3191939