将子模块更新到最新版本而不积累更新历史记录

3
使用命令submodule --remote更新子模块将拉取子模块的HEAD,而不是包含在Git仓库中的哈希记录。但似乎包装Git仓库将继续管理其内部的哈希值,从而不必要地引入了噪音到自身的历史记录中。
例如,在执行submodule update --remote后,将会在包装项目中引入一个变更,具体如下:
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   <module-name> (new commits)

在包含子模块的git仓库中,是否可能不包含任何哈希或有关子模块哈希的信息,以使submodule update不会引入需要新提交并且不会反映在项目历史记录中的需求?

动机场景:

这将解决一个工作流问题,可以描述为“始终使用所有子模块的最新版本”,目前每次submodule update后都需要进行特殊管理(提交或以某种方式从历史记录中删除上述更改记录...当您只想始终使用最新版本时,这使得工作流程非常混乱)。

1个回答

6

长答案

是否可能不包含任何哈希值或有关子模块哈希的信息?

不,这就是子模块的全部目的:在父存储库中记录一个固定的 SHA1(即gitlink索引中的特殊条目)。

为了方便起见,您可以更新子模块中的内容,以匹配子模块上游存储库的远程分支。
git submodule update --remote

但是,一旦完成该更新,结果与子模块内的任何其他手动修改没有区别:其 SHA1 会改变,并且需要在父存储库中记录。

目标是稍后使用完全相同的内容(包括其子模块内容)克隆父存储库,因此子模块以其由父存储库记录的相应 SHA1 检出。


提交 9937e65(Git 2.0,2014年1月)提到:

明确表示没有隐式浮动;--remote让你可以显式地将上游分支集成到当前 HEAD 中(就像在子模块中运行 'git pull' 一样)。
唯一的区别是上游分支的配置位置和设置与当前 'git pull' 不同,希望现在已经清楚了。

提交 23d25e4 的详细信息:

这个提交不会改变克隆后更新的逻辑,它将继续为检出模式的更新创建分离的 HEAD,并在其他模式下将远程工作与本地 HEAD(分离的或非分离的)集成。
进行更改的动机是,在子模块内进行本地工作的开发人员很可能选择非检出模式进行更新,以便将他们的本地工作与上游工作集成。而不进行子模块本地工作的开发人员则保持检出模式进行更新,以便在更新期间任何明显的本地工作都会被删除。
例如,如果上游回滚到较早版本的远程分支或 gitlinked 提交,则检出模式开发人员希望其旧的子模块检出也被回滚,而不是获得回滚引用的无操作合并/变基。
TL;DR
可能没有任何东西可以使一个仓库自动指向子模块的最新版本而不是特定的提交哈希值。虽然 `submodule update --remote` 可以用作忽略该跟踪的惯例,但更新描述历史始终会记录在父仓库中。

我会将这标记为“已接受的答案”,除非它对于“目标是……”可能有些过分。显然,“--branch”可以启用不同的目标,所以现在对于子模块而言并不只有一个目标,对吧。 - matanster
@matt 不,--branch 只是用来指定默认的 origin/master 以外的分支。但它是 git submodule update --remote 功能的一部分。 - VonC
简而言之,从提交消息的所有内部内容中总结一下:在git宇宙中,没有任何东西可以使存储库跟踪子模块的最新版本,而不是特定的提交哈希值。可以使用“submodule update --remote”作为惯例来忽略该跟踪,但仍将导致历史记录描述更新。 - matanster
2
此外,我要声明的是,Git的作者甚至不希望有这样的“功能”(无记录更新)。我相信这与他们的方法论背道而驰。实际上,当你的一个或多个依赖项发布新版本时,很有可能需要对其进行测试,以确保你的当前代码能够与新的依赖项良好配合。更新提交不仅记录了你的依赖项的更新,还包括你的测试和检查。 - Franklin Yu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接