Git高级技巧之忽略文件

Git高级技巧之忽略文件

前言

前段时间新参与公司的一个项目,由于服务器 ruby 版本管理用的是 rvm,我在本地用的是 rbenv,这两个 ruby 版本管理软件都用到了.ruby-version作为配置文件,但是语法不一样。 我的需求是在本地改动.ruby-version这个文件,但是让 git 忽略我在本地的改动。 首先我想到的是使用.gitignore配置文件,但是使用.gitignore会将.ruby-version这个文件删除,这显然不是我想要的结果。 那怎么解决这个问题呢?

git 忽略文件的两个类型

git 忽略文件的类型分为:临时忽略,永久忽略两个类型。.gitignore实际是属于永久忽略一个文件。

git 临时忽略文件

命令:git update-index --assume-unchanged <file>

我先在项目下运行 git status,结果是这样的:

On branch master
Your branch is up-to-date with 'origin/master'.

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   .ruby-version

no changes added to commit (use "git add" and/or "git commit -a")

然后我运行命令:git update-index --assume-unchanged .ruby-version

改动果然被忽略了:

On branch master
Your branch is up-to-date with 'origin/master'.

nothing to commit, working directory clean

但是我还是有个疑问,我怎么知道我将哪些文件临时忽略了呢?

命令:git ls-files -v

结果如下:

...
H .gitignore
h .ruby-version
H 404.html
...

要知道git ls-files -v这个命令的结果含义,首先需要了解git ls-files -t,这个命令会列出各个文件的状态。

文件前面那个字母标志的含义如下: - H cached - S skip-worktree - M unmerged - R removed/deleted - C modified/changed - K to be killed - ? other

git ls-files -v-t的升级版,对应小写字母则表示这个文件是否被临时忽略。

有结就有解,继续跟踪的命令是:git update-index --no-assume-unchanged <file>

永久忽略

永久忽略一般大家都知道,主要就是.gitignore的配置,这个配置分为三个级别:

项目中的.gitignore文件

这个是放在版本库里共享的;

项目中.git目录下地info/exclude文件

这个是本地针对该项目忽略的,比如我 ruby 的项目用的编辑器会生成一个.idea的文件夹,就在这里配置忽略;

全局配置

需要在.gitconfig文件中指定一个全局的配置文件路径,如:

[core]
    excludesfile = /Users/qin/.gitignore

比如 mac 电脑会生成一个.DS_Store的文件,就适合在这里配置,对所有项目生效。