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

影语者

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

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

影语者

从 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 repo 一样),包含:

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/modules1 级的事实

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

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

更改git子模块

git子模块-忽略更改

如何更改git子模块的HEAD

Git如何放弃对子模块的更改

链接的 git 子模块存储库更改了名称。如何获取此重命名更改的历史记录?

如何更改 git superproject 更改子模块的哈希值?

Git挂钩,用于在分支更改时更新Git子模块

将git子模块中的更改推送到主模块但不推送到子模块

如何将更改恢复到git子模块?

带有子模块的Git回购不跟踪本地更改?

Git将子模块更改为原点时速度很慢

如何在git子模块中“提交”更改?

如何在本地更改git子模块的URL?

在版本控制窗口中隐藏git子模块更改

如何在git中捆绑子模块更改?

Git子模块和git clone以小写形式创建名称

git submodule update <子模块的名称>-但仍被修改:<子模块的名称>(修改后的内容)

项目根目录中的 Git 状态显示子模块更改,但在子模块中,没有可用

git子模块中的自定义命令。<名称> .update

Git是否支持子模块URL的本地名称?

如何仅访问git子模块的分支名称?

git添加没有回购名称的子模块

Plesk在git存储库更改时自动更新子模块

为什么git会说“未暂缓提交更改”并指示子模块文件夹?

将.git / config中子模块的https-address更改为ssh-address

什么是Git命令来确定哪个提交更改了子模块指针?

将git子模块更改推送到我自己的仓库中

我如何从父级到子级存储库更改git子模块?

Git子模块被忽略