git checkout-f将生成修改的、未老化的文件

git checkout-f将生成修改的、未老化的文件,git,website-deployment,Git,Website Deployment,对于我的网站,我有一个空的存储库(我推到那里)和一个带有工作目录的克隆,作为文档根目录 在裸机存储库中,我设置了一个post receivehook来自动更新网站: #!/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

对于我的网站,我有一个空的存储库(我推到那里)和一个带有工作目录的克隆,作为文档根目录

在裸机存储库中,我设置了一个
post receive
hook来自动更新网站:

#!/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
不幸的是,在推送到裸存储库后,更改确实显示在documentroot中,但它们显示为未老化的更改。 然后,我必须通过执行
git签出--
然后执行
git pull
来清理一切

显然,这个想法是开箱即用的,如果我必须手动执行清理+拉动,我还可以删除
post receive
挂钩

我读到在post接收中使用签出比在不同位置使用拉取更好,所以我不知道这是否是一个好的改变

我不是git专家,所以我希望有人能告诉我我错过了什么?这个解决方案似乎确实适用于很多人,因为我在一些教程中发现了它。

这让人困惑 所以现在你得到的是(例如):

没什么奇怪的。但是,使用的钩子不匹配,导致工作副本的git存储库与签出的文件不同步:

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

也就是说,推送到裸存储库,然后完全模拟您手动执行的操作,更改目录并清除。这将更新工作副本的文件和git存储库,以使事情同步。

我在这里使用了脚本:-尽管我在其他几个地方找到了关于同一主题的“checkout-f”,他们也只是使用了它。显然,我错的地方是文档根应该是git存储库。教程只是设置了post-receive钩子,使裸体repostory相信它有一个工作文件夹,即docroot。我已将.git文件夹从docroot中移出,它似乎可以工作,但我不知道是否真的要从该文件夹中删除git信息……是的。我完全同意你的意见。我没有意识到这会是一个结果,我更喜欢一个git信息完整的docroot(这样我们就可以看到是否有人乱动了文件)。所以你的解决方案似乎更好。谢谢
/repos
    /mysite
        /.git <- This git dir
            ...
/var
    /www
        /www.mysite.com <- This working copy
            index.htm
            ...
#!/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