git - 如何忽略已提交给 Git 的文件的任何更改

标签 git gitignore

<分区>

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

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

.gitignore:

$MAVEN_PATH_TO_CHILD_MODULE/src/main/java/$PACKAGE/$CLASS.java

知道为什么吗?

最佳答案

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

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

$ git rm --cached <file>

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


注意:这是不安全,可能会导致数据丢失!!!对于更安全(虽然不完美)的替代方案,请参见下文。

如果您想让 Git 忽略更改,那么 git diffgit status不会报告他们,并且git commit -a不会提交它们(但是 git add <file> + git commitgit commit <file> 仍然会添加它们),你可以用这个技巧 Git(见git ready » temporarily ignoring files文章):

$ git update-index --assume-unchanged <file>

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

$ git ls-files -v
h <file>

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

你可以关闭它

$ git update-index --no-assume-unchanged <file>

请注意,此选项最初的目的是在 stat 的平台上加速状态很慢。


关注@Dave 评论,并引用 Git - Difference Between 'assume-unchanged' and 'skip-worktree'问题,另一个足够现代的 Git 选项是让 Git 不使用带有 skip-worktree 位的工作区版本。

您可以为跟踪的文件打开它

$ git update-index --skip-worktree <file>

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

$ git ls-files -v
S <file>

git ls-files -v命令将使用 S表示设置了“skip-worktree”的文件。

请注意,此选项最初的目的是支持稀疏 checkout 。

关于git - 如何忽略已提交给 Git 的文件的任何更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28497104/

相关文章:

java - 如何从 git 克隆存储库并在 java 中自动运行 maven build

node.js - 在 package.json 中使用 git 标签(用于 git 依赖项)

gitignore:忽略文件夹层次结构中的所有文件,除了一种特定的文件类型

Git - 忽略配置文件

gitignore:了解 "hello/"与 "hello/*"

单个文件的 git diff

git - 平均堆栈,Win 7,git push heroku master 结果在 sh : bower: not found error

git - 什么是仅状态 Git 存储库?

Git:仅忽略文件夹的内容

xcode - 如何将.gitignore文件添加到Xcode项目