Git:从工作树中删除已删除的文件

时间:2017-02-10 15:46:13

标签: git

我正在运行这个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中工作,以便在工作网站中删除我要删除的文件?

4 个答案:

答案 0 :(得分:2)

两个工作树意味着您需要两个索引文件

这种情况下的问题源于这样一个事实:只有一个索引(也就是暂存区域,也就是缓存),但是有两个工作树

请记住,对于git checkout,有三个感兴趣的项目:

  • 你想要签出的提交;
  • 索引,其中(在其他职责中)作为Git跟踪工作树的一种方式:这是缓存方面;和
  • 工作树,它是正常的非Gitty格式的文件集,操作系统的其余部分可以处理。

让我们看一下你的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