我正在运行这个cron作业来更新我的网站并且它正在运行:
*/10 * * * * cd /var/www/mysite; git pull;
git --work-tree=/var/www/html/mysite.com/public_html/
--git-dir=/var/www/mysite/.git checkout -f
我注意到当我运行'git status'时它显示了很多已删除的文件,当我检查我正在运行的站点时,我可以看到我在提交中删除的文件未从站点中删除。我被告知要运行'git add -u'。这使得所有删除的文件都被绿色删除:而不是红色删除:但是,在cron工作再次运行之后,我又回到了同样的状态。
如何使用一个已更改的文件和一个已删除的文件进行git提交以在此cronjob中工作,以便在工作网站中删除我要删除的文件?
答案 0 :(得分:2)
这种情况下的问题源于这样一个事实:只有一个索引(也就是暂存区域,也就是缓存),但是有两个工作树。
请记住,对于git checkout
,有三个感兴趣的项目:
让我们看一下你的cron
命令:
cd /var/www/mysite; git pull;
要使此部分起作用,/var/www/mysite/.git
中必须有一个Git存储库,/var/www/mysite/
中有相应的工作树。指数 - 只有一个;它在/var/www/mysite/.git/index
中 - 缓存工作树中的内容。
git --work-tree=/var/www/html/mysite.com/public_html/ --git-dir=/var/www/mysite/.git checkout -f
要使这部分工作,/var/www/mysite/.git
中有一个Git存储库(正如我们刚才看到的),/var/www/html/mysite.com/public_html/
中有相应的工作树。索引 - 只有一个缓存工作树中的内容。
但是有两个工作树,在一个共享的Git存储库中只有一个索引。一个缓存试图跟踪并加速 - 它认为只是一个目录的两个不同目录。所以事情最终会出错。 (出错的确切模式非常棘手,因为缓存记录了很多操作系统级别的时间戳,并且在各种条件下自动失效,因此只要只有一个工作树,它就能正常工作缓存。)
一个简单的解决方案是销毁,然后让Git重建索引。
索引的缓存方面只是为了加快速度。这意味着您可以完全销毁索引然后重建它。这不是一个很好的解决方案,因为索引具有三个角色:除了缓存方面,它还可以构建下一个提交,以及解决冲突合并的位置。当其唯一的主动角色是“加速”时,销毁索引只能 。
更复杂的解决方案是使用多个索引文件。
但是,有多种方法可以实现第二种解决方案。您可以将环境变量GIT_INDEX_FILE
设置为指向路径名,Git将其用作索引文件。因此,而不仅仅是:
git --work-tree=/var/www/html/mysite.com/public_html/
--git-dir=/var/www/mysite/.git checkout -f
您可以阅读最后一步:
GIT_INDEX_FILE=/var/www/mysite/.git/index.public_html
git --work-tree=/var/www/html/mysite.com/public_html/
--git-dir=/var/www/mysite/.git checkout -f
(所有这些都是一条大线 - 为了显示目的,我把它分开了)。主要的缺点是你必须记住每次设置这个GIT_INDEX_FILE
变量你就这样使用它。
另一种方法是使用git worktree add
,自Git 2.5以来可用。这使得额外的工作树和内置于Git中的每个工作树都有自己的索引。这里的主要缺点是每个工作树必须位于不同的分支上,或使用“分离的HEAD”模式。对于这种情况,后者是你想要的:而不是git checkout -f
,你会git checkout --detach master
。要执行此操作,请执行一次性git worktree add
以创建第二个工作树(请参阅the git worktree
documentation),然后将最终git checkout
更改为:
cd /var/www/html/mysite.com/public_html; git checkout -f --detach master
次要的次要缺点是这个添加的工作树(在/var/www/html/mysite.com/public_html
中)将包含.git
个文件。请注意,这不是目录,它只是一个文件。
答案 1 :(得分:1)
很抱歉没有跟进,谢谢你的回答。 它给了我很多帮助!
我最终得到了以下命令,并且完成了对cron的工作。
sudo bash
su www-data -s /bin/bash
cd /var/www/mydomain
git fetch https://bitbucket.org/myaccount/mydomain.git
[Login to BitBucket]
git pull
git status
git --work-tree=/var/www/html/mydomain.dk/public_html/ --git-dir=/var/www/mydomain/.git checkout -f
git status
exit # From www-data user
答案 2 :(得分:0)
我想我在你的cron中看到了一个错误。如果你第一次拉,然后检查你可能已修改文件,如果你拉,你会遇到冲突。您应首先结帐,然后提取您的更改。
要提交所有内容,您可以使用git add -A
该命令添加已更改和已删除的文件。然后,如果需要,您可以进行正常提交。
答案 3 :(得分:0)
请检查您是否确实删除了这些文件。确定已删除这些文件后,请执行以下操作
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js" type="text/javascript"></script>
<script src="https://www.skulpt.org/static/skulpt.min.js" type="text/javascript"></script>
<script src="https://www.skulpt.org/static/skulpt-stdlib.js" type="text/javascript"></script>
git rm -r --cached .
git add -A
git commit -m "Your commit message