对于我的网站,我有一个裸存储库(我推送到的地方)和一个带有工作目录的克隆,它用作文档根目录。
在裸存储库中,我设置了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专家所以我希望有人可以告诉我我缺少什么?这个解决方案确实适用于很多人,因为我已经在几个教程中找到了它。
答案 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存储库,以便事物处于同步状态。