重命名git子模块

时间:2010-12-24 14:52:18

标签: git git-submodules

是否有一些简单的方法来重命名git子模块目录(除了遍历deleting的整个动作并重新添加新的目标名称)。

虽然我们在这里,为什么我不能在父目录中执行以下操作:git mv old-submodule-name new-submodule-name

7 个答案:

答案 0 :(得分:181)

Git1.8.5 (October 2013) should simplify the process。只需做一个:

git mv A B
  

git mv A B”,当移动子模块A时,教会重新定位其工作树并调整.gitmodules文件中的路径。< / p>


commit 0656781fadca1中了解详情:

  

目前在子模块上使用“git mv”会将子模块的工作树移动到超级项目的工作树中。但是.gitmodules中子模块的路径设置保持不变,现在与工作树不一致,并使得git命令依赖于正确的path -> name mapping(如statusdiff表现得很奇怪。

     

让“git mv”在此处提供帮助,不仅可以移动子模块的工作树,还可以更新submodule.<submodule name>.path文件中的“.gitmodules”设置,并将其设置为两个。   如果找不到.gitmodules文件,则不会发生这种情况,只有在没有此子模块的部分时才会发出警告。这是因为用户可能只使用没有.gitmodules文件的普通gitlinks,或者在发出“git mv”命令之前已经手动更新了路径设置(在这种情况下,警告提醒他mv为他做了这件事。)   只有在找到.gitmodules且包含合并冲突时,mv命令才会失败并告诉用户在再次尝试之前解决冲突。


git 2。9(2016年6月)将改进子模块的git mv

commit a127331Stefan Beller (stefanbeller)(2016年4月19日) (由Junio C Hamano -- gitster --合并于commit 9cb50a3,2016年4月29日)

  

mv:允许移动嵌套子模块

     

git mv old new”没有正确调整作为old/目录中子目录的子模块的路径。

     然而,

子模块需要更新它们到git目录的链接   以及.gitmodules文件的更新。

答案 1 :(得分:88)

我发现以下工作流程正在运行:

  • 更新.gitmodules
  • mv oldpath newpath
  • git rm oldpath
  • git add newpath
  • git submodule sync

注意:此方法不会在2018版GIT中正确更新索引和.gitmodules。

答案 2 :(得分:9)

$ mv submodule-oldpath submodule-newpath
$ git rm submodule-oldpath
$ git add submodule-newpath
$ git submodule sync

此解决方案对我不起作用,因为在使用git add命令时,子模块作为简单目录而不是子模块包含在项目中。

正确的解决方案是:

$ 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/

答案 3 :(得分:9)

我刚刚尝试了上面提到的一些建议。我正在跑步:

$ git --version
git version 1.8.4

我发现最好取消初始化子模块,删除目录并创建一个新的子模块。

git submodule deinit <submodule name>

git rm <submodule folder name>

git submodule add <address to remote git repo> <new folder name>

至少这对我最有用。 YMMV!

答案 4 :(得分:3)

编辑.gitmodules文件以重命名子模块,然后重命名子模块目录。

我想你之后可能需要做git submodule sync,但我现在无法检查。

答案 5 :(得分:3)

无法重命名,因此您必须先将其删除(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>

答案 6 :(得分:1)

MacOs :当我想使用VonC solution将子模块文件夹Common更改为小写时:

git mv Common common

我明白了

  

致命:重命名“通用”失败:参数无效

解决方案-使用一些临时文件夹名称并移动两次:

git mv Common commontemp
git mv commontemp common

仅此而已:)

相关问题