我正在编写一个服务器端更新挂钩,并希望只处理推送之前不在存储库中的推送提交,即推送引入的提交。起初我打算做git rev-list <oldrefvalue>..<newrefvalue>
,但如果其中一个新提交是现有分支的合并,则可以包括现有提交。我想出了几种方法,但没有一种让我感到振奋:
git rev-list <oldrefvalue>..<newrefvalue>
中的每次提交,请执行git rev-list --all | grep <commit>
以查看它是否为现有提交(显然我会缓存git rev-list --all
的结果。)git for-each-ref --format="^%(objectname)" refs/heads | xargs git rev-list <newrefvalue>
以使所推送的ref可以访问所有提交但不能通过任何现有分支访问这些方法中的任何一种都优于另一种方法,还是有更好的方法来解决这个问题?
答案 0 :(得分:1)
假设你真的想使用update
钩子,比如
git rev-list <newrefvalue> --not --branches --tags
应该做你需要的。它将跳过任何分支或标记中已存在的所有提交。但是如果使用相同的新提交推送多个分支,它将运行几次。您可以使用pre-receive
挂钩来避免它,它会立即处理所有引用更新,并将整个新提交列表作为:
git rev-list <newrefvalue1> <newrefvalue2> .. <newrefvalueN> --not --branches --tags
简而言之,看起来它只输出一次提交。
请注意,它仅适用于在 ref更新之前运行的挂钩,即udpate
和pre-receive
。例如,它不适用于post-update
。