是否有一些简单的方法来重命名git子模块目录(除了遍历deleting的整个动作并重新添加新的目标名称)。
虽然我们在这里,为什么我不能在父目录中执行以下操作:git mv old-submodule-name new-submodule-name
答案 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
(如status
和diff
表现得很奇怪。让“
git mv
”在此处提供帮助,不仅可以移动子模块的工作树,还可以更新submodule.<submodule name>.path
文件中的“.gitmodules
”设置,并将其设置为两个。 如果找不到.gitmodules
文件,则不会发生这种情况,只有在没有此子模块的部分时才会发出警告。这是因为用户可能只使用没有.gitmodules
文件的普通gitlinks,或者在发出“git mv”命令之前已经手动更新了路径设置(在这种情况下,警告提醒他mv
为他做了这件事。) 只有在找到.gitmodules
且包含合并冲突时,mv
命令才会失败并告诉用户在再次尝试之前解决冲突。
git 2。9(2016年6月)将改进子模块的git mv
:
commit a127331见Stefan Beller (stefanbeller
)(2016年4月19日)
(由Junio C Hamano -- gitster
--合并于commit 9cb50a3,2016年4月29日)
mv
:允许移动嵌套子模块“
然而,git mv old new
”没有正确调整作为old/
目录中子目录的子模块的路径。子模块需要更新它们到git目录的链接 以及
.gitmodules
文件的更新。
答案 1 :(得分:88)
我发现以下工作流程正在运行:
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
仅此而已:)