从命令行可以,但是钩子(git)不行。

3

我希望在有人推送到远程存储库后自动更新我的redmine项目存储库。目前,在redmine中的gin已经启动并正常工作。但是在使用钩子进行自动更新后,我在redmine中得到了“在存储库中找不到条目或修订版”的错误。

为了在redime中设置git,我遵循了redmine wiki,因此使用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)

我通过命令SET检查了GIT_DIR系统变量 remote: /srv/www/redmine.domain.com/git_repositories/linode.git[K remote: GIT_DIR='.'[K

我甚至尝试在钩子中设置git路径

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仓库未经修改,可以从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,则一切正常。对我来说,来自钩子和命令行的`git fetch`命令的控制台消息看起来相同。


@Jefromi:我更新了我的问题……希望现在更清楚了。我的观点是,如果我从命令行运行git fetch && git reset --soft,它可以正常工作(=我可以从redmine看到更新的repo),但如果从钩子中触发,我会在redmine中收到错误。 - Radek
1
你可能想在钩子脚本中添加一些调试语句,比如打印出它所在的目录并在命令运行之前回显这些命令(或在 shebang 行上使用 -x)。钩子脚本打印到 stdout/stderr 的任何内容都将被发送回远程。 - ebneter
在 shebang 行上使用 -x 是什么意思? - Radek
尝试在cd之后添加pwd命令,以便脚本打印您实际所在的目录。我猜测脚本没有切换到正确的目录。至于“shebang行”,它是您脚本顶部看起来像#!/bin/bash或类似的行。 “-x”选项告诉bash(或sh)在执行命令之前回显所有命令。 - ebneter
在我发帖之前,我已经执行了pwd命令,它所在的目录是正确的。如果正确的目录是.git(版本库)目录,则在我的情况下应该是~/srv/www/redmine.domain.com/git_repositories/linode.git。 - Radek
显示剩余2条评论
1个回答

0

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

chmod -R 770 redmine_repo.git

解决了问题


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接