Git文件忽略

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
2
3
4
5
6
# *nix or Windows git bash:
git config --global core.excludesfile ~/.gitignore
# Windows cmd:
git config --global core.excludesFile "%USERPROFILE%\.gitignore"
# Windows PowerShell:
git config --global core.excludesFile "$Env:USERPROFILE\.gitignore"
1
2
3
4
5
6
7
8
9
10
11
12
13
#### 自己不需要的全局的ignore文件 ####
# .gitignore
yarn.lock
# package.json
package-lock.json
build/config.gypi
### 常规文件 ###
*.local.*
*-mock*
*-org*
* copy.*
*-backup*
*开发.md

用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
2
3
4
5
application/*
!application/language/

application/language/*
!application/language/gr/

注: 尾随/*意义重大:

模式 dir/

不包括名为 dir, 以及(隐式地)它下面的一切。

带着
dir/

,Git永远不会看下面的任何东西
dir

,因此永远不会将任何“不排除”模式应用于下面的任何内容。
dir.

模式
dir/*

什么都没说
dir

它本身;它只是排除了下面的一切
dir

..带着
dir/*

,git将处理
dir

,使其他模式有机会“不排除”一些内容(
!dir/sub/).

knowledge is no pay,reward is kindness
0%