簡體   English   中英

我將如何在 Git 中編寫預合並掛鈎?

[英]How would I write a pre-merge hook in Git?

這個問題說明了一切。 有沒有辦法在合並之前執行操作? 我猜有一種方法可以使用pre-commit鈎子,但我不太確定。

您可以嘗試使用prepare-commit-msg掛鈎。 第二個參數將是merge “如果提交是合並或.git/MERGE_MSG文件存在”。 非零退出狀態將中止提交。

我認為這不適用於快進合並,因為不會有提交消息。

有關鈎子的更多信息: https ://www.kernel.org/pub/software/scm/git/docs/githooks.html#_prepare_commit_msg

使用 Git 2.24(2019 年第四季度),無需腳本包裝器或准備消息掛鈎。

引入了一個新的“ pre-merge-commit ”鈎子。

請參閱Michael J Gruber ( mjg )提交 bc40ce4提交 6098817提交 a1f3dd7 (2019 年 8 月 7 日)。
請參閱Josh Steadmon ( steadmon )提交 f78f6c7 (2019 年 8 月 7 日)。
(由Junio C Hamano -- gitster --提交 f76bd8c中合並,2019 年 9 月 18 日)

git-merge : 尊重pre-merge-commit鈎子

git-merge在進行自動合並提交時不遵守 pre-commit 鈎子,出於兼容性原因,這將保留。

引入一個pre-merge-commit鈎子,它被稱為自動合並提交,就像 pre-commit 被稱為非自動合並提交(或任何其他提交)一樣。

文檔現在包括:

合並前提交

這個鈎子由git-merge調用。
它不帶任何參數,並在成功執行合並后且在獲取建議的提交日志消息以進行提交之前調用。
從此腳本中以非零狀態退出會導致git merge命令在創建提交之前中止。

默認的“pre-merge-commit”鈎子在啟用時運行“pre-commit”鈎子,如果后者被啟用的話。

使用環境變量GIT_EDITOR=:如果該命令不會調出編輯器來修改提交消息。

如果無法自動執行合並,則需要解決沖突並單獨提交結果(參見git-merge )。
此時,不會執行此鈎子,但如果啟用了“ pre-commit ”鈎子,它將執行。


使用 Git 2.36(2022 年第二季度), run_commit_hook()的調用者會了解它是否因為鈎子成功或沒有任何鈎子而獲得“成功”。

請參閱Ævar Arnfjörð Bjarmason ( avar )提交 a8cc594提交 9f6e63b (2022 年 3 月 7 日)。
(由Junio C Hamano -- gitster --提交 7431379中合並,2022 年 3 月 16 日)

merge :不要在--no-verify上運行掛鈎后邏輯

簽字人:Ævar Arnfjörð Bjarmason

修復bc40ce4中引入的一個小錯誤(“ merge : --no-verify to bypass pre-merge-commit hook”,2019-08-07,Git v2.24.0-rc0 -- merge批次 #3中列出),當那個更改使--no-verify選項繞過了pre-merge-commit鈎子,它沒有更新相應的find_hook() (后來的hook_exists() )條件。

從前面的6098817提交中可以看出(“ git-merge : Honor pre-merge-commit hook”,2019-08-07,Git v2.24.0-rc0 -- merge批次 #3中列出)兩者應該去手牽手。
如果鈎子不可能更新索引,那么在這里調用discard_cache()是沒有意義的。

我們在這里使用"hook_exist() ”是有問題的,正如在隨后的提交中所討論的,它會受到我們即將修復的模糊競爭條件的影響,但現在這個更改是一個嚴格的改進,保留了與按原樣使用"hooks_exist() ”。

另一個不錯的解決方法是添加一個 shell 腳本,像你想要的那樣調用它,然后將這些行添加到腳本中:

git() {
    if [ "$1" == "merge" ]; then
        echo "seems to work like a charme"
    fi
    command git "$@"
}

git "$@"

然后做一個

alias git="./my-pre-merge-script.sh"

那你就可以走了。 您剛剛添加了自己的預合並鈎子。 我知道,您無法訪問 git 將傳遞給真正的 pre-merge 鈎子的任何參數,但您現在可以准備文件或任何您想要准備合並的東西; 我個人對這種方法非常滿意:我花了 2 到 3 天的時間來尋找一些用於 pre-merge 的東西,然后我不得不使用 pre-commit-msg,但我發現它對我的需求不夠准確。 這解決了我所有的問題。 希望這對將來的任何人都有幫助。

暫無
暫無

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

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