问题描述
我们知道 .gitignore 能够用来忽略未被 Git 仓库管理的文件/文件夹 (untracked files),也就是说,如果一个文件还没被加入到 Git 仓库中,而它的名字出现在 .gitignore 文件中,那么 git status
和 git add
等命令会自动忽略这个文件,就好像这个文件不存在一样。这一功能通常被用来排除一些不想加入到仓库中的临时文件,比如构建目录(build 文件夹)及 IDE 自动生成的文件/文件夹等。
不过,还有一种情况是:有的文件我们希望加入到仓库中,但又不希望 Git 跟踪其后续的修改。比如我们写了一个示例配置文件,已经加入到仓库中(为了让其他人能够知道配置文件格式是怎样的),而在自己本地使用该配置文件时需要在里面做针对性的修改(比如自己电脑上某个文件的绝对路径),此时这种修改自然不希望提交到 Git 仓库中。
但由于文件已经被 Git 管理,.gitignore 对于它们是无效的!我们在执行 git status
的时候,总能看到它们被修改的状态,尤其是存在这种情况的文件很多时(比如一个文件夹下所有的文件都存在希望被忽略的修改),git status
和 git diff
的结果会十分混乱,干扰我们本想关注的修改。而且我们在 git add
的时候,还需要格外注意排除这些修改,防止误将它们提交到仓库。
如何使 Git 忽略掉这些已经被仓库管理的文件的修改呢?
解决方法
参见 stackoverflow: Ignore files that have already been committed to a Git repository
使用以下命令可以在本地目录中忽略掉指定文件的修改:
git update-index --assume-unchanged <file>
撤销忽略的命令:
git update-index --no-assume-unchanged <file>
查询被忽略的文件:
git ls-files -v | grep "^[[:lower:]]"
利用命令别名,方便查询被忽略的文件:
git config --global alias.ignored '!git ls-files -v | grep "^[[:lower:]]"'
# 执行 git ignored 即可查询被忽略的文件