gpt4 book ai didi

git - 编写拒绝无效子模块提交的 git update hook 的最佳方法是什么?

转载 作者:IT王子 更新时间:2023-10-29 01:04:13 26 4
gpt4 key购买 nike

我正在尝试写一个 update如果子模块正在更新为子模块的上游存储库中不存在的提交 ID,则 git 的钩子(Hook)会反弹。换句话说,我想强制用户在将更改推送到子模块指针之前将更改推送到子模块存储库。

一个警告:

  • 我只想测试其裸上游存储库与父存储库存在于同一服务器上的子模块。否则我们将开始不得不做一些疯狂的事情,比如从 git 钩子(Hook)中调用“git clone”或“git fetch”,这不会很有趣。

我一直在尝试一个想法,但感觉必须有更好的方法来做到这一点。这是我计划在更新 Hook 中执行的操作:

  1. 检查传递给 Hook 的引用名,看看我们是否正在更新 refs/heads/ 下的内容.如果没有,请提前退出。
  2. 使用git rev-list获取正在推送的修订列表。
  3. 对于每次修订:
    1. 调用git show <revision_id>并使用正则表达式查看子模块是否已更新(通过搜索 `+Subproject commit [0-9a-f]+)。
    2. 如果此提交确实更改了子模块,请获取 .gitmodules 的内容该特定提交 ( git show <revision_id>:.gitmodules ) 看到的文件。
    3. 使用 3.1 和 3.2 的结果获取子模块 URL 列表及其更新的提交 ID。
    4. 对照外部文件检查 3.3 中创建的列表,该外部文件将子模块 URL 映射到文件系统上的本地裸 git 存储库。
    5. cd到 3.4 中找到的路径并执行 git rev-parse --quiet --verify <updated_submodule_commit_id>查看该提交是否存在于该存储库中。如果没有,则以非零状态退出。

(注意:我相信 3.2 的结果可能会跨修订缓存,只要 git rev-parse --quiet --verify <revision_id>:.gitmodules 的输出不会从一个修订更改为下一个修订。我省略了这部分以简化解决方案。)

是的,这看起来很复杂,我忍不住想知道是否有一些内部 git 命令可以让我的生活变得更轻松。或者也许有不同的方式来思考这个问题?

最佳答案

编辑,很久以后:从 Git 1.7.7 开始,git-push现在有一个 --recurse-submodules=check选项,如果任何子模块提交没有被推送到他们的 Remote ,它拒绝推送父项目。似乎没有相应的 push.recurseSubmodules配置参数已添加。这当然不能完全解决问题 - 一个无能的用户仍然可以在没有检查的情况下推送 - 但它非常相关!

我认为最好的方法不是检查每个单独的提交,而是查看所有推送的提交之间的差异:git diff <old> <new> .但是,您真的不想查看整个差异;它可能是巨大的。不幸的是,git-submodule porcelain 命令在裸仓库中不起作用,但您仍然应该能够快速检查 .gitmodules获取路径列表(可能还有 URL)。对于每一个,您可以 git diff <old> <new> -- path ,如果存在差异,则获取新的子模块提交。 (如果您担心 000000 旧提交的可能性,我相信您可以在新提交上使用 git show。)

一旦您处理完所有这些,您就将问题简化为检查给定的提交是否存在于给定的远程存储库中。不幸的是,看起来您已经注意到,这并不简单,至少 as far as I know .保持本地最新的克隆可能是您最好的选择,听起来您在这方面做得很好。

顺便说一句,我不认为缓存在这里是相关的,因为更新 Hook 是每个引用一次。是的,您可以在预接收 Hook 中执行此操作,它会获取标准输入上的所有引用,但我不明白您为什么要费心做更多的工作。这不会是一项昂贵的操作,并且使用更新 Hook ,您可以单独接受或拒绝被推送的各个分支,而不是阻止所有更新,因为只有一个是坏的。

如果您想省去一些麻烦,我可能只是避免解析 gitmodules 文件,并将列表硬编码到 Hook 中。我怀疑您的子模块列表经常更改,因此维护它可能比编写自动化的东西更便宜。

关于git - 编写拒绝无效子模块提交的 git update hook 的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4763687/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com