我在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
后尝试更改分支时,我得到“您对以下文件的本地更改将是被结帐覆盖:“
出于我的目的,我不想使用.gitignore
而我不想git rm --cached
Web.config
,因为两者都要求我提交这些更改。在我的情况下,这不是一个选项。
答案 0 :(得分:5)
TL; DR答案是.git/info/exclude
和.gitignore
都不会对跟踪文件产生任何影响。使用git update-index --skip-worktree
(或--assume-unchanged
)只需让Git停止将索引版本与工作树版本进行比较。该文件仍然被跟踪,并仍然进入每个新提交。这意味着尝试从较新的提交移动到较旧的提交可能会尝试更改工作树中的文件内容。没有解决方法(除了将内容移开之外,以便Git可以自由覆盖暂时不存在的文件)。
对于要在Git中跟踪的文件,它必须在索引中。也就是说,索引--Git用于构建 next 提交的神秘对象 - 具有一些文件的副本,其中包含一些路径名 P 。
如果路径 P 在索引中,那么忽略忽略文件的任何数量都不会使 P 停止在索引中。使 P 停止在索引中的唯一方式是更改索引的内容。
有几种方法可以更改索引的内容。由于索引是下一次提交中的内容,您可以:
检查一个没有路径名为 P 的文件的提交。
这将从索引中删除路径 P ,并从工作树中删除路径为 P 的文件。 Git将如果路径 P 的内容与当前(HEAD)提交中存储的内容不匹配,则对象为git checkout
,告诉您将丢失这些更改(这是真的,您< em>将丢失这些更改;虽然您当然可以先将文件移开,然后再将其移回。)
当然,只要您检出 其中包含路径 P 的另一个提交,该文件就会重新出现在索引和您的工作中 - 树,其中包含存储在其他提交中的内容。和以前一样,如果Git会覆盖数据,Git会反对git checkout
。
使用git rm
删除文件。使用git rm --cached
将从索引中删除 P ,而不会干扰工作树中的文件。
您现在可以创建一个没有路径名为 P 的文件的新提交。
这允许您使用另一种方法:您现在有一个提交,其中没有路径 P ,所以任何时候您想要获得没有路径 P ,你刚刚提出的这个新提交是git checkout
的合适提交。
这是使路径无法跟踪的唯一方法:必须删除它,或者通过缺少路径的git checkout
提交,或者通过显式删除删除步骤。 没有其他方法可以使文件无法跟踪。还要注意&#34;未跟踪&#34;文件继续依赖索引内容,只要你git checkout
提交有或没有 P ,它就会改变。
如果您愿意使用 跟踪的文件,但很少关注它,您可以在索引中保留路径 P ,但设置 skip-worktree 位(或假设未更改的位,虽然它有不同的用途, skip-worktree 位是一个你应该经常使用)。
设置此位告诉Git不要将 P 的索引版本与 P 的工作树版本进行比较。这意味着Git通常不会报告 P 需要与git add
一起上演。它有时似乎就像 P 甚至没有被跟踪。但是,由于某些文件内容 在路径 P 下被跟踪,因此在此状态下进行的每个新提交将继续具有路径 P的(旧)内容。当您最终从索引中删除 P 时,这会影响您,因为后面的git checkout
这些提交操作的行为如上所述,将 P 放回索引中