我克隆了GHC(格拉斯哥Haskell编译器)存储库。为了构建编译器,您需要几个库,它们都可以作为git存储库使用。为了方便现场使用,GHC黑客包括一个脚本sync-all
,在执行时会更新所有相关的存储库。
现在回答我的问题:在我自动执行./sync-all pull
后,如何让git执行git pull
?我听说过使用挂钩,但我真的不知道,我该怎么做。
答案 0 :(得分:27)
如果您需要在客户端(您的机器)git pull
之后执行脚本,那么就没有可靠的解决方案。
post-merge client-side hook(mentioned here)不会被每次拉动触发(例如,不是拉动rebase,不是快进合并的情况)
所以包装两个命令的别名仍然是一种可能的解决方法。
原始答案(2011)
如果您需要在服务器端,在每次推送到裸仓库(在服务器上)之后,您将检查裸仓库并从工作树(在服务器上)拉出:
post-receive
或 post-update
挂钩通常用于此类任务,每次推送后执行。
post-receive 和 post-update 挂钩之间的区别在于:a post-receive
将获取所有refs的旧值和新值除了他们的名字。
缺少的部分是:该钩子自己执行的地方?
来自(一位伟大的)SO撰稿人Missing git hooks documentation的博文“Mark Longair”对此有所了解:
当前工作目录将是git目录。
Chris Johnsen中的
- 因此,如果这是一个名为“
/src/git/test.git/
”的裸存储库,那将是当前的工作目录 - 如果这是非裸存储库且工作树的顶层为“/home/mark/test/
”,则当前工作目录将为“/home/mark/test/.git/
”SO answer个详细信息:“如果指定了
–-git-dir
或GIT_DIR
,但-–work-tree
,GIT_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
的可执行脚本。
请注意,如果合并因冲突而失败,则不会运行此脚本。