在本地删除和忽略文件夹而无需提交

时间:2018-08-30 14:41:48

标签: git version-control gitignore

我们的存储库中有一个其他人依赖的文件夹,但是我想删除本地工作副本。我想确保我不会意外进行此更改。如果我只是删除文件夹,我的git索引就会被该文件夹删除的垃圾邮件淹没。有没有办法让git忽略该文件夹的删除?

我尝试将文件夹路径添加到.git / info / exclude,但这似乎对防止提交本地文件很有帮助。

1 个答案:

答案 0 :(得分:1)

简短的回答是“否”。还有一个更长的答案是-具体来说,是的,但是要小心!具体而言,您可以在索引中设置 skip-worktree 位。 Git的稀疏签出模式使用此位,您可以自己使用它以达到相同的效果:

git update-index --skip-worktree <list of files>

尽管在这种情况下,您可能只想首先设置稀疏签出。

索引正在为您的工作树建立索引(因此命名为 index ):它列出了所有应该存在的文件,并且其内容实际上在您进行的下一个提交中,除非您当然在进行下一次提交之前修改索引。我将稍稍了解应该出现的的含义,但让我们先来看一下正常情况。

如果您从工作树中删除所有文件(及其包含的目录/文件夹),Git会注意到您的索引和工作树不匹配,并告诉您您具有这些区别,即所有这些文件被删除。它们未上演提交,因为文件仍在索引中,并且每个文件的索引与每个副本的副本匹配文件在当前提交中。但是它们在工作树中 丢失了:它们 被删除了。

如果还从索引中删除文件(使用git rm --cached,则索引和工作树也将匹配:索引将不会列出dir/file和{{1} }实际上将不存在。因此,dir/file输出的这一部分将不再抱怨git status。但是,如果您这样做,那么现在您的 current 提交(Git称为dir/fileHEAD确实具有@,而您的索引没有具有dir/file,因此您要进行的下一次提交也将没有具有dir/file。这意味着删除dir/file会进行提交 ,而dir/file将报告那个

换句话说,如果工作树中缺少git status,但是在dir/file(当前或@提交)中,则只有两个选择:

    索引中的
  • HEAD 。然后根据index-vs-work-tree将其删除。 dir/file会这样。

  • 索引中的
  • git status not 。然后根据dir/file -vs-index将其删除。 @会这样。

如果您不打算进行缺少git status的提交,那么前者显然是更好的选择-但仍然很吵。

应该出现的是什么意思

1 请注意,如果索引表明某个路径为 P 的文件应该存在并且确实存在,那么一切都很好。工作树中 P 中的文件数据与索引中 P 中的数据以及 P < / em>与索引中的dir/file@提交中的内容匹配或不匹配。

另一方面,如果索引表明路径为 P 的文件确实不是 在工作树中,但实际上文件确实存在存在于工作树中,然后路径 P 表示一个未跟踪的文件。这是HEAD和其他排除文件进入的地方:您可以通过将.gitignore列在git status中来告诉.gitignore 不要抱怨P

第三种情况当然是您要查看的情况:索引中确实存在路径为 P 的文件,但工作树中缺少该文件。

稀疏检出和skip-worktree位

Git内置了对Git所谓的稀疏结帐的直接支持。为此,请将配置变量core.sparseCheckout设置为true,并在.git/info/sparse-checkout中列出路径(或pathspec)。有关详细信息,请参见Is it possible to do a sparse checkout without checking out the whole repository first?git read-tree documentation section on sparse checkouts也对此有更多的说明。

稀疏签出 work 的方式是Git像往常一样将整个提交读入索引,但不是将所有相应文件复制到工作树中,而是仅复制选定的 文件放入工作树。对于剩余的文件,由于Git不会显示,因此它们可能会出现在工作树中,也可能不会出现在工作树中。它会在该文件的索引条目中设置 skip-worktree位

git status或其他Git操作正在扫描实际的工作树以查看其中的真正含义时,如果遇到设置了skip-worktree位的索引条目,它们假装文件 在那里,其内容在索引中列出。他们刻苦地避免检查文件是否确实存在。根据skip-worktree位,索引所声明的内容必须假定为真。

如果您使用稀疏签出,则Git会自行维护skip-worktree位(至少在某种程度上,我没有尝试过使用该功能来查看其可能有粗糙边缘的地方)。否则,您必须自己维护它们,手动设置(git update-index --skip-worktree)并清除(git update-index --no-skip-worktree)每个文件的位。