重命名git子模块


154

是否有一些简单的方法来重命名git子模块目录(除了进行删除它的整个动作, 然后使用新的目的地名称重新添加它)。

而当我们这样做时,为什么我根本无法在父目录中执行以下操作呢? git mv old-submodule-name new-submodule-name


6
.gitmodules移动子模块时,不再需要手动更新。请在下面
VonC


Git模块太复杂了。npm展示了简单的工作原理。某一天...也许...某人...与此同时将其重写...
罗尔夫(Rolf)'18

@VonC的答案到目前为止还不是全部:它确实会更改.gitmodules,但只会重命名路径,而不是模块名称。您需要对.gitmodules进行额外的编辑以更正此问题,并需要执行'git submodule sync'来完成整个过程
zertyz

@zertyz:属性[submodule“ name_of_submodule”]是Git内部名称,您可以重命名它以免混淆自己,但它只是一个标签。
MKesper

Answers:


100

我发现以下工作流程有效:

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

注意:这种方法不能在GIT的2018版本中正确更新索引和.gitmodules。

注意:git mv oldpath newpath正如VonC答案中指出的那样,您现在可以立即执行此操作。(确保您使用的是最新版本的git)


22
自我注意:因为git add newpath请勿使用斜杠
原子序号2011年

10
使用这样的工作流程,您将只创建一个符号链接到用作子模块的子目录。Symlink只是全局子模块功能的一部分。这意味着,当克隆使用重命名子模块的存储库时,可能会出现以下错误: 在.gitmodules中找不到路径'your-oldpath'的子模块映射删除oldpath(* git rm oldpath)之后,您应该使用git子模块添加REPO-URL newpath而不是“ git add newpath *。完成后,git状态将显示如下内容:重命名:oldpath-> newpath
Bertrand

5
该解决方案对我不起作用,因为使用git add命令时,子模块作为简单目录而不是子模块包含在项目中。试试$ mv submodule-oldpath〜/ another-location $ git rm submodule-oldpath $ git submodule add submodule-repository-URL submodule-newpath bcachet.github.io/development/2012/05/25/rename-git-submodule
Mahmoud亚当

3
如果确实存在工作树问题,则还可以编辑.git/modules/SUBMODULE/config文件,worktree以便再次指向正确的目录。
Vincent Ketelaars 2014年

3
这对git不适用于我2.13.1。但是简单地做git mv old new一件事情就像一种魅力。我只需要执行git commit即可完成更改。
用户

223

Git1.8.5(2013年10月)应简化流程。只需执行以下操作:

git mv A B

git mv A B在移动子模块时,“ ” A被教导重新定位其工作树并调整.gitmodules文件中的路径


commit 0656781fadca1中查看更多内容

当前git mv在子模块上使用“ ”将子模块的工作树移到超级项目的工作树中。但是子模块的路径设置在.gitmodules保持不变,这与工作树不一致,并且使得依赖于适当的git命令path -> name mapping(如statusdiff)的行为异常。

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


git 2.9(2016年6月)将有所改进 git mv针对子模块进行:

参见Stefan Beller()的commit a127331(2016年4月19日(由Junio C Hamano合并--commit 9cb50a3中,2016年4月29日)stefanbeller
gitster

mv:允许移动嵌套子模块

git mv old new ”未正确调整作为子目录old/正确存在的子模块的路径。

但是,子模块需要更新其到git目录的链接以及对.gitmodules文件的更新。


自我注意:在1.8.4上尝试此操作,您将拥有fatal: source directory is empty, source=my_source, destination=my_destination。当1.8.5稳定发布时,将再次尝试。
校验和

@checksum但是1.8.5有一个稳定的版本,至少持续了几个小时;)github.com/git/git/releases/tag/v1.8.5
VonC

我必须从源代码构建Git版本1.8.5.GIT,因为Ubuntu库中有Git v.1.7.5。如何从源代码构建Git
Maksim Dmitriev 2014年

2
@MaksimDmitriev,但是我在stackoverflow.com/a/20918469/6309中提到的ppa(个人软件包存档)又如何呢?
VonC 2014年

1
git mv不能在我的机器上用于此目的。
亚历山大·迪亚吉廖夫


11

我只是尝试了上面建议的一些方法。我在跑:

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


7

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

同样,今天居然是
阿列克谢

问题标题用词不当,它涉及到的路径,而不是名字
马克斯Robbertze

3

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

我认为您可能需要进行git submodule sync后续操作,但是我现在无法检查。


这将导致新的子模块名称作为新提交而不是重命名出现。但是,也许这就是必须的方式吗?
拉尔斯·塔克曼

1
@Lars:请确保也删除旧的子模块目录!
卡斯卡贝尔2011年

3

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

git mv Common common

我懂了

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

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

git mv Common commontemp
git mv commontemp common

就这样 :)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.