【问题标题】:How can I rename a git repository with submodules?如何使用子模块重命名 git 存储库?
【发布时间】:2023-04-02 03:56:01
【问题描述】:

我在 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 更新这些子模块路径?

【问题讨论】:

  • 应该可以。 .gitmodule 文件中有什么?
  • @Weston,请查看我更新的问题。但即使我从 .gitmodules 文件中删除这部分,也会出现相同的错误。当我将父目录重命名为原始名称时,git 不再抱怨。
  • 嗯.. 我刚刚尝试使用子模块制作测试回购。然后我克隆了它,初始化并更新了克隆中的子模块,然后用 mv 重命名了克隆。一切似乎都按预期工作......?
  • 是的,我用一个新的克隆尝试了同样的方法,它也没有问题 - 它只是那个特定的 repo,另见stackoverflow.com/questions/9878860/…

标签: git repository git-submodules


【解决方案1】:

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

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

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

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

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

之后 gitdir: /path/to/project//.git/modules/submodules/RestKit

【讨论】:

  • 我还必须在 .git/modules/path/to/project/submodules/RestKit/config 中更改我的 worktree 路径
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    今天我在重命名子模块时遇到了同样的问题,最后我通过以下步骤修复了它:

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

    1. 在 repo 的根目录 (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. 转到repo_root 并编辑new/module/path/.git,将gitdir 更改为从该文件到repo_root/.git/modules/new/module/path 的相对路径
    4. 更改主仓库的.git/config:找到包含[submodule "old/module"] 的行并更新为[submodule "new/module/path"]

    【讨论】:

      【解决方案4】:

      由于Weston 的测试(克隆仓库中的子模块的克隆、初始化和更新)在重命名包含所述子模块的目录时按预期工作,我怀疑子模块.git 本身一定有问题你原来的 Git repo 子模块。

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

      【讨论】:

      • 请注意这里的名字.. 我,而不是 OP,做了所说的测试。 :-) 但也许 OP 应该做同样的测试来验证他的安装。
      • @Weston 抱歉,我写这篇文章的时候并没有完全清醒;)
      • 我无法重现这个问题,所以我认为我在重构项目时搞砸了一些事情。如果我有时间我会调查损坏的 repo,直到那时我创建了一个新的克隆,它工作正常。感谢您的帮助。
      猜你喜欢
      • 2011-05-30
      • 2015-09-25
      • 1970-01-01
      • 2023-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-20
      • 1970-01-01
      相关资源
      最近更新 更多