Git魔术参考

时间:2011-07-16 23:28:01

标签: git

我正在玩项目工作流程和Git,我想找出一种与主存储库“对话”的好方法。

我想知道的一件事是如何实现像Gerrit使用的“for”这样的神奇引用,其中提交被推送到“refs / for / xxxx / topic”以便设置最终目标分支而不直接放置东西那里。有没有办法用前/后接收挂钩来实现这一点,我们的Java实现是一个特殊功能吗?

干杯

2 个答案:

答案 0 :(得分:2)

refs/for/branch是Gerrit git服务器的“神奇”功能。据我所知,没有办法使用默认的git-receive-packgit-http-server实现来复制它。

答案 1 :(得分:0)

正如@duskwuff正确指出的那样,它是一个魔术" Gerrit的功能,它通过实际实现一个git服务器(通过jgit)来实现它。

然而,可以使用普通的git repo和hook来近似它。为了干净利落,我们需要两个钩子:

  1. update hook:收到一些特别的内容,包括创建新的refs
  2. post-receive hook:只需删除update:git update-ref -d ${refname}
  3. 创建的引用

    如果您不关心客户端返回错误的可能性,您可以在post-receive挂钩中执行所有操作。

    post-receive挂钩是必要的,因为在update脚本成功返回后将创建引用。

    如果两个用户同时推送它甚至可以工作。可能有一个短暂的竞争条件虽然在创建ref但在post-receive hook删除它之前,我从未遇到过这个但我确实希望它是从我对git如何工作的肤浅理解发生的。因此,如果你对这个神奇的裁判有很大的推动流量,这可能不是一个合适的解决方案。

    我用它来克隆临时目录中的repo并产生docker图像构建。我编码要在ref名称中构建的图像的名称。 (我不需要像gerrit那样创建一个真正的引用,但它是可能的)