更改 "logical name" 的 Git 子模块
Change "logical name" of a Git submodule
git submodule add
命令接受 --name
选项,它允许您为子模块指定一个逻辑名称。否则,子模块以创建它的路径命名。
有没有办法在创建子模块后更改此逻辑名称?
从 Git 版本 2.30.1 开始,我还没有找到使用 Git 命令行执行此操作的方法,除了完全删除子模块并将其 re-creating 从从头开始。
为了重命名 Git 子模块,需要更改 4 处:
.gitmodules
文件中子模块标题的名称。
- 子模块在
.git/modules
树下的位置。
- 子模块中
.git
文件的内容。
.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
所有这些都必须调整才能做出改变!
- 将
[submodule "vendor/libfoo"]
更改为 [submodule "vendor-libfoo"]
,但 不要 更改该部分标题下的 path =
选项。这会更改子模块的逻辑名称而不更改其路径。
- Git 现在将尝试在
.git/modules/vendor-libfoo
而不是 .git/modules/vendor/libfoo
中查找此模块。因此我们必须将后者重命名为前者,以反映步骤 1 中的更改。
vendor/libfoo/.git
的内容将是错误的,因为相对路径将不再指向正确的位置。我们必须将 ../../.git/modules/vendor/libfoo
更改为 ../../.git/modules/vendor-libfoo
,以反映步骤 2 中的更改。
- 另外,
.git/modules/vendor-libfoo
中的worktree = ../../../../vendor/libfoo
选项也会出错。将其更改为 ../../../vendor/libfoo
以反映我们已将此目录在 .git/modules
内向上移动 1 级的事实。
显然,这些步骤需要根据您的具体情况进行调整。我不保证此程序在任何情况下的正确性或有效性。
理论上这个过程可以是 scripted/automated,但在正确解析 Git 配置格式时可能会有困难。在大多数情况下,您可以使用正则表达式替换。
祝你好运!也许希望此功能在 git.
的更高版本中得到更多关注
git submodule add
命令接受 --name
选项,它允许您为子模块指定一个逻辑名称。否则,子模块以创建它的路径命名。
有没有办法在创建子模块后更改此逻辑名称?
从 Git 版本 2.30.1 开始,我还没有找到使用 Git 命令行执行此操作的方法,除了完全删除子模块并将其 re-creating 从从头开始。
为了重命名 Git 子模块,需要更改 4 处:
.gitmodules
文件中子模块标题的名称。- 子模块在
.git/modules
树下的位置。 - 子模块中
.git
文件的内容。 .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
所有这些都必须调整才能做出改变!
- 将
[submodule "vendor/libfoo"]
更改为[submodule "vendor-libfoo"]
,但 不要 更改该部分标题下的path =
选项。这会更改子模块的逻辑名称而不更改其路径。 - Git 现在将尝试在
.git/modules/vendor-libfoo
而不是.git/modules/vendor/libfoo
中查找此模块。因此我们必须将后者重命名为前者,以反映步骤 1 中的更改。 vendor/libfoo/.git
的内容将是错误的,因为相对路径将不再指向正确的位置。我们必须将../../.git/modules/vendor/libfoo
更改为../../.git/modules/vendor-libfoo
,以反映步骤 2 中的更改。- 另外,
.git/modules/vendor-libfoo
中的worktree = ../../../../vendor/libfoo
选项也会出错。将其更改为../../../vendor/libfoo
以反映我们已将此目录在.git/modules
内向上移动 1 级的事实。
显然,这些步骤需要根据您的具体情况进行调整。我不保证此程序在任何情况下的正确性或有效性。
理论上这个过程可以是 scripted/automated,但在正确解析 Git 配置格式时可能会有困难。在大多数情况下,您可以使用正则表达式替换。
祝你好运!也许希望此功能在 git.
的更高版本中得到更多关注