从 git 挂钩调用脚本
Call a script from a git hook
假设我在服务器 /hooks 文件夹中有两个脚本:
第一个启动日志记录并写入有关推送的基本信息:(post-receive)
#!/bin/sh
read oldrev newrev refname
LOGFILE=post-receive.log
echo " push - Old SHA: $oldrev -> $newrev >> $LOGFILE
sh ./post-receive-logic >> $LOGFILE
第二个进行实际部署:(post-receive-logic)
#!/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
但运气不好。
我做错了什么?
练习:post-receive hook 操作期间.
(或$PWD
)在哪里?
当你 运行它时,它就是你的 $PWD
。当它自动 运行 时呢? (查看接收系统的裸 git 存储库:您的 $LOGFILE
输出将在该目录中。)
(您的 posting 中的挂钩文本中缺少一个右引号,因此您可能是手动复制了脚本的某些部分,也许还缺少其他内容。此外,请确保hook 具有执行权限。但我的猜测是,git 运行s hooks with $PWD
设置为 .git
目录,而不是挂钩目录。)
(旁注:你的钩子可能不完整,因为它只读取一个 oldrev newrev refname
,但是 git push
可以推送许多引用。通常你应该循环:while read oldrev newrev refname; do ...; done
。如果你有一个预接收钩子拒绝推送多个 ref,不过,这个特定的 post-receive 钩子可能是正确的。)
假设我在服务器 /hooks 文件夹中有两个脚本:
第一个启动日志记录并写入有关推送的基本信息:(post-receive)
#!/bin/sh
read oldrev newrev refname
LOGFILE=post-receive.log
echo " push - Old SHA: $oldrev -> $newrev >> $LOGFILE
sh ./post-receive-logic >> $LOGFILE
第二个进行实际部署:(post-receive-logic)
#!/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
但运气不好。
我做错了什么?
练习:post-receive hook 操作期间.
(或$PWD
)在哪里?
当你 运行它时,它就是你的 $PWD
。当它自动 运行 时呢? (查看接收系统的裸 git 存储库:您的 $LOGFILE
输出将在该目录中。)
(您的 posting 中的挂钩文本中缺少一个右引号,因此您可能是手动复制了脚本的某些部分,也许还缺少其他内容。此外,请确保hook 具有执行权限。但我的猜测是,git 运行s hooks with $PWD
设置为 .git
目录,而不是挂钩目录。)
(旁注:你的钩子可能不完整,因为它只读取一个 oldrev newrev refname
,但是 git push
可以推送许多引用。通常你应该循环:while read oldrev newrev refname; do ...; done
。如果你有一个预接收钩子拒绝推送多个 ref,不过,这个特定的 post-receive 钩子可能是正确的。)