2016-02-13 38 views
2

我寫一個服務器端更新掛鉤,並希望只處理沒有在推之前庫推的提交,即正在推出的提交通過推。起初,我打算做git rev-list <oldrefvalue>..<newrefvalue>,但如果其中一個新提交是現有分支的合併,則可以包含現有提交。我想出了這樣做的幾種方法,其中沒有一個令我激動:最好的辦法只處理新提交的更新鉤

  1. 對於每個提交的git rev-list <oldrefvalue>..<newrefvalue>,做git rev-list --all | grep <commit>,看它是否是現有的承諾(很明顯,我將緩存的git rev-list --all結果)。
  2. 不要git for-each-ref --format="^%(objectname)" refs/heads | xargs git rev-list <newrefvalue>讓所有提交由推裁判可達但無法到達通過現有的任何分支

的或者是這些方法的最好其他的,或者是有更好的方法來進行此事?

回答

1

假設你真的想使用update鉤,像

git rev-list <newrefvalue> --not --branches --tags 

應該做你所需要的。它將跳過任何已存在於任何分支或標籤中的提交。但是如果幾個分支被推入相同的新提交,它會運行多次。你可以使用pre-receive鉤代替,它處理一次所有裁判的更新,並獲得新的提交整個列表,避免它:

git rev-list <newrefvalue1> <newrefvalue2> .. <newrefvalueN> --not --branches --tags 

在簡短的測試,它看起來像它輸出每次提交一次。

請注意,它只適用於在之前運行的鉤子,該鉤子更新爲udpatepre-receive。例如,它不適用於post-update