57

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

  1. 有什么方法可以忽略某个文件的更改,该文件已经由 Git 控制?!
  2. 有没有办法提交这些更改,但只为我自己保留?显然,我不想使用分支,因为我在某个分支上工作。
4

6 回答 6

129

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

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

要撤消该使用:

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

如果您需要在 git-reset 之后持续存在,还可以查看 update-index 的skip-worktreeand选项no-skip-worktree

于 2011-01-08T12:11:10.220 回答
15

如果您想排除特定于您的进程的文件(例如 Vim 临时文件),请编辑(本地)文件.git/info/exclude并在那里添加您的排除模式。此文件是为特定于开发人员的排除而.gitignore设计的,而不是为项目范围的排除而设计的。

简短的总结是,每个人都应该同意添加到.gitignore. 对于您不同意的文件,请使用.git/info/exclude.

于 2011-01-08T12:30:56.937 回答
10

你可以使用这个命令来得到你想要的。

git rm --cached path/to/file

或者

git rm -r --cached path/ignore/dir

这只会从 git 中删除轨道,不会删除真实文件。

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

于 2015-08-03T14:52:43.270 回答
2

我无法真正回答一般性问题(让 Git 忽略跟踪的文件)——它让我觉得这是一个弊大于利的功能。

但是,gitignore 手册页指定了一些为排除文件配置模式的方法。

特别是,它明确说明了如何使用这些不同的方式:

  • 应该受版本控制并通过克隆分发到其他存储库的模式(即,所有开发人员都希望忽略的文件)应该进入一个.gitignore文件。

这意味着您的.gitignore文件不应与您的同事不同 - 它按预期工作。

  • 特定于特定存储库但不需要与其他相关存储库共享的模式(例如,存在于存储库内但特定于一个用户的工作流程的辅助文件)应该进入该$GIT_DIR/info/exclude文件。

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

你有它。在文件中指定core.excludesfile文件路径~/.gitconfig,然后将要排除的模式放入其中。

于 2011-01-08T11:52:48.113 回答
1

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

总之:

  1. 全局 git 忽略文件适用于该系统上的所有存储库
  2. 存储库中的 .gitignore 文件应用该存储库和该存储库的所有克隆。
  3. .git/info/exclude 文件仅适用于该存储库。

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

这种范式在 Git 的其他地方也可以看到。例如,如果您使用子模块,则要使用的子模块的 url.gitmodules位于存储库中的文件中,但您可以覆盖 .git/config 文件中使用的 url。

于 2011-01-08T12:14:10.110 回答
0

对于在 SmartGitHG 可视化界面下使用 Git 的人来说,这是一个通用的、普遍的(不是个人的)解决方案:

  • 在“存储库”窗口中选择要忽略的文件夹;
  • 在“文件”窗口中选择该文件夹中的所有文件(通过单击主窗口右上方区域中的相应过滤器图标取消隐藏未更改的文件);
  • 单击控制面板上的“删除”(如果需要,请选中“删除本地文件”复选框);
  • 提交本地更改;
  • 右键单击“存储库”窗口中的文件夹;
  • 点击“忽略”。
于 2014-10-09T19:28:03.417 回答