Git忽略提交规则-.gitignore配置运维总结
在使⽤Git的过程中,我们喜欢有的⽂件⽐如⽇志,临时⽂件,编译的中间⽂件等不要提交到代码仓库,这时就要设置相应的忽略规则,来忽略这些⽂件的提交。简单来说⼀个场景:在你使⽤git add .的时候,遇到了把你不想提交的⽂件也添加到了缓存中去的情况,⽐如项⽬的本地配置信息,如果你上传到Git中去其他⼈pull下来的时候就会和他本地的配置有冲突,所以这样的个性化配置⽂件我们⼀般不把它推送到git 服务器中,但是⼜为了偷懒每次添加缓存的时候都想⽤git add .⽽不是⼿动⼀个⼀个⽂件添加,该怎么办呢?很简单,git为我们提供了⼀个.gitignore⽂件只要在这个⽂件中申明那些⽂件你不希望添加到git中去,这样当你使⽤git add .的时候这些⽂件就会被⾃动忽略掉。
有三种⽅法可以实现忽略Git中不想提交的⽂件:
1)在Git项⽬中定义.gitignore⽂件
对于经常使⽤Git的朋友来说,.gitignore配置⼀定不会陌⽣。这种⽅式通过在项⽬的某个⽂件夹下定义.gitignore⽂件,在该⽂件中定义相应的忽略规则,来管理当前⽂件夹下的⽂件的Git提交⾏为。.gitignore ⽂件是可以提交到公有仓库中,这就为该项⽬下的所有开发者都共享⼀套定义好的忽略规则。在.gitingore ⽂件中,遵循相应的语法,在每⼀⾏指定⼀个忽略规则。如:
*.log
*.temp
/vendor
2)在Git项⽬的设置中指定排除⽂件
这种⽅式只是临时指定该项⽬的⾏为,需要编辑当前项⽬下的 .git/info/exclude⽂件,然后将需要忽略提交的⽂件写⼊其中。需要注意的是,这种⽅式指定的忽略⽂件的根⽬录是项⽬根⽬录。
3)定义Git全局的 .gitignore ⽂件
除了可以在项⽬中定义 .gitignore ⽂件外,还可以设置全局的git .gitignore⽂件来管理所有Git项⽬的⾏为。这种⽅式在不同的项⽬开发者之间是不共享的,是属于项⽬之上Git应⽤级别的⾏为。这种⽅式也需要创建相应的 .gitignore ⽂件,可以放在任意位置。然后在使⽤以下命令配置Git:
# git config --ludesfile ~/.gitignore
⾸先要强调⼀点,这个⽂件的完整⽂件名就是".gitignore",注意最前⾯有个“.”。⼀般来说每个Git项⽬中都需要⼀个“.gitignore”⽂件,这个⽂件的作⽤就是告诉Git哪些⽂件不需要添加到版本管理中。实际项⽬中,很多⽂件都是不需要版本管理的,⽐如Python的.pyc⽂件和⼀些包含密码的配置⽂件等等。这个⽂件的内容是⼀些规则,Git会根据这些规则来判断是否将⽂件添加到版本控制中。
Git忽略⽂件的原则
- 忽略操作系统⾃动⽣成的⽂件,⽐如缩略图等;
- 忽略编译⽣成的中间⽂件、可执⾏⽂件等,也就是如果⼀个⽂件是通过另⼀个⽂件⾃动⽣成的,那⾃动⽣成的⽂件就没必要放进版本库,⽐如Java编译产⽣的.class⽂件;
- 忽略你⾃⼰的带有敏感信息的配置⽂件,⽐如存放⼝令的配置⽂件。
.gitignore⽂件的使⽤⽅法
⾸先,在你的⼯作区新建⼀个名称为.gitignore的⽂件。
然后,把要忽略的⽂件名填进去,Git就会⾃动忽略这些⽂件。
不需要从头写.gitignore⽂件,GitHub已经为我们准备了各种配置⽂件,只需要组合⼀下就可以使⽤了。
有时对于git项⽬下的某些⽂件,我们不需要纳⼊版本控制,⽐如⽇志⽂件或者IDE的配置⽂件,此时可以在项⽬的根⽬录下建⽴⼀个隐藏⽂件 .gitignore(linux下以.开头的⽂件都是隐藏⽂件),然后在.gitignore中写⼊需要忽略的⽂件。
[root@kevin ~]# cat .gitignore
*.xml
*.log
*.apk
.gitignore注释⽤'#', *表⽰匹配0个或多个任意字符,所以上⾯的模式就是要忽略所有的xml⽂件,log⽂件和apk⽂件。
.gitignore配置⽂件⽤于配置不需要加⼊版本管理的⽂件,配置好该⽂件可以为版本管理带来很⼤的便利。
.gitignore忽略规则的优先级
在 .gitingore ⽂件中,每⼀⾏指定⼀个忽略规则,Git检查忽略规则的时候有多个来源,它的优先级如下(由⾼到低):
1)从命令⾏中读取可⽤的忽略规则
2)当前⽬录定义的规则
3)⽗级⽬录定义的规则,依次递推
4)$GIT_DIR/info/exclude ⽂件中定义的规则
5)ludesfile中定义的全局规则
.gitignore忽略规则的匹配语法
在 .gitignore ⽂件中,每⼀⾏的忽略规则的语法如下:
1)空格不匹配任意⽂件,可作为分隔符,可⽤反斜杠转义
2)以“#”开头的⾏都会被 Git 忽略。即#开头的⽂件标识注释,可以使⽤反斜杠进⾏转义。
3)可以使⽤标准的glob模式匹配。所谓的glob模式是指shell所使⽤的简化了的正则表达式。
4)以斜杠"/"开头表⽰⽬录;"/"结束的模式只匹配⽂件夹以及在该⽂件夹路径下的内容,但是不匹配该⽂件;"/"开始的模式匹配项⽬跟⽬
录;如果⼀个模式不包含斜杠,则它匹配相对于当前 .gitignore ⽂件路径的内容,如果该模式不在 .gitignore ⽂件中,则相对于项⽬根⽬录。5)以星号"*"通配多个字符,即匹配多个任意字符;使⽤两个星号"**" 表⽰匹配任意中间⽬录,⽐如`a/**/z`可以匹配 a/z, a/b/z 或 a/b/c/z等。6)以问号"?"通配单个字符,即匹配⼀个任意字符;
7)以⽅括号"[]"包含单个字符的匹配列表,即匹配任何⼀个列在⽅括号中的字符。⽐如[abc]表⽰要么匹配⼀个a,要么匹配⼀个b,要么匹配⼀个c;如果在⽅括号中使⽤短划线分隔两个字符,表⽰所有在这两个字符范围内的都可以匹配。⽐如[0-9]表⽰匹配所有0到9的数字,[a-z]表⽰匹配任意的⼩写字母)。
8)以叹号"!"表⽰不忽略(跟踪)匹配到的⽂件或⽬录,即要忽略指定模式以外的⽂件或⽬录,可以在模式前加上惊叹号(!)取反。需要特别注意的是:如果⽂件的⽗⽬录已经被前⾯的规则排除掉了,那么对这个⽂件⽤"!"规则是不起作⽤的。也就是说"!"开头的模式表⽰否定,该⽂件将会再次被包含,如果排除了该⽂件的⽗级⽬录,则使⽤"!"也不会再次被包含。可以使⽤反斜杠进⾏转义。
需要谨记:git对于.ignore配置⽂件是按⾏从上到下进⾏规则匹配的,意味着如果前⾯的规则匹配的范围更⼤,则后⾯的规则将不会⽣效;
.gitignore忽略规则简单说明
# 表⽰此为注释,将被Git忽略git常用指令
*.a 表⽰忽略所有 .a 结尾的⽂件
!lib.a 表⽰但lib.a除外
/TODO 表⽰仅仅忽略项⽬根⽬录下的 TODO ⽂件,不包括 subdir/TODO
build/ 表⽰忽略 build/⽬录下的所有⽂件,过滤整个build⽂件夹;
doc/*.txt 表⽰会忽略但不包括 doc/
bin/: 表⽰忽略当前路径下的bin⽂件夹,该⽂件夹下的所有内容都会被忽略,不忽略 bin ⽂件
/bin: 表⽰忽略根⽬录下的bin⽂件
/*.c: 表⽰忽略cat.c,不忽略 build/cat.c
debug/*.obj: 表⽰忽略debug/io.obj,不忽略 debug/common/io.obj和tools/debug/io.obj
**/foo: 表⽰忽略/foo,a/foo,a/b/foo等
a/**/b: 表⽰忽略a/b, a/x/b,a/x/y/b等
!/bin/run.sh 表⽰不忽略bin⽬录下的run.sh⽂件
*.log: 表⽰忽略所有 .log ⽂件
config.php: 表⽰忽略当前路径的 config.php ⽂件
/mtk/ 表⽰过滤整个⽂件夹
*.zip 表⽰过滤所有.zip⽂件
/mtk/do.c 表⽰过滤某个具体⽂件
被过滤掉的⽂件就不会出现在git仓库中(gitlab或github)了,当然本地库中还有,只是push的时候不会上传。
需要注意的是,gitignore还可以指定要将哪些⽂件添加到版本管理中,如下:
!*.zip
!/
唯⼀的区别就是规则开头多了⼀个感叹号,Git会将满⾜这类规则的⽂件添加到版本管理中。为什么要有两种规则呢?
想象⼀个场景:假如我们只需要管理/mtk/⽬录中的⽂件,这个⽬录中的其他⽂件都不需要管理,那么.gitignore规则应写为::
/mtk/*
!/
假设我们只有过滤规则,⽽没有添加规则,那么我们就需要把/mtk/⽬录下除了以外的所有⽂件都写出来!
注意上⾯的/mtk/*不能写为/mtk/,否则⽗⽬录被前⾯的规则排除掉了,⽂件虽然加了!过滤规则,也不会⽣效!
----------------------------------------------------------------------------------
还有⼀些规则如下:
fd1/*
说明:忽略⽬录 fd1 下的全部内容;注意,不管是根⽬录下的 /fd1/ ⽬录,还是某个⼦⽬录 /child/fd1/ ⽬录,都会被忽略;
/fd1/*
说明:忽略根⽬录下的 /fd1/ ⽬录的全部内容;
/*
!.gitignore
!/fw/
/fw/*
!/fw/bin/
!/fw/sf/
说明:忽略全部内容,但是不忽略 .gitignore ⽂件、根⽬录下的 /fw/bin/ 和 /fw/sf/ ⽬录;注意要先对bin/的⽗⽬录使⽤!规则,使其不被排除。
温馨提⽰:
如果你不慎在创建.gitignore⽂件之前就push了项⽬,那么即使你在.gitignore⽂件中写⼊新的过滤规则,这些规则也不会起作⽤,Git仍然会对所有⽂件进⾏版本管理。简单来说出现这种问题的原因就是Git已经开始管理这些⽂件了,所以你⽆法再通过过滤规则过滤它们。所以⼤家⼀定要养成在项⽬开始就创建.gitignore⽂件的习惯,否则⼀单push,处理起来会⾮常⿇烦。
.gitignore忽略规则常⽤⽰例
1)⽰例
⽐如你的项⽬是java项⽬,.java⽂件编译后会⽣成.class⽂件,这些⽂件多数情况下是不想被传到仓库中的⽂件。这时候你可以直接适⽤github的.gitignore⽂件模板。将这些忽略⽂件信息复制到你的.gitignore⽂件中去:
# Compiled class file
*.class
# BlueJ files
*.ctxt
# Mobile Tools for Java (J2ME)
.p/
# Package Files #
*.jar
*.war
*.nar
*.ear
*.zip
*.
*.rar
# virtual machine crash logs, see www.java/en/download/help/l
hs_err_pid*
可以看到github为我们提供了最流⾏的.gitignore⽂件配置。保存.ignore⽂件后我们查看下git status,检查下是否还有我们不需要的⽂件会被添加到git中去:
$ git status
On branch master
Initial commit
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: .gitignore
new file: HelloWorld.java
Untracked files:
(use "git add <file>..." to include in what will be committed)
Config.ini
⽐如我的项⽬⽬录下有⼀个Config.ini⽂件,这个是个本地配置⽂件我不希望上传到git中去,我们可以在gitignore⽂件中添加这样的配置:
Config.ini
或者你想忽略所有的.ini⽂件你可以这样写:
*.ini
如果有些⽂件已经被你忽略了,当你使⽤git add时是⽆法添加的,⽐如我忽略了*.class,现在我想把HelloWorld.class添加到git中去:
$ git add HelloWorld.class
The following paths are ignored by one of your .gitignore files:
HelloWorld.class
Use -f if you really want to add them.
git会提⽰我们这个⽂件已经被我们忽略了,需要加上-f参数才能强制添加到git中去:
$ git status
On branch master
Initial commit
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: .gitignore
new file: HelloWorld.class
new file: HelloWorld.java
这样就能强制添加到缓存中去了。如果我们意外的将想要忽略的⽂件添加到缓存中去了,我们可以使⽤rm命令将其从中移除:
$ git rm HelloWorld.class --cached
rm 'HelloWorld.class'
如果你已经把不想上传的⽂件上传到了git仓库,那么你必须先从远程仓库删了它,我们可以从远程仓库直接删除然后pull代码到本地仓库这些⽂件就会本删除,或者从本地删除这些⽂件并且在.gitignore⽂件中添加这些你想忽略的⽂件,然后再push到远程仓库。
2)⽰例
下⾯是曾经线上使⽤过的⼀个gerrit⾥项⽬代码的.gitignore的配置(在项⽬中添加.gitignore过滤⽂件,在git push到gerrit⾥即可)
[wangshibo@gerrit-server hq_ios]$ cat .gitignore
#Built application files
# Files for the Dalvik VM
*.dex
# Java class files
*.class
# Generated files
*/bin/
*/gen/
*/out/
# Gradle files
.gradle/
build/
*/build/
gradlew
gradlew.bat
# Local configuration file (sdk path, etc) local.properties
# Proguard folder generated by Eclipse proguard/
# Log Files
*.log
# Android Studio Navigation editor temp files .navigation/
# Android Studio captures folder
captures/
# Intellij
*.iml
*/*.iml
# Keystore files
#*.jks
#gradle wrapper
gradle/
#some local files
*/.settings/
*/.DS_Store
.DS_Store
*/.idea/
.idea/
gradlew
gradlew.bat
<
3)⽰例
[wangshibo@gerrit-server hq_ios$ cat .gitignore # Lines that start with '#' are comments.
# IntelliJ IDEA Project files
.idea
*.iml
*.ipr
*.iws
out
# Eclipse Project files
.
classpath
.project
.settings/
bin/
gen/
local.properties
.DS_Store
Thumbs.db
*.bak
*.tem
*.temp
#.swp
*.*~
~*.*
.gitignor忽略规则查看
如果你发下.gitignore写得有问题,需要出来到底哪个规则写错了,可以⽤git check-ignore命令检查:
$ git check-ignore -v HelloWorld.class
.gitignore:1:*.class HelloWorld.class
可以看到HelloWorld.class匹配到了我们的第⼀条*.class的忽略规则所以⽂件被忽略了。
简单来说,要实现过滤掉Git⾥不想上传的⽂件,如上介绍三种⽅法能达到这种⽬的,只不过适⽤情景不⼀样:
============第⼀种⽅法===========
针对单⼀⼯程排除⽂件,这种⽅式会让这个⼯程的所有修改者在克隆代码的同时,也能克隆到过滤规则,⽽不⽤⾃⼰再写⼀份,
这就能保证所有修改者应⽤的都是同⼀份规则,⽽不是张三⾃⼰有⼀套过滤规则,李四⼜使⽤另⼀套过滤规则,个⼈⽐较喜欢这个。
配置步骤如下:
在⼯程根⽬录下建⽴.gitignore⽂件,将要排除的⽂件或⽬录写到.gitignore这个⽂件中,其中有两种写⼊⽅法:
a)使⽤命令⾏增加排除⽂件
排除以.class结尾的⽂件 echo "*.class" >.gitignore (>> 是在⽂件尾增加,> 是删除已经存在的内容再增加),之后会在当前⽬录下
⽣成⼀个.gitignore的⽂件。排除bin⽬录下的⽂件 echo "bin/" >.gitignore
b)最⽅便的办法是,⽤记事本打开,增加需要排除的⽂件或⽬录,⼀⾏增加⼀个,例如:
*.class
*.apk
bin/
gen/
.settings/
proguard/
===========第⼆种⽅法===========
全局设置排除⽂件,这会在全局起作⽤,只要是Git管理的⼯程,在提交时都会⾃动排除不在控制范围内的⽂件或⽬录。这种⽅法对开发者来说,
⽐较省事,只要⼀次全局配置,不⽤每次建⽴⼯程都要配置⼀遍过滤规则。但是这不保证其他的开发者在克隆你的代码后,他们那边的规则跟你
的是⼀样的,这就带来了代码提交过程中的各种冲突问题。
配置步骤如下:
a)像⽅法(1)⼀样,也需要建⽴⼀个.gitignore⽂件,把要排除的⽂件写进去。
b)但在这⾥,我们不规定⼀定要把.gitnore⽂件放到某个⼯程下⾯,⽽是任何地⽅,⽐如我们这⾥放到了Git默认的Home路径下,⽐如:/home/wangshibo/hqsb_ios
c)使⽤命令⽅式可以配置全局排除⽂件:
# git config --ludesfile ~/.gitignore
你会发现在~/.gitconfig⽂件中会出现excludesfile = /home/wangshibo/hqsb_ios/.gitignore。
说明Git把⽂件过滤规则应⽤到了Global的规则中。
===========第三种⽅法===========
单个⼯程设置排除⽂件,在⼯程⽬录下到.git/info/exclude,把要排除的⽂件写进去:
*.class
*.apk
bin/
gen/
.settings/
proguard/
这种⽅法就不提倡了,只能针对单⼀⼯程配置,⽽且还不能将过滤规则同步到其他开发者,跟⽅法⼀和⽅法⼆⽐较起来没有⼀点优势。
Git忽略规则(.gitignore配置)不⽣效原因和解决
第⼀种⽅法:
.gitignore中已经标明忽略的⽂件⽬录下的⽂件,git push的时候还会出现在push的⽬录中,或者⽤git status查看状态,想要忽略的⽂件还是显⽰被追踪状态。
原因是因为在git忽略⽬录中,新建的⽂件在git中会有缓存,如果某些⽂件已经被纳⼊了版本管理中,就算是在.gitignore中已经声明了忽略路径也是不起作⽤的,
这时候我们就应该先把本地缓存删除,然后再进⾏git的提交,这样就不会出现忽略的⽂件了。
解决⽅法: git清除本地缓存(改变成未track状态),然后再提交:
[root@kevin ~]# git rm -r --cached .
[root@kevin ~]# git add .
[root@kevin ~]# git commit -m 'update .gitignore'
[root@kevin ~]# git push -u origin master
需要特别注意的是:
1).gitignore只能忽略那些原来没有被track的⽂件,如果某些⽂件已经被纳⼊了版本管理中,则修改.gitignore是⽆效的。
2)想要.gitignore起作⽤,必须要在这些⽂件不在暂存区中才可以,.gitignore⽂件只是忽略没有被staged(cached)⽂件,
对于已经被staged⽂件,加⼊ignore⽂件时⼀定要先从staged移除,才可以忽略。
第⼆种⽅法:(推荐)
在每个clone下来的仓库中⼿动设置不要检查特定⽂件的更改情况。
[root@kevin ~]# git update-index --assume-unchanged PATH //在PATH处输⼊要忽略的⽂件
在使⽤.gitignore⽂件后如何删除远程仓库中以前上传的此类⽂件⽽保留本地⽂件
在使⽤git和github的时候,之前没有写.gitignore⽂件,就上传了⼀些没有必要的⽂件,在添加了.gitignore⽂件后,就想删除远程仓库中的⽂件却想保存本地的⽂件。这时候不可以直接使⽤"git rm directory",这样会删除本地仓库的⽂件。可以使⽤"git rm -r –cached directory"来删除缓冲,然后进⾏"commit"和"push",这样会发现远程仓库中的不必要⽂件就被删除了,以后可以直接使⽤"git add -A"来添加修改的内容,上传的⽂件就会受到.gitignore⽂件的内容约束。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论