Hook post-receive 在从本地推送到远程存储库后不起作用

Hook post-receive does not work after push from local to remote repository

问题描述:

我在 git 存储库中自动启动 post-receive 挂钩时遇到问题。 从本地推送到远程仓库后,hook post-receive 只是不执行。


我做的步骤:

  1. 我在本地机器上创建了一个 (non-bare) 存储库并创建了多个提交
  2. 我在远程机器 (bare) 上创建了一个存储库,在那里创建了一个 post-receive 挂钩并将其设置为 chmod to 755
  3. 在本地机器上我添加了一个远程存储库(git 远程添加.....)
  4. 我推 运行 正确
  5. 不幸的是,钩子没有发射

我的环境:


post的内容-在远程机器上接收文件:

#!/bin/sh
git --work-tree=/home/xxxxxx/xxxxxx/public_html/prod --git-dir=/home/xxxxxx/xxxxxx/dev.git checkout -f


其他SO解决方案?:

是的,我见过很多,但是none解决了我的问题。 我已经看到一些关于 "unset GIT_DIR" 建议的答案,但我担心这与它无关,因为即使 echo test > log.txtpost-receive 中也不起作用。貌似post-receive无法启动?

好的,我发现问题所在 - 主机上的分区挂载为 noexec。如果是这样,挂钩将无法工作。

这是出于安全考虑。这是共享主机的典型情况。


我的备选方案:

我们可以创建一个 git 别名,您可以在其中 运行 带有 ssh 日志记录的 bash 脚本和直接在服务器上 运行 git 命令

怎么做?

在本地仓库配置文件中我们添加一个别名:

[alias]
    run = "!sh ./hook.sh"

(如您在示例中所见,此别名将启动 hook.sh 文件)

现在我们用 git 命令创建一个 hook.sh 文件

#!/bin/bash

ssh user@host -p [port] 'bash -s' <<-EOF
    git --work-tree=/home/xxxxxx/xxxxxx/public_html/prod --git-dir=/home/xxxxxx/xxxxxx/dev.git checkout -f
    exit
EOF

现在我们只需要使用git run命令

注意:这只是一个简单的例子。你必须在你的环境中测试它!