[英]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.