.git/info/exclude文件未忽略文件。

3
我将一个 Web.config 文件添加到我的 .git/info/exclude 中。我执行了 git update-index --assume-unchanged path/to/Web.config 命令。我还尝试了运行命令 git update-index --skip-worktree path/to/Web.config。尽管如此,当我运行命令 git ls-files -v . | grep ^S (它应该列出那些被忽略的文件)时,我没有看到 Web.config 的名称在其中。
Web.config 的更改不会显示在 git status 中。但是,当我在更改 Web.config 后尝试切换分支时,我会得到 "Your local changes to the following files would be overwritten by checkout:" 的警告。
根据我的要求,我不想使用 .gitignore 文件并且也不希望使用 git rm --cached 命令删除 Web.config,因为这两个方法都需要我做提交。在我当前的情况下,这是不可行的选择。
1个回答

9
TL;DR回答是,.git/info/exclude.gitignore都不会对已跟踪的文件产生任何影响。使用git update-index --skip-worktree(或--assume-unchanged)只是让Git停止比较索引版本和工作树版本。该文件仍然被跟踪,并且仍然进入每个新提交。这意味着尝试从较新的提交移动到较旧的提交可能会尝试更改工作树中文件的内容。没有解决此问题的方法(除了将内容移到一边,以便Git可以自由地覆盖此时不存在的文件)。
你必须删除文件(从索引中)
要使文件在Git中成为“已跟踪”状态,它必须存在于索引中。也就是说,索引——Git用来构建下一个提交的神秘对象——具有某个路径名为P的文件的副本。
如果路径P位于索引中,则无论如何调整忽略文件都无法使P停止存在于索引中。使P停止存在于索引中的唯一方法是更改索引的内容。
有几种方法可以更改索引的内容。由于索引是下一个提交的内容,因此可以:
  • 查看一个提交,该提交不包含路径名为P的文件。

    这会从索引中删除路径P并从工作树中删除路径为P的文件。如果路径P中的内容与当前(HEAD)提交中存储的内容不匹配,则Git将对git checkout进行反对,并告诉您将丢失这些更改(这是真的,您确实会失去这些更改;当然,您可以先将文件移出路线,然后稍后再将其移回)。

    当然,只要您检出另一个带有路径P的提交,该文件就会重新出现在索引和工作树中,并具有存储在其他提交中的内容。与之前一样,如果它将覆盖数据,则Git将反对git checkout

  • 使用git rm来删除该文件。使用git rm --cached将从索引中删除P,而不会干扰您工作树中的文件。

    现在,您可以创建一个新提交,该提交不包含路径名为P的文件。

    这使您可以使用另一种方法:您现在有一个不包含路径P的提交,因此任何时候您想要进入不包含路径P的索引,您刚刚创建的这个新提交都是适合使用git checkout的提交。

这是使路径变得未跟踪的唯一方法:您必须将其删除,可以通过缺少路径的提交的git checkout或显式的删除步骤来实现。没有其他方法可以使文件变为未跟踪。请注意,文件的“未跟踪性”仍然取决于索引内容,每当您git checkout具有或缺少P的提交时,索引内容都会更改。

另一种方法是设置复杂的索引位

如果您愿意接受一个被跟踪的文件,但很少关注它,您可以将路径P留在索引中,但设置skip-worktree位(或assume-unchanged位,尽管它有不同的目的,而skip-worktree位通常是您应该使用的)。

设置这个标志位告诉Git不要将P的索引版本与工作树版本进行比较。这意味着,通常情况下,Git不会报告需要使用git addP暂存。有时看起来P甚至都没有被跟踪。然而,由于某些文件内容在路径P下被跟踪,因此在处于这种状态下进行的每个新提交仍将继续使用路径P的(旧)内容。当您最终从索引中删除P时,这会影响您,在这种情况下,后续对这些提交执行的git checkout操作的行为与上述描述相同,将P放回索引中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接