如何使用子模块重命名git存储库?

时间:2012-03-26 19:58:13

标签: git repository git-submodules

我在目录projects/myRepo中有一个包含子模块的git存储库,我想将目录重命名为projects/my-repo

根据this问题,可以使用mv完成。但是在带子模块的回购中,git一直告诉我

  

致命:不是git存储库:projects / myRepo / .git / path / to / submodule```

即使是git status

子模块配置:

[submodule "path/to/submodule"]  
   path = path/to/submodule  
   url = https://github.com/user/projectName.git  

不知何故,子模块的'内部路径'没有更新?!有没有办法告诉git更新这些子模块路径?

4 个答案:

答案 0 :(得分:3)

更改项目目录后,我也遇到了同样的错误。我有一个iOS 6 XCode 4项目,但这不重要。

对于每个子模块,您需要更改它认为它所在的绝对路径。路径在该子模块的.git文件中设置。子模块中的.git是文件,而不是标准git目录中的目录

对于每个子模块,更改.git文件中的.gitdir行。这是我项目的一个例子:

文件:/path/to/project/submodules/RestKit/.git

<强>之前 gitdir:/ path / to / project // .git / modules / submodules / RestKit

<强>后 gitdir:/ path / to / project // .git / modules / submodules / RestKit

答案 1 :(得分:3)

我确实遇到了完全相同的行为。我设法通过删除带有子模块的目录来修复它,将它们重新创建为具有正确名称的空目录,然后运行git submodule update --init以重新初始化它们。全部修复了。可能是一些权限问题(我之前从备份中检索了这些目录,对它们的权限有时很奇怪)。

答案 2 :(得分:0)

由于Weston的测试(克隆,回购和更新克隆仓库中的子模块)在重命名包含所述子模块的目录时按预期工作,我怀疑子模块中必定存在错误{{1在你原来的Git repo子模块中。

您可以在第一个子模块中比较/查找引用“.git”的任何文件 您还可以比较两个子模块的内容(您尝试重命名的第一个子模块,以及您克隆的存储库中包含的第二个子模块)

答案 3 :(得分:0)

今天我有同样的问题重命名子模块,最后我通过使用以下步骤修复它:

假设旧模块名称为old/module,新模块名称为new/module/path

  1. 位于仓库的根部(repo_root),mv old/module new/module/path
  2. 转到.git/modules
    1. mv old/module new/module/path(必要时先创建文件夹)
    2. 更改new/module/name/config:更新worktree条目。它应该是从此配置文件到repo_root/new/module/path
    3. 的相对路径
  3. 转到repo_root并修改new/module/path/.git,将gitdir更改为此文件到repo_root/.git/modules/new/module/path的相对路径
  4. 更改主仓库的.git/config:找到包含[submodule "old/module"]的行并更新为[submodule "new/module/path"]