git post-receive不正常工作

12

我有以下问题。我已经更新了'post-receive'脚本,让它进入特定的目录并拉取代码库来进行部署:

#!/bin/bash
cd /var/www/site
git pull origin master

但是,每当我在本地机器上执行 'git push origin master' 操作时,我会得到以下输出:

Counting objects: 5, done.
Delta compression using up to 2  threads.
(etc..)
remote: fatal: Not a git repository: '.'

然而,当我手动执行 cd /var/www/site 并执行 git pull origin master 时,它表现得非常出色。

2个回答

18

使用以下方式取消设置GIT_DIR:

#!/bin/bash
cd /var/www/site || exit
unset GIT_DIR
git pull origin master
exec git-update-server-info

您可以在这里查看有关GIT_DIR的更多信息。 Git 热爱环境


太棒了,正是我所需要的。您介意解释一下为什么需要这样做吗? - andy
2
GIT_DIR是你可以为各种git命令设置的少数环境变量之一。在post-receive钩子中,$GIT_DIR始终(?)设置为.。如果你cd到其他地方,git pull仍然看到$GIT_DIR设置为.并期望在.中找到repo,但你已经移动了它并不在那里。清除它将使git恢复到其“正常”行为(查看./.git,在你cd到的位置)。 - torek
能否将GIT_DIR直接设置为当前目录,而不是先重置GIT_DIR,再单独进入工作目录?如果这就是GIT_DIR的设计初衷,那么重置GIT_DIR然后再进入工作目录似乎有些多余。这样做的原因是什么? - Hashim Aziz

4

另一个选择是在命令中提及工作目录和git目录。

git --work-tree=/home/user/repos/my_app --git-dir=/home/user/repos/my_app/.git <command>

e.g:

git --work-tree=/home/user/repos/my_app --git-dir=/home/user/repos/my_app/.git status

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