【问题标题】:Automatic Deployment with Git - unable to run post-receive hooks使用 Git 自动部署 - 无法运行接收后挂钩
【发布时间】:2015-12-18 00:52:07
【问题描述】:

我在 /var/repo/myrepo.git 中使用

创建了一个存储库
git init --bare

还有一个带有内部的 post-receive 钩子:

#!/bin/sh
git --work-tree=/var/www/domain.com --git-dir=/var/repo/myrepo.git checkout -f

然后:

chmod +x post-receive

现在,从本地推送到远程工作正常,我知道这是因为我可以看到我的本地分支

/var/repo/myrepo.git/refs/heads

但问题是钩子不起作用。

如果我从终端运行:

git --work-tree=/var/www/domain.com --git-dir=/var/repo/myrepo.git checkout -f

repo 中的所有文件都复制到 /var/www/domain.com

那么为什么钩子不起作用,但如果从 bash 执行,里面的命令却可以呢?

UPDATE_1

按照建议,在 /var/repo/myrepo.git/hooks/post-receive 我正在使用:

git --work-tree=/var/www/domain.com --git-dir=/var/repo/myrepo.git checkout -f >/tmp/mylogfile 2>/tmp/mylogfile

该文件是可执行的,因为我可以运行它:

./post-receive

这会按预期复制我的 warking 目录中的所有 repo 文件,但文件 "/tmp/mylogfile" 是空的。

【问题讨论】:

  • 会不会是git 在您的终端中的$PATH 中,但在挂钩运行时却不在?
  • 老实说我不知道​​...我该如何检查?我已经用“apt-get install”安装了 git
  • 在你的post-receive钩子里做一个echo $PATH > /tmp/mypath && type git >> /tmp/mypath。如果知道git 命令,type git 将打印出路径。如果命令未知,type git 将打印错误。执行git push,然后检查/tmp/mypath 的内容。如果文件丢失,则挂钩根本没有运行。试试type git 在您的普通终端上打印的内容。
  • 我已经按照你的建议做了,但是 "ls -l /tmp" 返回 0 个文件...终端上的 "type git" 返回 "/usr/bin/git"
  • 你的钩子没有运行。这就是为什么没有文件。 stackoverflow.com/questions/8206023/… 可能会给你一些有用的提示

标签: git ubuntu vps githooks


【解决方案1】:

如果 hooks/post-receive 不起作用并且您已将文件正确设置为可执行文件并且您会看到以下消息:

Everything up-to-date

可能是因为你的推送没有新的变化。所以更改一个文件并提交它并再次推送。

如果您看到此消息:

remote: fatal: You are on a branch yet to be born

您可以通过在推送您想要的分支之前先推送您的主分支来解决它:

git push serverRemote master

在此之后,工作树目录中的文件将成为主分支文件。如果您想在每次推送后使用所需的分支文件更新文件,则必须从服务器中的裸存储库中检出所需的分支(您必须在命令中输入您的工作树目录):

git --work-tree=/path/to/work/tree checkout yourDesiredBranch

【讨论】:

    【解决方案2】:

    您可以尝试通过将 stdout 和 stderr 输出到文件来调试脚本

    #!/bin/sh
    git --work-tree=/var/www/domain.com --git-dir=/var/repo/myrepo.git checkout -f >/tmp/mylogfile 2>/tmp/mylogfile
    

    如果在运行此挂钩后/tmp/mylogfile 为空,则脚本根本不会运行,否则将包含有用的错误消息。

    【讨论】:

    • 我已经尝试了您的建议,但没有在 /tmp 下创建文件。我知道脚本没有运行,但我不知道为什么,因为我已经完成了(chmod +x post-receive)
    • 挂钩文件在哪里?你能给出完整的路径吗?
    • "/var/repo/myrepo.git/hooks/post-receive"。我使用“admin”用户从 sourcetree 推送(没有错误): ssh://admin@mydomain.com/var/repo/myrepo.git ; “admin”用户是 repo 和工作目录的所有者。
    【解决方案3】:

    我遇到了与 OP 相同的问题,并意识到这个答案是我的解决方案:

    https://stackoverflow.com/a/32337074/2100999

    我将钩子命名为post-receieve,而不是post-receive。当我重命名文件时,我的钩子工作得很好。

    教训:拼写很重要!

    【讨论】:

      猜你喜欢
      • 2012-08-08
      • 2011-12-28
      • 1970-01-01
      • 2017-05-03
      • 2015-12-14
      • 2012-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多