Git:忽略版本控制的文件

59

.gitignore文件非常有用,可以忽略我们不想控制的某些文件。不幸的是,当文件已经被版本控制时,它无法使用。例如,我的.gitignore(已经添加到Git中)文件可能与我的同事想要的文件不同(例如,我想忽略Vim文件)。每当我更改此文件时,git都会将其显示为修改后的文件。所以我的问题是:

  1. 是否有任何方法可以忽略Git已经控制的某个文件的更改?!
  2. 是否有任何方法可以提交这些更改,但仅保留给自己?显然,我不想使用一个分支,因为我正在一个特定的分支上工作。

7
没有一个答案回答了主要问题-1号问题,包括被采纳的答案。这个问题涉及忽略已经被控制的文件,不是 .gitignore 或者 exclude 能够完成这项工作。 - shealtiel
9
git-update-index 的答案是正确的。 - Jason
6个回答

134

使用git-update-index临时忽略已在版本控制下的文件更改:

git update-index --assume-unchanged <files>

要撤销此操作,请使用:

git update-index --no-assume-unchanged <files>

如果您需要在 git-reset 之后保留更改,请查看 skip-worktreeno-skip-worktree 选项以更新索引。


17

如果您想要排除与您的进程有关的文件(例如Vim临时文件),请编辑(本地)文件.git/info/exclude并在其中添加您的排除模式。该文件旨在为开发人员提供特定于开发人员的排除,而不是.gitignore,后者旨在为整个项目提供排除。

简单地说,每个人都应该同意将什么添加到.gitignore。对于您不同意的文件,请使用.git/info/exclude


2
我将版本控制的文件添加到.get/info/exclude中,但它们仍然出现为修改过的文件。 - paullb
3
原问题是寻找一个方法让不同的同事可以忽略不同的文件集。我的答案介绍了.git/info/exclude文件,它就是为此设计的。然而,如果你将问题概括为“我如何忽略Git中已经添加的任何文件的更改”,那么你需要另一种解决方案,因为这是一个不同的问题。然而,对于这个具体问题,我不建议使用通用解决方案,因为同事们将无法共享.gitignore的更改。 - Greg Hewgill

11

你可以使用这个命令来获得你想要的内容。

git rm --cached path/to/file
或者
git rm -r --cached path/ignore/dir

这将仅从 git 移除跟踪,而不会删除实际的文件。

然后,您可以编辑忽略文件以取消跟踪这些文件或目录。


1
OP并不是在询问如何删除错误版本的文件,而是想知道如何保留它们的版本并在检查git状态时忽略它们。 - Daemon Painter

2
我无法真正回答这个一般性问题(让Git忽略已经跟踪的文件),因为我认为这个功能会比有用更加有害。
然而,gitignore手册页面指定了一些配置排除文件模式的方法。
特别是,它给出了如何使用这些不同方法的明确说明:
  • 应该被版本控制并通过克隆分发到其他存储库的模式(即,所有开发人员都想要忽略的文件)应该放在一个.gitignore文件中。
这意味着你的.gitignore文件不应该与你的同事不同 - 它正在按照预期工作。
以下是翻译:
  • 特定于某个存储库但不需要与其他相关存储库共享的模式(例如,位于存储库内部但特定于一个用户工作流程的辅助文件)应放入 $GIT_DIR/info/exclude 文件中。

  • 用户希望在所有情况下都忽略的模式(例如备份或用户选择的编辑器生成的临时文件)通常放入由用户的 ~/.gitconfig 中的 core.excludesfile 指定的文件中。

就是这样。将一个core.excludesfile文件路径指定到您的~/.gitconfig文件中,然后将要排除的模式放入其中。


1

我曾在其他地方写过排除文件的三种方法

总结如下:

  1. 全局 git ignore 文件适用于该系统上的所有存储库
  2. 存储库中的 .gitignore 文件适用于该存储库及其所有克隆版本。
  3. .git/info/exclude 文件仅适用于该存储库。

列表中较低的项目优先于较高的项目,文件中任何模式中的项目前面的 ! 将反转先前的排除。

这种范例在 Git 中也有所体现。例如,如果您正在使用子模块,则要使用的子模块的 URL 在存储库中的 .gitmodules 文件中,但是您可以在 .git/config 文件中覆盖要使用的 URL。


0

以下是一个普遍适用的解决方案,适用于在SmartGitHG可视化界面下使用Git的用户:

  • 在“仓库”窗口中选择要忽略的文件夹;
  • 在“文件”窗口中选择该文件夹中的所有文件(通过单击主窗口右上角的相应过滤器图标来取消隐藏未更改的文件);
  • 在控制面板上单击“删除”(如果需要,勾选“删除本地文件”复选框);
  • 提交本地更改;
  • 在“仓库”窗口中右键单击文件夹;
  • 单击“忽略”。

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