在使用git进行版本管理时,有一些不需要提交到版本库里的文件和文件夹,或者在管理一个实际应用的开源项目的时候,不可以把带有数据库信息的文件上传到开源平台当中,此时就需要让git自动忽略掉一下文件。文件忽略有几种方式:
-
没有被track的文件
我们需要在项目的根目录当中创建.gitignore文件。 .gitignore 的格式规范如下:
- 所有空行或者以注释符号 # 开头的行都会被 Git 忽略;
- 匹配模式最后跟反斜杠(/)说明要忽略的是目录;
- 要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号(!)取反;
- 可以使用标准的 glob 模式匹配;
所谓的 glob 模式是指 shell 所使用的简化了的正则表达式:
*星 匹配零个或多个任意字符; ? 只匹配一个任意字符; [abc] 匹配任何一个列在方括号中的字符(这个例子要么匹配一个 a,要么匹配一个 b,要么匹配一个 c); [0-9] 表示匹配所有 0 到 9 的数字; *? 代表任意的一个字符 ** 代表任意数目的字符 *{!ab} 必须不是此类型 *{ab,bb,cx} 代表ab,bb,cx中任一类型即可 *[ ^abc] 代表必须不是a,b,c中任一字符
由于git不会加入空目录,所以下面做法会导致tmp不会存在
tmp/* //忽略tmp文件夹所有文件
改下方法,在tmp下也加一个.gitignore,内容为
* !.gitignore
注意:.gitignore只能忽略那些原来没有被track的文件,如果某些文件已经被纳入了版本管理中,则修改.gitignore是无效的
-
另外 git 还提供了另一种 exclude 的方式来做同样的事情。不同的是 .gitignore 这个文件本身会提交到版本库中去,用来保存的是公共的需要排除的文件。而 .git/info/exclude 这里设置的则是你自己本地需要排除的文件,不会提交到版本库,只对本地副本有效, 他不会影响到其他人。
exclude 文件所在位置.git/info/exclude , 每个项目下都有自己的exclude
vim .git/info/exclude
全局ignore方法,唯一,本地所有git repo有效。~/.gitconfig/core.excludesfile
1.账户文件夹下新建一个.gitignore_global文件
2.直接修改.gitconfig的内容:[core] excludesfile = c:/Users/你的账户文件夹/.gitignore_global
或者,在Git的命令行里输入:
$ git config --global core.excludesfile ~/.gitignore_global
注意:exclude 忽略的也是未tract的文件
。 -
文件已被track,即远程仓库中已经包含或者已经commit/add了,这时再在.gitignore中添加规则忽略已经无法生效了,正确的做法是:
首先,删除暂存区或分支上的文件,`$ git rm --cached config.xml` 然后,更新.gitignore文件忽略掉config.xml 最后,`$ git commit -m ""`
按照上面的方法,当你push之后,服务器的config.xml文件将被删除。本地存在可使用, 只是文件不被版本控制(如果没有更新 .gitignore, 会提示有untrack文件)。有一点需要注意的,git rm --cached 不会删除本地的物理文件;如果你真的是彻底不想要了,你也可以直接 rm+忽略+提交,即不要 --cached 参数。
-
只是想在本地忽略某文件的修改,但是服务器保存一份副本。 正确的做法是在每个clone下来的仓库中手动设置不要检查特定文件的更改情况。
对于所有协同开发人员以及任何新加入的开发人员执行:
$ git update-index --assume-unchanged FILE 在FILE处输入要忽略的文件. 假设未更改
查看忽略的文件列表
$ git ls-files -v|grep h\ // \后面有空格
如果要还原的话,使用命令:
$ git update-index --no-assume-unchanged FILE
这样就可以在本地版本库中忽略FILE文件的修改。但是,切记一点,这样做必须保证协同开发的所有人都执行此命令,但凡有一个人不执行,则FILE文件的更改等到commit和push的时候便会更新到服务器而导致不愿发生的情形出现。 亲手实验结果:如果本地执行假设未更改的命令,其他人修改了文件并推送后,本地git pull提示:error: Your local changes to the following files would be overwritten by merge: FILE。git status,nothing to commit, working tree clean。如果没有更改,可以正常git pull合并,但会失去忽略状态。
-
.gitignore 还有个有意思的小功能
一个空的 .gitignore 文件 可以当作是一个 placeholder 。当你需要为项目创建一个空的 log 目录时, 这就变的很有用。 你可以创建一个 log 目录 在里面放置一个空的 .gitignore 文件。这样当你 clone 这个 repo 的时候 git 会自动的创建好一个空的 log 目录了。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。