有没有一种简单的方法来重命名一个 git 子模块目录(而不是经过整个删除并重新添加到新目标名称的流程)。
同时,为什么我不能在父目录中直接执行以下操作:git mv old-submodule-name new-submodule-name
?
有没有一种简单的方法来重命名一个 git 子模块目录(而不是经过整个删除并重新添加到新目标名称的流程)。
同时,为什么我不能在父目录中直接执行以下操作:git mv old-submodule-name new-submodule-name
?
Git1.8.5(2013年10月)应该简化该过程。只需执行:
git mv A B
git mv A B
",当移动子模块A
时,已经学会了重新定位其工作树并调整.gitmodules
文件中的路径。
在提交 0656781fadca1中查看更多:
目前在子模块上使用“git mv”命令会将子模块的工作树移动到超级项目中。但是,.gitmodules文件中子模块的路径设置保持不变,这与工作树不一致,并使依赖于正确的路径 ->名称映射(如状态和差异)的git命令表现出奇怪的行为。让“git mv”在此处发挥作用,不仅移动子模块的工作树,还更新.gitmodules文件中的“submodule.<submodule name>.path”设置并进行暂存。当没有找到.gitmodules文件时,不会发生这种情况,并且仅在没有此子模块的部分时发出警告。这是因为用户可能只使用纯gitlinks而没有.gitmodules文件,或者已经在发出“git mv”命令之前手动更新了路径设置(在这种情况下,警告提醒他mv本来可以为他完成这项工作)。仅当发现.gitmodules文件并包含合并冲突时,mv命令才会失败,并告诉用户在再次尝试之前解决冲突。git 2.9 (2016年6月)将改进子模块的git mv
命令:
请参见commit a127331 (2016年4月19日),作者为Stefan Beller (stefanbeller
)。
(由Junio C Hamano -- gitster
--合并于commit 9cb50a3,2016年4月29日)
mv
: 允许移动嵌套子模块"git mv old new
"未正确调整作为old/
目录下子目录存在的子模块的路径。
然而,子模块需要更新其到git目录的链接,以及更新.gitmodules
文件。
git add newpath
,不要使用尾随斜杠。 - atomicules.git/modules/SUBMODULE/config
文件,以便 worktree
再次指向正确的目录。 - Vincent Ketelaars2.13.1
,这并没有起作用。但是简单地使用git mv old new
非常有效。我只需要执行git commit
来完成更改。 - user正确的解决方案是:
mv oldpath ~/another-location
git rm oldpath
git submodule add submodule-repository-URL newpath
无法更改名称,因此您需要首先将其删除 (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>
我刚刚尝试了上面建议的一些方法。我的系统环境是:
$ 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>
至少对我来说是这样最有效的,但你的经验可能不同!
MacOS:当我想要使用VonC解决方案将子模块文件夹Common
更改为小写字母时:
git mv Common common
我理解你遇到了问题,错误信息是“fatal: renaming 'Common' failed: Invalid argument”。
解决方案 - 使用一些临时文件夹名称并进行两次移动:
git mv Common commontemp
git mv commontemp common
That's all :)
编辑.gitmodules文件以重命名子模块,然后重命名子模块目录。
我认为你可能需要在此之后执行git submodule sync
,但我现在无法检查。
.gitmodules
。请参见我的下面的答案。 - VonCnpm
显示了简单易用的方式。也许有一天,会有人重写它... 在此期间... - Rolf