我们的存储库中有一个其他人依赖的文件夹,但是我想删除本地工作副本。我想确保我不会意外进行此更改。如果我只是删除文件夹,我的git索引就会被该文件夹删除的垃圾邮件淹没。有没有办法让git忽略该文件夹的删除?
我尝试将文件夹路径添加到.git / info / exclude,但这似乎对防止提交本地文件很有帮助。
答案 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/file
或HEAD
,确实具有@
,而您的索引没有具有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 的文件,但工作树中缺少该文件。
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
)每个文件的位。