【问题标题】:Call a script from a git hook从 git hook 调用脚本
【发布时间】:2015-11-04 16:25:07
【问题描述】:

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

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

#!/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

但没有运气。

我做错了什么?

【问题讨论】:

  • 两个脚本的权限一样吗?
  • 您是否也尝试使用脚本的完整路径?
  • @HBHB 哦,我没想到,sctipts是从存储库根目录调用的,我应该写./hooks/post-receive-logic >> $LOGFILE
  • 完全正确。您也可以使用完整路径。

标签: git githooks


【解决方案1】:

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

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

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

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

【讨论】:

  • 完全忘记了 $PWD 是存储库根目录,谢谢!至于缺少报价,那是因为我不擅长复制粘贴。
猜你喜欢
  • 1970-01-01
  • 2019-06-17
  • 2014-09-30
  • 2011-04-06
  • 1970-01-01
  • 2012-04-13
  • 2015-05-17
  • 1970-01-01
  • 2015-01-02
相关资源
最近更新 更多