Git后收到钩子没工作
-
22-09-2019 - |
题
我们做一个中央仓库(用Gitosis).我已经创建了一个后收到钩,以生成一个电子邮件的开发的邮寄名单每次修改都推到中央仓库,并生成文档从文件夹在从初回购。
因此,在~git/我已经有了一个目录,我们就叫它"a"包含一个克隆内回购。后收到钩看起来像:
#!/bin/bash
cd ~git/repositories/a.git
. ~git/post-receive-email &> /dev/null
( cd ~git/a && git pull &> ~git/pull_log.log && php ~git/a/scripts/generate_markdown_documentation.php &> ~git/doc_log.log )
电子邮件脚本是工作,但是该文件的产生不是。内容pull_log.日志是:
fatal: Not a git repository: '.'
这使我认为这是不会改变到正确的目录中的5行中的上述脚本。我错了吗?我怎么能得到这工作吗?
编辑: 我已经更新后收到的挂钩中的建议的反应。脚本是现在:
#!/bin/bash
function die {
echo "$*" >&2; exit 1
}
function checkgit {
[ -d "$1/.git" ] || die "$1 could not possibly be a git repo; $1/.git is not a dir"
}
cd ~git/repositories/a.git
. ~git/post-receive-email &> /dev/null
( set -x
checkgit ~git/a
cd ~git/a
checkgit .
pwd
git pull
php ~git/a/scripts/generate_markdown_documentation.php )
我得到以下输出svn推:
+ checkgit /var/git/a
+ '[' -d /var/git/a/.git ']'
+ cd /var/git/a
+ checkgit .
+ '[' -d ./.git ']'
+ pwd
/var/git/a
+ git pull
fatal: Not a git repository: '.'
+ php /var/git/a/scripts/generate_markdown_documentation.php
任何更多的帮助?
哦,如果我跑的脚本我自己,它的工作(I运行它说钩/后收到)
发现的问题,谢谢 serverfault --基本上,环境变量 GIT_DIR
和 GIT_WORK_TREE
时设钩运行,而这些影响的文件不利。取消的变量解决问题。
解决方案
你需要更多的诊断,例如,
function die {
echo "$*" >&2; exit 1
}
function checkgit {
[ -d "$1/.git" ] || die "$1 could not possibly be a git repo; $1/.git is not a dir"
}
在这一点上,在子shell后的括号,你可以尝试的东西一样
set -x # show exactly what's executed (writes to stderr)
checkgit ~git/a
cd ~git/a && checkgit . && git pull ...
你也可以考虑向整个stderr的子shell,例如,
( ... ) 2>/tmp/mydiagnosis$$.log
(这是一项临时措施,是确定的,只有如果没有保密信息的记录。)
确定塞拉斯,你的额外信息的规则了一个很尴尬的可能性。我即将结束我的 git
富,但这里有一些更多的事情要尝试:
- 去
~git/a
并看看你能不能让它git pull
通过手。这应该失败。 - 进入了
~git/a
并运行git status
.这也应该失败。如果没有,然后git
是给你一个很糟糕的错误信息。
如果这两个步骤失败了, ~git/a
不是的克隆你以为它是。它重新命名,使一个新的克隆,并且看看你能否得到问题的存在。
如果第一个步骤成功的手,然后某事奇怪的事我百思不得其解。
如果第一步失败,但是第二次成功,你可以有一个问题,与分支:
也许仓库
~git/a
设置错误的分支,和你回购需求的一个分支,它没有。尝试git branch -a
看看如果你看到什么意外。也许你有分公司,但这不是正确地与一个远程存储库。在这一点上你必须潜入
~git/a/.git/config
, 和我真的不知道如何解释什么,你会找到那里。在这一点上,你会需要一个 真的 git专家;我只是玩一个在电视上。
其他提示
最近我遇到了类似的问题,我认为这是关系到环境变量的git套,特别是$ GIT_DIR变量。如果你有一组,其他回购所有Git命令开始古怪行为。基本上我认为运行钩内使用Git的拉必须在一个中立的外壳环境,没有这些奇怪的变量,并导致混帐混乱,虽然我还没有想出如何做到这一点,只是还没有被调用。
unset GIT_DIR
是适用于您所看到的致命错误的溶液中。
这适用于钩所有脚本(更新后的是另一种常见的一种),其使用在其内部git的命令。 GIT中命令从ENV代替PWD使用GIT_DIR。
请参阅 https://stackoverflow.com/a/4100577 获得进一步的解释。