【问题标题】:Can't execute git commands in gitolite post-receive hook无法在 gitolite post-receive 钩子中执行 git 命令
【发布时间】:2014-02-05 15:53:31
【问题描述】:

我真的不明白为什么会这样。

在我的系统中,我得到了带有 gitolite 的“git”用户。所有 git 存储库、用户和存储库的权限都可以正常工作,似乎 gitolite 配置得很好,至少对于基本使用而言。

现在我需要使用 gitolite 在机器上设置一个网络服务器,我设置了 apache,并使用 git 用户在 www 目录中克隆了一个 repo,以便我可以通过浏览器访问文件。

克隆完全没有问题,我也可以手动执行git pull 并且 git 将从 repo 中提取。

问题是当我尝试在每次用户推送时自动将项目部署到 www 目录时。我写了一个 ~/.gitolite/hooks/common/post-receive 脚本,代码如下:

#!/bin/sh
dir=/var/www/onlinerepo
if [ ! -d $dir ] ; then
        echo "the directory $dir does not exist"
        exit 1
fi

cd $dir
git pull
touch DONE

我还使用gl-setup 将脚本传播到所有存储库。 当用户推送时,我确定脚本已执行,因为我看到 /var/www/onlinerepo/DONE 文件正在写入,但没有执行 git pull。我试图查看执行 git pull >> OUTPUT 的命令的输出,但它只创建一个空文件。

如果我通过命令行执行 git pull 命令,或者即使我从命令行手动执行 post-receive 脚本,我也会看到通常的“Already up-to-date”信息消息。

我做错了吗?我真的不明白为什么git pull 是脚本中唯一失败的命令。

【问题讨论】:

  • 也许git pull 只写入标准错误,而您没有捕获。尝试git pull >> OUTPUT 2>&1 以获得更好的诊断输出。
  • 附加无关备注:目录存在检查没有用。如果cd 无法更改为提供的目录,它会告诉您原因。您的脚本可以仅重写为 cd /var/www/onlinerepo && git pull && touch DONE 而不会丢失任何功能。
  • 我对这里的一切都很陌生,所以感谢您的反馈!我按照你说的做了,错误是:“致命:不是 git 存储库:'。'”我记得在克隆时也从命令行收到该错误,但我以更好的方式解决了指定 git 存储库的问题。然后我在上面的脚本代码中用git pull ssh://git@localhost/home/git/repositories/myrepo.git 更改了git pull,但不幸的是我在输出中得到了完全相同的错误。该命令在命令行中运行良好。
  • 我改成env -i git pull,好像可以了!

标签: git hook gitolite


【解决方案1】:

我解决了将git pull 更改为

env -i git pull ssh://git@localhost/home/git/repositories/myrepo.git

【讨论】:

  • 这行得通,因为env -i 抛出了所有其他环境变量。但是,这是一个非常大的锤子(例如,它会抛出 $HOME)。你需要取消设置的具体变量是GIT_DIR,所以unset GIT_DIR在其他位置执行其他git命令之前。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-31
  • 1970-01-01
  • 2012-01-02
  • 1970-01-01
  • 2012-02-17
  • 2014-05-13
  • 2014-10-28
相关资源
最近更新 更多