bash - 从 git hook 调用脚本

标签 bash git githooks

假设我在服务器/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,一切都会正常,服务器停止,文件被 pull ,服务器再次启动。

我尝试在不使用 sh 的情况下调用它,如下所示:

./post-receive-logic >> $LOGFILE

但运气不好。

我做错了什么?

最佳答案

练习:在接收后 Hook 操作期间,.(或$PWD)在哪里?

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

(您的帖子中的 Hook 文本中缺少闭合引号,因此大概您手动复制了脚本的某些部分,并且可能还缺少其他内容。另外,请确保 Hook 具有执行权限。但是我的猜测是,您被 git 运行钩子(Hook)的事实所困扰,其中 $PWD 设置为 .git 目录,而不是钩子(Hook)目录。)

(旁注:你的钩子(Hook)可能不完整,因为它只读取一个 oldrev newrev refname,但 git push 可以推送许多引用。通常你应该循环: while read oldrev newrev refname; do ...; did。不过,如果您有一个预接收钩子(Hook)拒绝推送多个引用的推送,那么这个特定的后接收钩子(Hook)可能是正确的。 )

关于bash - 从 git hook 调用脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33526961/

相关文章:

bash - 将 grep 搜索结果传送到 sed 中替换

git - 获取我的 Bash 代码上的当前 Git 远程权限

git - 如何在 pull 存储库后自动运行另一个应用程序?

linux - 如何在不使用引号的情况下删除名为 *(星号)的文件?

bash - Docker build-arg在单独的行中定义时不会自动获取env变量

Bash pid 根本不返回任何内容

git - 强制 intellij Idea 与另一个 git 存储库一起工作

c# - 如何将 git repo 在目录树中向下移动?

git - 识别在分支上完成的提交

mysql - 在 Git 推送和 pull 上导出和导入数据库