.gitignore 文件对于忽略一些我们不想控制的文件非常有用。不幸的是,当文件已经在版本控制下时,它不能使用。例如,我的 .gitignore(已添加到 git)文件可能与我的同事想要的不同(例如,我想忽略 Vim 文件)。每当我对此文件进行更改时,git 都会将其显示为修改后的文件。所以我的问题:
- 有什么方法可以忽略某个文件的更改,该文件已经由 Git 控制?!
- 有没有办法提交这些更改,但只为我自己保留?显然,我不想使用分支,因为我在某个分支上工作。
使用git-update-index暂时忽略对已经在版本控制下的文件的更改:
git update-index --assume-unchanged <files>
要撤消该使用:
git update-index --no-assume-unchanged <files>
如果您需要在 git-reset 之后持续存在,还可以查看 update-index 的skip-worktree
and选项no-skip-worktree
如果您想排除特定于您的进程的文件(例如 Vim 临时文件),请编辑(本地)文件.git/info/exclude
并在那里添加您的排除模式。此文件是为特定于开发人员的排除而.gitignore
设计的,而不是为项目范围的排除而设计的。
简短的总结是,每个人都应该同意添加到.gitignore
. 对于您不同意的文件,请使用.git/info/exclude
.
你可以使用这个命令来得到你想要的。
git rm --cached path/to/file
或者
git rm -r --cached path/ignore/dir
这只会从 git 中删除轨道,不会删除真实文件。
然后您可以编辑忽略文件以取消跟踪这些文件或目录。
我无法真正回答一般性问题(让 Git 忽略跟踪的文件)——它让我觉得这是一个弊大于利的功能。
但是,gitignore 手册页指定了一些为排除文件配置模式的方法。
特别是,它明确说明了如何使用这些不同的方式:
- 应该受版本控制并通过克隆分发到其他存储库的模式(即,所有开发人员都希望忽略的文件)应该进入一个
.gitignore
文件。
这意味着您的.gitignore
文件不应与您的同事不同 - 它按预期工作。
特定于特定存储库但不需要与其他相关存储库共享的模式(例如,存在于存储库内但特定于一个用户的工作流程的辅助文件)应该进入该
$GIT_DIR/info/exclude
文件。用户希望 git 在所有情况下都忽略的模式(例如,由用户选择的编辑器生成的备份或临时文件)通常进入
core.excludesfile
用户的~/.gitconfig
.
你有它。在文件中指定core.excludesfile
文件路径~/.gitconfig
,然后将要排除的模式放入其中。
我已经写过三种在其他地方排除文件的方法。
总之:
列表中较低的项目优先于较高的项目,并且!
文件中任何模式中项目前面的 a 会反转先前的排除项。
这种范式在 Git 的其他地方也可以看到。例如,如果您使用子模块,则要使用的子模块的 url.gitmodules
位于存储库中的文件中,但您可以覆盖 .git/config 文件中使用的 url。
对于在 SmartGitHG 可视化界面下使用 Git 的人来说,这是一个通用的、普遍的(不是个人的)解决方案: