重命名一个git子模块
有没有简单的方法来重命名一个git子模块目录(除了经历删除它的整个动议,并重新添加一个新的目标名称)。
而我们在这里,为什么我不能在父目录中执行以下操作: git mv old-submodule-name new-submodule-name
我发现以下工作stream程工作:
- 更新.gitmodules
-
mv oldpath newpath
-
git rm oldpath
-
git add newpath
-
git submodule sync
Git1.8.5(2013年10月)应该简化这个过程 。 简单地做一个:
git mv AB
“
git mv AB
”,当移动一个子模块A
已经被教导重定位它的工作树并调整.gitmodules
文件中的path 。
参见commit 0656781fadca1中的更多内容 :
目前在子模块上使用“
git mv
”将子模块的工作树移动到超级项目的工作树上。 但是.gitmodules
的子模块的path设置保持不变,现在与工作树不一致,并使依赖于正确path -> name mapping
(如status
和diff
)的git命令行为exception。通过不仅移动子模块的工作树,而且还从
.gitmodules
文件更新“submodule.<submodule name>.path
”设置,并在这两个阶段中设置“git mv
”
如果找不到.gitmodules
文件,则不会发生这种情况,只有在没有该子模块的部分时才会发出警告。 这是因为用户可能只是在没有.gitmodules
文件的情况下使用普通的.gitmodules
或者在发出“git mv”命令之前手动更新了path设置(在这种情况下警告提醒他mv
会为他做这件事)。
只有find.gitmodules
并且包含合并冲突时,mv
命令才会失败,并在再次尝试之前告诉用户解决冲突。
git 2.9(2016年6月)将改善git mv
for submodule:
见Stefan Beller( stefanbeller
)的 提交a127331 (2016年4月19日) 。
(由Junio C gitster
合并- gitster
-在9cb50a3 ,2016年4月29日提交 )
mv
:允许移动嵌套的子模块“
git mv old new
”没有正确调整作为old/
目录内子目录的子模块的path。然而子模块需要更新它们到git目录的链接以及对
.gitmodules
文件的更新。
$ mv submodule-oldpath submodule-newpath $ git rm submodule-oldpath $ git add submodule-newpath $ git submodule sync
这个解决scheme对我不起作用,因为当使用git add命令时,子模块作为一个简单的目录而不是子模块被包含在项目中。
正确的解决scheme是:
$ mv submodule-oldpath ~/another-location $ git rm submodule-oldpath $ git submodule add submodule-repository-URL submodule-newpath
资料来源: http : //bcachet.github.io/development/2012/05/25/rename-git-submodule/
我只是尝试了一些上面build议的。 我在跑:
$ git --version git version 1.8.4
我发现最好是取消初始化子模块,删除目录并创build一个新的子模块。
git submodule deinit <submodule name> git rm <submodule folder name> git submodule add <address to remote git repo> <new folder name>
至less这对我来说是最好的。 因人而异!
编辑.gitmodules文件以重命名子模块,然后重命名子模块目录。
我想你以后可能需要做一个git submodule sync
,但是我现在无法检查。
重命名它是不可能的,所以你必须先删除它( 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>