【问题标题】:How to execute a command right after a fetch or pull command in git?如何在 git 中的 fetch 或 pull 命令后立即执行命令?
【发布时间】:2011-08-03 03:39:29
【问题描述】:

我克隆了 GHC(Glasgow Haskell 编译器)存储库。为了构建编译器,您需要几个库,它们都可以作为 git 存储库使用。为了方便用户使用,GHC 黑客包含了一个脚本sync-all,在执行时会更新所有依赖的存储库。

现在我的问题是:在我自动执行git pull 之后,如何让 git 执行 ./sync-all pull?我听说过一些关于使用钩子的事情,但我真的不知道,我必须做什么。

【问题讨论】:

标签: git ghc githooks


【解决方案1】:

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

post-merge client-side hook (mentioned here) 不会被每次拉取触发(例如,不是在拉动变基中,不是在快进合并的情况下)

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


原始答案(2011 年)

如果您在服务器端需要它,您可以在每次推送到裸存储库(在服务器上)之后签出裸存储库并从工作树(在服务器上)拉出:

post-receivepost-update 钩子一般用于此类任务,每次推送后执行。
post-receivepost-update 钩子之间的区别在于参数:post-receive 将同时获取所有 ref 的旧值和新值他们的名字。

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

来自(伟大的)SO 贡献者Mark Longair 的博文“Missing git hooks documentation”对此有所说明:

当前工作目录将是 git 目录

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

Chris Johnsen在他的SO answer中详细说明:“如果指定了–-git-dirGIT_DIR,但没有指定-–work-treeGIT_WORK_TREEcore.worktree,则认为当前工作目录为顶层工作树的目录。”

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

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

【讨论】:

  • post-receive 和 post-update 钩子在 git push 后在远程 repo 上运行。这无助于在 git pull 后在本地 repo 上运行它。
  • @decocijo 是的,这个想法是 push 到一个裸仓库,这将触发一个接收后挂钩并转到一个非裸仓库,使 @987654344 @那里。
  • 这不是拉后运行命令的答案。推送到该存储库后运行接收后或更新后。
【解决方案2】:

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

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

请注意,如果由于冲突导致合并失败,则不会运行此脚本。

【讨论】:

  • 这不适用于git fetch。此外,还可以使用git pull --rebase,因此您也必须为post-rewrite 添加一个钩子。但即便如此,您也无法区分独立的合并/变基和拉动后的合并/变基...
  • 取决于分支配置,即如果它被配置为变基或合并,您可以分别有一个预变基或后合并。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-01
  • 2016-11-03
  • 1970-01-01
  • 2014-07-17
  • 1970-01-01
  • 2014-02-06
相关资源
最近更新 更多