我正在尝试update
为 git 编写一个钩子,如果将子模块更新为子模块的上游存储库中不存在的提交 ID,该钩子会反弹。换句话说,我想强制用户在将更改推送到子模块指针之前将更改推送到子模块存储库。
一个警告:
- 我只想测试其裸上游存储库与父存储库位于同一服务器上的子模块。否则我们开始不得不做一些疯狂的事情,比如在 git 钩子中调用 'git clone' 或 'git fetch',这不会很有趣。
我一直在玩一个想法,但感觉必须有更好的方法来做到这一点。这是我计划在更新挂钩中做的事情:
- 检查传递给钩子的 refname 以查看我们是否正在更新
refs/heads/
. 如果没有,请尽早退出。 - 用于
git rev-list
获取正在推送的修订列表。 - 对于每个修订:
- 调用
git show <revision_id>
并使用正则表达式来查看子模块是否已更新(通过搜索`+Subproject commit [0-9a-f]+)。 - 如果此提交确实更改了子模块,请获取该
.gitmodules
特定提交所看到的文件内容 (git show <revision_id>:.gitmodules
)。 - 使用 3.1 和 3.2 的结果来获取子模块 URL 及其更新的提交 ID 的列表。
- 对照将子模块 URL 映射到文件系统上的本地裸 git 存储库的外部文件检查 3.3 中创建的此列表。
cd
到 3.4 中找到的路径并执行git rev-parse --quiet --verify <updated_submodule_commit_id>
以查看该提交是否存在于该存储库中。如果不是,则以非零状态退出。
- 调用
(注意:我相信 3.2 的结果可能会跨版本缓存,只要输出git rev-parse --quiet --verify <revision_id>:.gitmodules
不会从一个版本更改为下一个版本。我省略了这部分以简化解决方案。)
所以,是的,这看起来很复杂,我不禁想知道是否有一些内部 git 命令可以让我的生活更轻松。或者也许有不同的方式来思考这个问题?