从git hook调用脚本

carvr3hs  于 2023-10-14  发布在  Git
关注(0)|答案(1)|浏览(117)

假设我在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

但没找到
我做错了什么?

qvtsj1bj

qvtsj1bj1#

练习:在postreceive hook操作期间,.(或$PWD)在哪里?
当你运行它的时候,它就是你的$PWD。如果是自动运行呢?(查看接收系统的裸git仓库:您的$LOGFILE输出将在该目录中。
(在你的帖子中的钩子文本中缺少一个结束引用,所以大概你手工复制了脚本的某些部分,也许还有其他东西丢失。此外,确保钩子具有执行权限。但我猜你可能被git运行hook时将$PWD设置为.git目录,而不是hook目录的事实所吸引。
(Side注意:你的钩子可能不完整,因为它只读取一个oldrev newrev refname,但是一个git push可以推送很多引用。通常你应该循环:while read oldrev newrev refname; do ...; done.如果你有一个pre-receive钩子,它拒绝推送多个ref,那么这个特殊的post-receive钩子可能是正确的。)

相关问题