【问题标题】:from command line ok but the hook (git)从命令行可以,但钩子(git)
【发布时间】:2010-11-10 13:18:50
【问题描述】:

我想在有人推送到远程仓库后自动更新我的 redmine 项目仓库。目前 redmine 中的杜松子酒已经启动并且工作正常。但是在使用钩子自动更新后,我在 redmine 中得到了The entry or revision was not found in the repository.

要在 redime 中设置 git,我遵循了 redmine wiki,因此该 repo 是通过 git clone --bare 创建的裸露的

要更新 redmine 的 git 存储库,我使用这个 cd /srv/www/redmine.domain.com/git_repositories/linode.git && git fetch && git reset --soft refs/remotes/origin/master

  • 如果在git 用户下从命令行运行,则手动更新可以正常工作

手动执行时的截图是

remote: Counting objects: 5, done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 3 (delta 2), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
From domain.com:linode
  * [new branch]      master     -> origin/master
  • 在运行post-receive 钩子时同样不能正常工作(参见上面的错误)。在同一用户(git)下运行。钩子的第一行是#!/bin/sh

配置: ubuntu 上的 git (1.7.0.4) + gitolite (1.5.7)

我检查了 GIT_DIR 系统变量字节命令 SET 远程:/srv/www/redmine.domain.com/git_repositories/linode.git[K 远程:GIT_DIR='.'[K

我什至试图通过

设置git path
export GIT_DIR=/srv/www/redmine.domain.com/git_repositories/linode.git
or unset GIT_DIR

但没有任何帮助。

钩子的结果

echo "Post receive-hook => updating Redmine repository"
#env -i git reset --hard
#unset $(git rev-parse --local-env-vars)
#unset GIT_DIR


cd /srv/www/redmine.domain.com/git_repositories/linode.git
pwd
git fetch
git reset --soft refs/remotes/origin/master

Pushing to git@domain.com:linode
remote: Post receive-hook => updating Redmine repository[K
remote: From domain.com:linode[K
remote: /srv/www/redmine.domain.com/git_repositories/linode.git[K
remote:    4755447..13b8e3d  master     -> origin/master[K
To git@domain.com:linode
  4755447..13b8e3d  master -> master

我尝试了来自 calling-git-pull-from-a-git-post-update-hookgit-post-receive-hook-with-git-pull-failed-to-find-a-valid-git-directory 的一些提示,但没有任何帮助

更新

如果我尝试

echo "Post receive-hook => updating Redmine repository"
export GIT_DIR=

cd /srv/www/domain.com/git_repositories/linode.git

echo "Resetting working tree..."
git reset --hard
echo "Finished resetting working tree."

git fetch
git reset --soft refs/remotes/origin/master

我得到这个 + redmine 存储库没有被触及并且可以从 redmine 访问

Pushing to git@domain.com:linode
remote: Post receive-hook => updating Redmine repository[K
remote: Resetting working tree...[K
remote: fatal: Not a git repository: ''[K
remote: Finished resetting working tree.[K
remote: fatal: Not a git repository: ''[K
remote: fatal: Not a git repository: ''[K
To git@domain.com:linode
 c553a15..854d159  master -> master

更新2

我发现如果我从钩子中执行git fetch,然后从命令行执行git reset --soft refs/remotes/origin/master,则它不起作用。我在 redmine 中收到上述错误。我从命令行执行git fetch 然后一切正常。来自 hook 和 commnand line 'git fetch` 命令的控制台消息在我看来是一样的。

【问题讨论】:

  • “无法正常工作”是什么意思?我看到了 fetch 的输出;看起来它成功了。 git reset --soft 如果成功运行,则不会产生任何输出。在顶部你说你得到那个错误 - 什么命令提示?它在Redmine内吗? (redmine repo 是裸露的吗?如果不是,请记住 git reset --soft 不会触及索引或工作树...)
  • @Jefromi:我更新了我的问题......希望现在更清楚了。我的观点是,如果我从命令行运行git fetch && git reset --soft,它可以工作(=我可以从 redmine 看到更新的 repo)如果从钩子中触发,我会在 redmine 中得到错误。
  • 你可能想在你的钩子脚本中加入一些调试语句,比如打印出它所在的目录并在命令运行之前回显命令(或者在 shebang 行上使用 -x)。钩子脚本打印到 stdout/stderr 的任何内容都将被发送回远程。
  • @ebneter:谢谢,我更新了我的问题。 pwd 给了我我相信的正确道路。在我看来,git 命令没有正确执行,因为执行钩子时没有 git 输出。与手动执行相比。
  • “在shebang线上使用-x”是什么意思?

标签: git githooks


【解决方案1】:

我确实知道具体是什么以及为什么,但是在通过钩子(我使用 gitolite)执行 git fetch 之后,一些文件(可能是新文件)具有 redmine 不喜欢的权限。

chmod -R 770 redmine_repo.git

成功了

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-01
    • 2011-11-08
    • 2020-02-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多