我们做一个中央仓库(用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_DIRGIT_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 富,但这里有一些更多的事情要尝试:

  1. ~git/a 并看看你能不能让它 git pull 通过手。这应该失败。
  2. 进入了 ~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 获得进一步的解释。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top