更改 "logical name" 的 Git 子模块

Change "logical name" of a Git submodule

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

有没有办法在创建子模块后更改此逻辑名称?

从 Git 版本 2.30.1 开始,我还没有找到使用 Git 命令行执行此操作的方法,除了完全删除子模块并将其 re-creating 从从头开始。

为了重命名 Git 子模块,需要更改 4 处:

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

这是可行的,但可能会造成混乱。如果你勇敢、鲁莽、and/or绝望,请继续。


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

这里是对应的.gitmodules文件:

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

并且 vendor/libfoo/.git 将是一个文本文件(不是目录,与 top-level 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. 另外,.git/modules/vendor-libfoo中的worktree = ../../../../vendor/libfoo选项也会出错。将其更改为 ../../../vendor/libfoo 以反映我们已将此目录在 .git/modules 内向上移动 1 级的事实。

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

理论上这个过程可以是 scripted/automated,但在正确解析 Git 配置格式时可能会有困难。在大多数情况下,您可以使用正则表达式替换。

祝你好运!也许希望此功能在 git.

的更高版本中得到更多关注