繁体   English   中英

git checkout -f会导致修改后的未暂存文件

[英]git checkout -f results in modified, unstaged files

对于我的网站,我有一个裸露的存储库 (我推送到该存储库 )和一个带有工作目录的克隆,该目录充当文档根目录。

在裸仓库中,我设置了一个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来清理所有内容。

显然,这个想法是开箱即用的,如果我必须手动执行cleanup + pull,我不妨删除post-receive钩子。

我读到在收据中使用结帐比在各个位置进行拉动要好,所以我不知道那是否是个好选择...

我不是git专家,所以我希望有人可以告诉我我缺少什么? 该解决方案似乎确实对很多人都有效,因为我已经在几本教程中找到了它。

令人困惑

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

/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存储库,以使事物保持同步。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM