2018.7.18 星期四 17:03
忽略文件
但是不想在.gitignore 中,该文件已经在git中了。我们只是本地忽略了,不需要提交。
有三种方法可以实现忽略Git中不想提交的文件。
1、在Git项目中定义 .gitignore 文件
2、在Git项目的设置中指定排除文件
这种方式只是临时指定该项目的行为,需要编辑当前项目下的 .git/info/exclude 文件,然后将需要忽略提交的文件写入其中。
需要注意的是,这种方式指定的忽略文件的根目录是项目根目录。
3、定义Git全局的 .gitignore 文件
除了可以在项目中定义 .gitignore 文件外,还可以设置全局的 git .gitignore 文件来管理所有Git项目的行为。这种方式在不同的项目开发者之间是不共享的,是属于项目之上Git应用级别的行为。
这种方式也需要创建相应的 .gitignore 文件,可以放在任意位置。然后在使用以下命令配置Git:
1 | # *nix or Windows git bash: |
1 | #### 自己不需要的全局的ignore文件 #### |
用2和3的方法,在全局和项目中排除。
git 文件忽略
在使用git进行版本管理时,有一些不需要提交到版本库里的文件和文件夹,或者在管理一个实际应用的开源项目的时候,不可以把带有数据库信息的文件上传到开源平台当中,此时就需要让git自动忽略掉一下文件。文件忽略有几种方式:
一 没有被track的文件
我们需要在项目的根目录当中创建.gitignore文件。 .gitignore 的格式规范如下:
1. 所有空行或者以注释符号 # 开头的行都会被 Git 忽略;
1. 匹配模式最后跟反斜杠(/)说明要忽略的是目录;
1. 要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号(!)取反;
1. 可以使用标准的 glob 模式匹配;
所谓的 glob 模式是指 shell 所使用的简化了的正则表达式:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17*星 匹配零个或多个任意字符;
? 只匹配一个任意字符;
[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的内容:1
2
3
4
5
6[core]
excludesfile = c:/Users/你的账户文件夹/.gitignore_global
或者,在Git的命令行里输入:
$ git config --global core.excludesfile ~/.gitignore_global
注意:exclude 忽略的也是未tract的文件。
三 文件已被track
即远程仓库中已经包含或者已经commit/add了,这时再在.gitignore中添加规则忽略已经无法生效了,正确的做法是:
1. 首先,删除暂存区或分支上的文件,$ git rm --cached config.xml
2. 然后,更新.gitignore文件忽略掉config.xml
3. 最后,$ 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 目录了。
17:17
排除忽略
如果你排除了application/,那么它下的所有东西都会被排除在外(即使一些后来的否定排除模式(“unignore”)可能与下面的内容相匹配)。application/).
要想做您想做的事情,您必须“unignore”您想要“unignore”的任何东西的每个父目录。通常情况下,您会成对地编写规则:忽略目录中的所有内容,而不是某些特定的子目录。
you can skip this first one if it is not already excluded by prior patterns !application/
1 | application/* |
注: 尾随/*意义重大:
模式 dir/
不包括名为 dir, 以及(隐式地)它下面的一切。
带着
dir/
,Git永远不会看下面的任何东西
dir
,因此永远不会将任何“不排除”模式应用于下面的任何内容。
dir.
模式
dir/*
什么都没说
dir
它本身;它只是排除了下面的一切
dir
..带着
dir/*
,git将处理
dir
,使其他模式有机会“不排除”一些内容(
!dir/sub/).