从 git hook 调用脚本

问题描述 投票:0回答:1

假设我在 server /hooks 文件夹中有两个脚本:

第一个启动日志记录并写入有关推送的基本信息:(接收后)

#!/bin/sh
read oldrev newrev refname
LOGFILE=post-receive.log
echo " push - Old SHA: $oldrev -> $newrev >> $LOGFILE
sh ./post-receive-logic >> $LOGFILE

第二个进行实际部署:(接收后逻辑)

#!/bin/sh
cd ~/proj
pm2 stop ~/proj/main.js
git --git-dir ~/proj/.git --work-tree ~/proj pull
npm install
pm2 restart ~/proj/main.js
echo "finished"

当我推送提交时,第二个脚本永远不会被调用:工作树没有更改,没有服务器被终止并重新启动,没有特定于第二个脚本的输出。

如果我手动调用

./post-receive-logic
,一切都会正常,服务器停止,文件被拉取,服务器再次启动。

我尝试在没有

sh
的情况下调用它,如下所示:

./post-receive-logic >> $LOGFILE

但运气不佳。

我做错了什么?

bash git githooks
1个回答
4
投票

练习:在接收后挂接操作期间,

.
(或
$PWD
)在哪里?

you 运行它时,它就是 your

$PWD
是什么。当它自动运行时呢? (查看接收系统的裸 git 存储库:您的
$LOGFILE
输出将位于该目录中。)

(您发布的钩子文本中缺少闭合引号,因此大概您手动复制了脚本的某些部分,也许还缺少其他内容。另外,请确保钩子具有执行权限。但我的猜测是你被 git 运行钩子的事实所困扰,其中

$PWD
设置为
.git
目录,而不是钩子目录。)

(旁注:你的钩子可能不完整,因为它只读取一个

oldrev newrev refname
,但是一个
git push
可以推送许多引用。通常你应该循环:
while read oldrev newrev refname; do ...; done
。如果你有一个拒绝推送的预接收钩子不过,推送多个引用时,这个特定的接收后挂钩可能是正确的。)

© www.soinside.com 2019 - 2024. All rights reserved.