如何在git中获取或拉取命令后立即执行命令?

时间:2011-04-11 14:56:33

标签: git ghc githooks

我克隆了GHC(格拉斯哥Haskell编译器)存储库。为了构建编译器,您需要几个库,它们都可以作为git存储库使用。为了方便现场使用,GHC黑客包括一个脚本sync-all,在执行时会更新所有相关的存储库。

现在回答我的问题:在我自动执行./sync-all pull后,如何让git执行git pull?我听说过使用挂钩,但我真的不知道,我该怎么做。

2 个答案:

答案 0 :(得分:27)

如果您需要在客户端(您的机器)git pull之后执行脚本,那么就没有可靠的解决方案。

post-merge client-side hookmentioned here)不会被每次拉动触发(例如,不是拉动rebase,不是快进合并的情况)

所以包装两个命令的别名仍然是一种可能的解决方法。


原始答案(2011)

如果您需要在服务器端,在每次推送到裸仓库(在服务器上)之后,您将检查裸仓库并从工作树(在服务器上)拉出:

post-receive post-update 挂钩通常用于此类任务,每次推送后执行。
post-receive post-update 挂钩之间的区别在于:a post-receive将获取所有refs的旧值和新值除了他们的名字。

缺少的部分是:该钩子自己执行的地方?

来自(一位伟大的)SO撰稿人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_TREE和{{1}都没有指定后,当前工作目录被视为工作树的顶级目录。“

     

换句话说,您的工作树也将是当前目录(core.worktree目录),几乎肯定不是您想要的

确保您的.git脚本在创建并成为可执行文件后,将hook/post-receive设置在正确的路径中,以便在正确的目录中执行GIT_WORK_TREE(即不“./sync-all pull”一个。“

答案 1 :(得分:16)

当你运行git pull时,git实际上会进行提取,然后进行合并。这意味着您可以在完成提取时使用post-merge挂钩执行脚本。

要进行此设置,您只需在存储库的.git/hooks/目录中创建一个名为post-merge的可执行脚本。

请注意,如果合并因冲突而失败,则不会运行此脚本。