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

fuz*_*fuz 30 git ghc githooks

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

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

Von*_*onC 27

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

合并后的客户端钩(这里所说的)不会被每个拉触发(例如,不是在拉底垫中,而不是在快进合并的情况下)

因此,包装两个命令的别名仍然是一种可能的解决方法.


原始答案(2011)

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

A post-receivepost-update钩子通常用于这种任务,在每次推送后执行.
差异及其后的接收更新后的钩子是在参数:一个post-receive将获得两老除了自己的名字所有裁判的新值.

缺少的部分是:钩子在哪里执行?

来自(伟大的)SO撰稿人Mark Longair的博客文章" Missing git hooks documentation " 对此有所了解:

当前工作目录将是git目录.

  • 所以,如果这是一个名为" /src/git/test.git/" 的裸存储库,那将是当前的工作目录 - 如果这是一个非裸存储库并且工作树的顶层是" /home/mark/test/"那么当前工作目录将是" /home/mark/test/.git/"

克里斯·约翰森细节在他的SO回答:"如果–-git-dirGIT_DIR有规定,但没有的-–work-tree,GIT_WORK_TREE并且core.worktree,被指定,当前的工作目录被认为是你的工作树的顶端目录"

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

确保您的hook/post-receive脚本一旦创建并可执行,就会设置GIT_WORK_TREE正确的路径,以便您./sync-all pull在正确的目录中执行(即不是" xxx.git").

  • 在git push之后,在远程仓库上运行post-receive和post-update钩子.在git pull之后,这对在本地仓库上运行它没有帮助. (8认同)

nul*_*ity 15

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

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

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

  • 但这不适用于`git fetch`.另外,你可以做`git pull --rebase`,所以你也必须为`post-rewrite`添加一个钩子.但即使这样,你也无法区分独立的合并/转换和拉动之后的合并/转换. (4认同)