重命名一个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 (如statusdiff )的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>