Hook post-receive 在从本地推送到远程存储库后不起作用
Hook post-receive does not work after push from local to remote repository
问题描述:
我在 git 存储库中自动启动 post-receive
挂钩时遇到问题。
从本地推送到远程仓库后,hook post-receive
只是不执行。
我做的步骤:
- 我在本地机器上创建了一个 (
non-bare
) 存储库并创建了多个提交
- 我在远程机器 (
bare
) 上创建了一个存储库,在那里创建了一个 post-receive
挂钩并将其设置为 chmod to 755
- 在本地机器上我添加了一个远程存储库(git 远程添加.....)
- 我推 运行 正确
- 不幸的是,钩子没有发射
我的环境:
- 本地机器:
GIT 2.25.0.windows.1
@Win10 (1909)
- 远程机器:
GIT 2.25.0
@Debian 8.11 (jessie)
post的内容-在远程机器上接收文件:
#!/bin/sh
git --work-tree=/home/xxxxxx/xxxxxx/public_html/prod --git-dir=/home/xxxxxx/xxxxxx/dev.git checkout -f
- 注意:当我直接从 ssh 控制台 运行 这段代码时,它工作正常
其他SO解决方案?:
是的,我见过很多,但是none解决了我的问题。
我已经看到一些关于 "unset GIT_DIR" 建议的答案,但我担心这与它无关,因为即使 echo test > log.txt
在 post-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
命令
注意:这只是一个简单的例子。你必须在你的环境中测试它!
问题描述:
我在 git 存储库中自动启动 post-receive
挂钩时遇到问题。
从本地推送到远程仓库后,hook post-receive
只是不执行。
我做的步骤:
- 我在本地机器上创建了一个 (
non-bare
) 存储库并创建了多个提交 - 我在远程机器 (
bare
) 上创建了一个存储库,在那里创建了一个post-receive
挂钩并将其设置为 chmod to 755 - 在本地机器上我添加了一个远程存储库(git 远程添加.....)
- 我推 运行 正确
- 不幸的是,钩子没有发射
我的环境:
- 本地机器:
GIT 2.25.0.windows.1
@Win10 (1909)
- 远程机器:
GIT 2.25.0
@Debian 8.11 (jessie)
post的内容-在远程机器上接收文件:
#!/bin/sh
git --work-tree=/home/xxxxxx/xxxxxx/public_html/prod --git-dir=/home/xxxxxx/xxxxxx/dev.git checkout -f
- 注意:当我直接从 ssh 控制台 运行 这段代码时,它工作正常
其他SO解决方案?:
是的,我见过很多,但是none解决了我的问题。
我已经看到一些关于 "unset GIT_DIR" 建议的答案,但我担心这与它无关,因为即使 echo test > log.txt
在 post-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
命令
注意:这只是一个简单的例子。你必须在你的环境中测试它!