[英]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.