使用更新后挂钩在另一个存储库上执行“ git pull”时,得到“致命的:不是git存储库:'。'


89

我是git的新手,所以如果我在这里滥用术语,我深表歉意(请纠正我),但我会尽力而为。

我正在尝试在Web服务器上设置裸git repo(hub)和开发站点工作副本(prime)。在本文之后,我已尝试将其模式化。我希望每当集线器存储库被推送到时,开发工作副本就被更新。我的印象是post-update,为此创建的合适的钩子是这样创建的:

#!/bin/sh
whoami
cd /path/to/working-copy/
RET=`git pull`
echo $RET

更新资料

当将更改从本地存储库推送到裸集线器时,我将从更新后脚本中获得以下输出:

remote: sites
remote: fatal: Not a git repository: '.'

但是,如果我以用户“站点”的身份通过SSH进入服务器并手动执行此脚本,则效果很好。

Answers:


179

这是最终起作用的脚本。我认为我最初所缺少的使它无法远程工作的地方是unset GIT_DIR

#!/bin/sh
cd /path/to/working-copy/ || exit
unset GIT_DIR
git pull repo branch

exec git-update-server-info

18
我可以确认,取消设置可以GIT_DIR解决问题。
2011年

16
对于那些愿意理解原因的人:这是因为git使用变量GIT_DIR而不是PWDcd-ing更改PWD不是GIT_DIR。如果第一个不可用,则必须存在git从GIT_DIR到的后备PWD
zupa 2013年

问题是为什么git认为必须对钩子脚本执行此操作(将GIT_DIR设置为使该脚本在其他位置的“ cd”仍然可以正常工作)?我个人会选择git不做这种魔术。
史蒂文·哈里安托

2
这背后的原因是Git将一些环境变量应用于所有核心git命令。
Casey 2013年

之后发生合并冲突时会发生什么git pull
lolololol ol



0

在我的情况下,我指定了一个工作树,这在某些命令(如pull(或更准确地说fetch))上中断了。

要取消设置工作树(如果它在您的git config中),请通过以下方法:

git config --unset core.worktree

(还有其他设置工作树的方法)

重要说明

除非您自己首先使用自定义工作树来挖洞,否则几乎没有任何问题。

嘲笑:

这对我来说意味着git内部.git/在某些情况下使用相对于工作树+的路径。以我的经验,除了git最基本的部分外,工作树都没有得到很好的支持。我还没有进行充分的实验,如果我正确设置了git directory config变量(我没有玩过),Git可能会表现出来。


-1

您可能遇到权限问题。我不确定您如何设置裸git仓库,但是如果它在git用户下运行,请确保git允许该用户git pull在您的项目目录中执行。

(可选)尝试在运行挂钩时找出您是什么用户:

echo `whoami`

如果我以git用户身份进入服务器,则可以在项目目录中使用git pull,而不会出现问题。我相信那是应该执行脚本的用户。我可以尝试在脚本中添加whoami行,但是当作为钩子执行该脚本时,该脚本的输出又会移到哪里呢?也许我需要将该输出发送到日志文件而不是回显?
Ty W

这是什么echo `whoami`whoami不?
ChristofferHammarström,2010年

从钩子脚本到stdout的输出对执行该操作的远程用户是可见的。或者,换句话说,如果您说“ git push”,则遥控器上的钩子输出将显示在您的标准输出中。
ebneter 2010年

是的,注意到我在玩东西时。非常方便:)
Ty W
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.