git checkout -f导致修改后的非托管文件

时间:2014-06-20 08:52:43

标签: git website-deployment

对于我的网站,我有一个裸存储库(我推送到的地方)和一个带有工作目录的克隆,它用作文档根目录。

在裸存储库中,我设置了post-receive挂钩来自动更新网站:

#!/bin/sh
WEB_DIR=/var/www/www.mysite.com

# remove any untracked files and directories
git --work-tree=${WEB_DIR} clean -fd

# force checkout of the latest deploy
git --work-tree=${WEB_DIR} checkout --force

不幸的是,在推送到裸存储库之后,更改确实显示在文档中,但是它们显示为非暂存更改。 然后,我必须通过git checkout -- <files>后跟git pull来清理所有内容。

显然,这个想法是这个开箱即用,如果我必须手动清理+拉动我也可以删除post-receive钩子。

我认为在收看后使用结账比在不同地点使用结账更好,所以我不知道这是否是一个很好的改变......

我不是git专家所以我希望有人可以告诉我我缺少什么?这个解决方案确实适用于很多人,因为我已经在几个教程中找到了它。

1 个答案:

答案 0 :(得分:0)

这令人困惑

现在你所拥有的是(例如):

/repos
    /mysite
        /.git 
            ...
/var
    /www
        /www.mysite.com
            /.git
                ...
            index.htm
            ...

那里没什么奇怪的。但是,使用中的钩子是错误匹配的东西,使得工作副本的git存储库与签出的文件不同步:

/repos
    /mysite
        /.git <- This git dir
            ...
/var
    /www
        /www.mysite.com <- This working copy
            index.htm
            ...

忽略工作副本的git目录 。这让事情变得非常混乱 - 检查工作副本文件以匹配裸存储库的状态,忽略工作副本自己的git信息。

简单

而不是像下面这样做:

#!/bin/sh
# see http://serverfault.com/q/107608/108287
# for why you can't just run git pull with no arguments

WEB_DIR=/var/www/www.mysite.com

cd $WEB_DIR

# Remove the comments after verifying that it works to reduce noise
git --git-dir $WEB_DIR/.git fetch # > /dev/null
git --git-dir $WEB_DIR/.git checkout --force # > /dev/null
git --git-dir $WEB_DIR/.git clean -fd # > /dev/null

即。推送到裸存储库,然后准确模拟您手动执行的操作,更改目录拉动和清理。这将更新工作副本的文件 git存储库,以便事物处于同步状态。