繁体   English   中英

在git pre-receive钩子中访问Notes

[英]accessing Notes in a git pre-receive hook

我们遇到了带有提交消息规则的“鸡与蛋”情况。 提交才能知道一条信息。 我们认为,除了要求用户修改提交(如果提交较旧,也可以重新设置基础)之外,如果用户可以通过“注释”机制添加信息,那就更好了。 好,到目前为止,很好。

问题是,如果commit + notes信息不遵守规则,我希望'pre-receive'挂钩能够使推送失败。 但是,我似乎无法弄清楚如何查看给定提交的注释,除非注释已经在提交之前被推送了。

我可以简单地让注释推送不经过检查,然后在看到提交时检查提交消息及其注释。 但是,这不是一个理想的解决方法。 我们可以保证顺序将首先是笔记,然后是提交。 但是,这是一个hack。 如果提交+注释由于注释中的信息而失败,该怎么办? 这意味着允许修改的注释需要进行修改。

相反,我想同时获取注释和提交(类似于git push origin refs/notes/* refs/heads/<branch> )。 我们可以控制它,因为我们的推送使用包装器脚本。 如果两个推动同时发生,那么我应该能够通过/失败整个过程。 没有错误信息通过。

但是我一生都无法弄清楚如何看笔记。 理想的做法是在推送中的每个提交上都使用git log --format=%N -1 <commit>之类的东西。 但是我猜这什么都没有产生,因为提交和注释都还没有通过。 我尝试过git notes list ,希望可以打印出哈希指向的对象( git cat-file -p <hash> )。 但是git notes list也不会产生任何效果。

有想法吗? 谢谢。

接收前挂钩获取所有参考更新(在stdin上),因此您可以通读所有这些参考更新,查看是否有refs/notes/更新,通读注释,然后将规则应用于基础notes 对象 但是,这非常痛苦:您将不得不深入研究notes的实现,因为(如您所述) refs/notes/引用本身尚未更新,因此git log找不到新的注释。

或者,您可以手动更新hook内的注释参考更新。 不过,这至少有点危险:您需要在继续操作之前“撤消”此更新(使更新看起来像应该的那样原子化) 并确保没有其他人使用注释或Git存储库,在这段时期。 (其原因很复杂且与Git版本有关:新的Git将传入对象放置在单独的备用对象存储中,使它们可用于预接收和更新挂钩,但通常不可用,因此不需要传入对象如果拒绝推送则将其丢弃。)

我认为eckes的建议(在评论中)也许是要走的路。 为了使其更加复杂和自动,您可以使用gitnamespaces而不是禁止或允许对refs/heads/foo的推送,从而使所有推送最终都到达refs/proposed/refs/heads/foo (并要求是所说名称的新创造)。 然后,在接受推送之后,运行检查更新的后处理过程。 如果很好,请将其移至refs/heads/foo 如果不是,则无论如何都删除refs/proposed/refs/heads/foo名称,并发送推送电子邮件的人,说他们的推送已自动回滚。 这个想法有一个明显的缺点:他们的Git会认为推送已被接受,并且他们将不得不重新运行git fetch来将其refs/remotes/origin/foo为未更新的值。 另外,从技术上讲,要确切地知道是谁进行了推送是很困难的,除非您使用唯一的用户信息(您可以在接受refs/proposed/refs/heads/foo的同时进行记录)通过ssh进行所有推送。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM