簡體   English   中英

如何在運行服務器預接收鈎子時有效地找到分支的最新共享提交?

[英]How to efficiently find the newest shared commit of a branch while running server pre-receive hook?

當服務器預接收掛鈎腳本正在執行時,假設它接收到一個名為 baz 的新分支。 分支 foo、qqaz 和 bar 是現有分支。 如何有效地找到 baz 的最新共享提交(在下面的示例中是提交 3。不是提交 2 和 1)?

---0---1                   foo
        \
         \   8---9---10    qqaz
          \ /
           2---3---4       bar
                \
                 5
                  \
                   6---7   baz

有點復雜,但應該給出正確的結果:

git rev-list baz | grep -Ff <(git rev-list foo qqax bar) | head -1

如果您的 shell 不理解<(...)運算符,您可以使用臨時文件:

git rev-list foo qqax bar > /tmp/commit-list.txt
git rev-list baz | grep -Ff /tmp/commit-list.txt | head -1

另一種方法可以是依次獲取baz和目標分支的merge-base ,並保留最新的提交。

在所有情況下正確執行此操作從“非常棘手”到“不可能”,因為git push可以在一個 go 中接收更改、添加和/或多個分支名稱的請求。 也就是說,僅僅因為您的接收 Git 具有名為fooqqazbar的分支,分別標識提交 1、10 和 4現在並不意味着推送完成時會出現這種情況:它可能包含將foo設置為的請求提交 0,添加一個新的提交 11 並將qqaz設置為指向該提交,添加幾個新的提交超過 4 和更新bar ,等等。

但是,如果您將git push限制為單個分支名稱更新(如果您控制各種鈎子,您可以這樣做),那么問題變得更加容易處理。 訣竅是在對任何分支名稱進行任何更改之前識別預接收掛鈎本身運行。 如果baz是一個新的分支名稱,則在存儲庫中的所有分支名稱中還沒有名稱,用於提交 7。(可能已經有任何這些提交的標簽名稱,或者標簽名稱創建或更新在此推送要更新的參考列表中:在設計算法時一定要考慮這些。)

如果我們利用它,那么:

  • push請求中有一行格式為000...000 <hash-of-7> refs/heads/baz ,表示如果接受此推送,將添加分支名稱baz
  • git rev-list <hash-of-7> --not --branches --topo-order列出提交 7、6 和 5;
  • 5 的父母是 3。

如果新提交序列中有任何合並提交,事情就會變得更加復雜:

---0---1                   foo
        \
         \   8---9---10    qqaz
          \ /
           2---3---4       bar
            \   \
             ----5
                  \
                   6---7   baz

這里的提交 5 是一個合並,結合了提交 2 和 3。我不確定在這種情況下你想找到哪個提交。

通常,當您希望檢查提交圖時, git rev-list是用於執行此操作的 Git 工具。 --branches選項告訴它使用所有分支名稱; --tags告訴它使用所有標簽名稱; --all告訴它使用所有引用。 選項中的--not會導致后續引用成為“負面引用”,就像您列出了^refs/heads/dev以排除分支dev一樣。 1您也可以列出要包括或排除的特定模式。 有關詳細信息,請參閱git rev-list文檔


1 A later --not取消較早的,因此:

git rev-list HEAD --not br1 br2 br3 --not br4

與以下內容相同:

git rev-list HEAD ^br1 ^br2 ^br3 br4

通常,正面和負面參考的順序並不重要。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM