2011-04-11 75 views
26

我克隆了GHC(格拉斯哥Haskell編譯器)存儲庫。爲了構建編譯器,你需要幾個庫,它們也都可以用作git庫。爲了緩解這些情況,GHC黑客們包括一個腳本sync-all,該腳本在執行時會更新所有相關的存儲庫。如何在git中獲取或拉取命令後立即執行命令?

現在我的問題:我怎麼能讓git自動執行之後我自動執行了git pull?我聽到有關使用鉤子的一些信息,但我不知道,我必須做什麼。

+2

檢查文檔的Git鉤子:http://www.kernel.org/pub/software/scm/git/docs/githooks.html – 2011-04-11 15:00:43

+0

http://stackoverflow.com/questions/4185400/is-there- any-git-hook-for-pull – 2016-02-14 15:43:58

回答

25

post-receivepost-update鉤通常被用於這種任務,每個推後執行。
收到後10後更新鉤之間的區別是在參數:一個post-receive將除了他們的名字之外,還會得到所有裁判的舊值和新值。

缺失的部分是:鉤在哪裏執行?

的博客文章「Missing git hooks documentation」從(大),所以貢獻者Mark Longair揭示了一些這方面的光:

當前工作目錄將是git的目錄

  • 因此,如果這是一個純倉庫稱爲「/src/git/test.git/」,這將是當前工作目錄 - 如果這是一個非純倉庫和工作樹的頂層是「/home/mark/test/」,那麼當前工作目錄將是「/home/mark/test/.git/

Chris Johnsen細節在他SO answer:「如果–-git-dirGIT_DIR指定,但沒有指定的-–work-treeGIT_WORK_TREEcore.worktree,目前WOR king目錄被認爲是你工作樹的頂層目錄。「

換句話說,你的工作樹也將是當前目錄(.git目錄),這幾乎可以肯定是不是你想要什麼

確保您hook/post-receive腳本,一旦創建和爲可執行,設置GIT_WORK_TREE在正確的道路,爲了讓您的到合適的目錄執行(即不「xxx.git」一節)。

+8

post-receive和post-update掛鉤在git推後運行在遠程repo上。這不會幫助在git pull之後在本地回購站上運行它。 – decocijo 2012-07-20 08:07:26

+1

@decocijo是的,這個想法是*推*到裸露的回購站,這將觸發post-receive鉤子並轉到非裸回購商店,在那裏製作'git pull'。 – VonC 2012-07-20 12:20:43

14

當您運行git pull時,git實際上會執行一次提取操作,然後進行合併。這意味着您可以使用post-merge鉤子在拉取完成時執行腳本。

要設置此項,只需在存儲庫的.git/hooks/目錄中創建一個可執行腳本,該目錄名爲post-merge

請注意,如果合併由於衝突而失敗,則不會運行此腳本。

+4

然而,這對'git fetch'不起作用。此外,你可以做'git pull --rebase',所以你必須爲'post-rewrite'添加一個鉤子。但即使如此,你將無法區分獨立的合併/重新綁定和後來的一個... – 2016-02-14 15:42:42

+0

根據分支配置,即如果它被配置爲重新綁定或合併,分別進行重新綁定或合併後。 – solstice333 2016-03-14 11:42:58