我正在玩项目工作流程和Git,我想找出一种与主存储库“对话”的好方法。
我想知道的一件事是如何实现像Gerrit使用的“for”这样的神奇引用,其中提交被推送到“refs / for / xxxx / topic”以便设置最终目标分支而不直接放置东西那里。有没有办法用前/后接收挂钩来实现这一点,我们的Java实现是一个特殊功能吗?
干杯
答案 0 :(得分:2)
refs/for/branch
是Gerrit git服务器的“神奇”功能。据我所知,没有办法使用默认的git-receive-pack
或git-http-server
实现来复制它。
答案 1 :(得分:0)
然而,可以使用普通的git repo和hook来近似它。为了干净利落,我们需要两个钩子:
update
hook:收到一些特别的内容,包括创建新的refs post-receive
hook:只需删除update:git update-ref -d ${refname}
如果您不关心客户端返回错误的可能性,您可以在post-receive
挂钩中执行所有操作。
post-receive
挂钩是必要的,因为在update
脚本成功返回后将创建引用。
如果两个用户同时推送它甚至可以工作。可能有一个短暂的竞争条件虽然在创建ref但在post-receive hook删除它之前,我从未遇到过这个但我确实希望它是从我对git如何工作的肤浅理解发生的。因此,如果你对这个神奇的裁判有很大的推动流量,这可能不是一个合适的解决方案。
我用它来克隆临时目录中的repo并产生docker图像构建。我编码要在ref名称中构建的图像的名称。 (我不需要像gerrit那样创建一个真正的引用,但它是可能的)