【问题标题】:Post-receive hook in bare裸露的接收后挂钩
【发布时间】:2019-12-25 19:49:04
【问题描述】:

我有一个裸仓库。我有一个非裸存储库。 在我的裸存储库中,我有以下内容:

git --work-tree=/C:/user/gitlab/data diff-tree --name-status -r master develop

这里我们在非裸存储库中有 master 和 develop 分支 当我在工作树(非裸存储库)中运行它时,这工作正常

当我在接收后将它放入我的裸存储库 (/user/gitlab/shared.git/hooks) 时,它不起作用。

我尝试了上面的内容。 我不知道如何准确地比较我的主分支和我的开发分支并显示它的状态。

while read oldrev newrev ref
do 
      git --work-tree=/C:/user/gitlab/data/ diff-tree --name-status -r master develop
done

在非裸存储库上推送时,是否可以比较裸存储库中的两个分支? (这是在提交文件之后)

【问题讨论】:

    标签: bash git git-bash


    【解决方案1】:

    鉴于您在裸存储库中使用钩子,您需要注意您从未真正比较两个分支。无论您对单词 branch 使用哪种定义,这都是正确的(请参阅What exactly do we mean by "branch"?)。您在这里与git diff-tree 真正比较的是两个提交1

    从根本上说,像master(实际上是refs/heads/master)或v2.1(实际上是refs/tags/v2.1)这样的名称只包含一个提交哈希ID。那是 a 哈希 ID,就像在一个单独的、单独的哈希 ID 中一样。请参阅链接问题,了解一个哈希 ID 如何表示多个提交。

    git diff 系列中的那些想要查看提交 的命令会将名称转换为原始哈希ID,然后像您输入原始哈希ID 一样继续操作。因此,如果你运行:

    git rev-parse master
    

    它会打印7c20df84bd21ec0215358381844274fa10515017,你可以在任何你写master的地方写下大而丑陋的哈希ID。 branch names 的特别之处在于它们移动,并且会自动移动——但是当您处于 pre-receive 和 post-receive 挂钩时,您必须格外小心这是因为他们移动的时间很棘手。这就是为什么你应该使用这样的循环:

    while read oldrev newrev ref; do ...; done
    

    这些循环读取三个项目:两个哈希 ID 和一个完整的参考名称。这两个哈希 ID 是引用的 previous 值(过去是完整引用名称解析的哈希值)和 new 值,即引用的哈希 ID参考将很快代表。最后一项是全名:refs/heads/masterrefs/tags/v2.1,以此类推。名字的前面部分告诉你它是什么种类,名字的其余部分,在去掉前面部分后,是分支或标签或其他名字。

    pre-receiveupdate 钩子中,名称本身还没有改变,所以名称应该解析为旧的哈希。你的钩子的工作是验证这些提议的更新是否应该被允许。在 post-receive 挂钩中,名称本身更改。您应该使用散列 ID,而不是现在将名称解析为散列 ID,因为 另一个 更改可能正在等待或已经发生,这取决于您的接收后挂钩本身有多慢。

    您在预接收或更新挂钩中生成的任何输出都将被复制到执行触发挂钩运行的git push 操作的任何人。 (此输出将以单词remote: 为前缀,并且在您发送完整行之前不会出现。)您在接收后挂钩中生成的任何输出都将被丢弃!如果您希望将其保存在服务器上,则必须将其发送到日志文件或日志服务或类似服务。

    不需要--work-tree 参数(使用一个参数可能不明智),但您可能需要在预接收或更新挂钩中完成工作,并酌情使用原始哈希 ID。是否要更新 refs/heads/master refs/heads/develop 的值由您决定,是否建议更新这两个名称。如果 既不 refs/heads/master 也不 refs/heads/develop 建议更新,是否打印 git diff-tree 的结果也取决于您。


    1您可以直接比较树,git diff-tree 的形式可以产生多于两棵树的组合差异,但在这里使用master develop '非常清楚地选择了masterdevelop 的提示提交。

    【讨论】:

    • 这很有帮助!谢谢!
    • 所以最后我不能去我在 post-receive 中的裸存储库并比较来自 master 和 feature 分支的两个提交? (因为这不是最好的方法?)
    • 它只是没有意义的公式化。您的 post-receive 挂钩被调用因为某些名称已更新。阅读标准输入(所有行)以找出哪些名称,以及它们的旧哈希 ID 和新哈希 ID。您可以使用它们生成电子邮件或其他一些离线类型的输出并将其发送到某处,但您不能将其直接发送给运行git push 的人。
    • 你是对的。我很困惑。现在这是有道理的。谢谢你!
    猜你喜欢
    • 2013-01-05
    • 1970-01-01
    • 2015-07-28
    • 1970-01-01
    • 2015-03-15
    • 2011-12-28
    • 1970-01-01
    • 1970-01-01
    • 2015-11-25
    相关资源
    最近更新 更多