如何忽略已经提交的文件对Git的任何更改

Cra*_*ing 2 git gitignore

我需要忽略对Git已经跟踪的特定文件所做的任何更改.不应从本地或远程存储库中删除这些文件.

我试图在.gitignore中忽略它们,但它不起作用.

的.gitignore:

$MAVEN_PATH_TO_CHILD_MODULE/src/main/java/$PACKAGE/$CLASS.java
Run Code Online (Sandbox Code Playgroud)

知道为什么吗?

Ada*_*m H 6

.gitignore 只是告诉 git 忽略哪些未跟踪的文件,所以如果你的文件已经被 git 跟踪,它不会做任何事情。相反,您可以使用以下命令告诉 git 暂时忽略对跟踪文件的任何更改:

git update-index --assume-unchanged <file>
Run Code Online (Sandbox Code Playgroud)

如果您想撤消此操作,只需运行:

git update-index --no-assume-unchanged <file>
Run Code Online (Sandbox Code Playgroud)

请参阅此处了解更多详情。

  • 这是微妙错误的。“assume-unchanged”是对 git 的承诺,你不会更改文件,并且它不应该检查。如果您确实更改了文件,git 将忽略这些更改,并在合并或拉取时覆盖这些文件。如果您希望 git 了解您正在进行未跟踪的更改,并且它至少应该尝试保留您的工作,请使用“skip-worktree”。http://fallengamer.livejournal.com/93321.html (2认同)

Jak*_*ski 6

只能忽略未跟踪的文件(未添加到Git).或者换句话说,忽略是关于Git不知道的文件,即不在索引中(在暂存区域中没有条目).

要使文件未跟踪(将其从索引中删除,从而在下次提交时将其从删除中暂存),但将其保留在工作区域中,即在文件系统中,您可以使用

$ git rm --cached <file>
Run Code Online (Sandbox Code Playgroud)

在本地提交之后,以及在推送到远程之后,该文件将从远程存储库中删除(从顶部提交树中 - 它将仍然存在于历史记录中).


如果你想要的Git忽略的变化,使git diffgit status不会举报他们,并git commit -a不会承诺他们(但git add <file>+ git commitgit commit <file>仍然添加的话),你可以来的Git这一(见的git准备»暂时忽略文件的文章):

$ git update-index --assume-unchanged <file>
Run Code Online (Sandbox Code Playgroud)

git update-index命令是低级(管道)命令.您可以通过以下方式找到" 假定未更改 "的文件:

$ git ls-files -v
h <file>
Run Code Online (Sandbox Code Playgroud)

git ls-files -v使用小写字母表示标记为假设未更改的状态文件.

你可以把它关掉

$ git update-index --no-assume-unchanged <file>
Run Code Online (Sandbox Code Playgroud)

请注意,此选项的初始目的是加速stat缓慢平台上的状态.


在@Dave评论之后,引用了Git - '假设未改变'和'跳过工作树'之间的差异问题,现代Git中的另一个选择是让Git不使用带有skip-worktree位的工作区版本.

您可以使用跟踪文件打开它

$ git update-index --skip-worktree <file>
Run Code Online (Sandbox Code Playgroud)

这使得Git使用索引版本(最后提交的版本)代替文件系统中的版本.您可以检查哪个文件具有此位设置

$ git ls-files -v
S <file>
Run Code Online (Sandbox Code Playgroud)

git ls-files -v命令将用于S表示设置为"skip-worktree"的文件.

请注意,此选项的原始用途是支持稀疏结帐.

  • _这些文件不应从本地或远程存储库中删除。_问题的这一部分使这个答案的很多内容变得多余。 (3认同)