更改 Git 子模块的“逻辑名称”

时间:2021-02-18 20:57:28

标签: git git-submodules

git submodule add 命令接受 --name 选项,它允许您为子模块指定一个逻辑名称。否则,子模块以其创建路径命名。

有没有办法在子模块创建后改变这个逻辑名称?

1 个答案:

答案 0 :(得分:1)

从 Git 版本 2.30.1 开始,除了完全删除子模块并从头开始重新创建之外,我还没有找到使用 Git 命令行执行此操作的方法。

为了重命名 Git 子模块,有 4 件事需要改变:

  1. .gitmodules 文件中子模块标题的名称。
  2. 子模块在 .git/modules 树下的位置。
  3. 子模块中 .git 文件的内容。
  4. .git/modules 树下的子模块中指定的工作树的位置。

这是可行的,但可能会很混乱。如果您勇敢、鲁莽和/或绝望,请继续。


假设您在 vendor/libfoo 中保存了一个子模块,现在您想为其指定逻辑名称 vendor-libfoo,而不更改其在工作树中的物理位置。

这是对应的 .gitmodules 文件:

[submodule "vendor/libfoo"]
  path = vendor/libfoo
  url = https://git.example.net/libfoo

并且 vendor/libfoo/.git 将是一个文本文件(不是目录,就像顶级 git 存储库一样),包含:

gitdir: ../../.git/modules/src/libfoo

此文件指向存储 Git 数据文件的位置,即目录 .git/modules/src/libfoo

文件 .git/modules/src/libfoo/config 将包含(除其他外):

[core]
  worktree = ../../../../vendor/libfoo

所有这些都必须进行调整才能进行更改!

  1. [submodule "vendor/libfoo"] 更改为 [submodule "vendor-libfoo"],但不要更改该部分标题下的 path = 选项。这会更改子模块的逻辑名称而不更改其路径。
  2. Git 现在将尝试在 .git/modules/vendor-libfoo 而不是 .git/modules/vendor/libfoo 中查找此模块。因此,我们必须将后者重命名为前者,以反映步骤 1 中的更改。
  3. vendor/libfoo/.git 的内容将是错误的,因为相对路径将不再指向正确的位置。我们必须将 ../../.git/modules/vendor/libfoo 更改为 ../../.git/modules/vendor-libfoo,以反映步骤 2 中的更改。
  4. 另外,worktree = ../../../../vendor/libfoo 中的 .git/modules/vendor-libfoo 选项也会出错。将其更改为 ../../../vendor/libfoo 以反映我们已将此目录在 .git/modules 内向上移动 1 级这一事实。

显然,这些步骤需要根据您的具体情况进行调整。我不保证此程序在任何情况下的正确性或有效性。

理论上这个过程可以被脚本化/自动化,但是正确解析 Git 配置格式可能会有困难。在大多数情况下,您可能可以避免使用正则表达式替换。

祝你好运!也许希望这个特性在以后的 git 版本中得到更多的关注。

相关问题