.gitignore忽略规则常用示例
1)示例
比如你的项目是java项目,.java文件编译后会生成.class文件,这些文件多数情况下是不想被传到仓库中的文件。这时候你可以直接适用github的.gitignore文件模板。https://github.com/github/gitignore/blob/master/Java.gitignore 将这些忽略文件信息复制到你的.gitignore文件中去:
# Compiled
class file
\*.class
# Log file
\*.log
# BlueJ files
\*.ctxt
# Mobile Tools for Java (J2ME)
.mtj.tmp/
# Package Files #
\*.jar
\*.war
\*.nar
\*.ear
\*.zip
\*.tar.gz
\*.rar
# virtual machine crash logs, see http://www.java.com/en/download/help/error\_hotspot.xml
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里不想上传的文件,如上介绍三种方法能达到这种目的,只不过适用情景不一样:
\============第一种方法===========
针对单一工程排除文件,这种方式会让这个工程的所有修改者在克隆代码的同时,也能克隆到过滤规则,而不用自己再写一份,
这就能保证所有修改者应用的都是同一份规则,而不是张三自己有一套过滤规则,李四又使用另一套过滤规则,个人比较喜欢这个。
配置步骤如下:
在工程根目录下建立.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 --global core.excludesfile ~/.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文件的内容约束。
额外说明:git库所在的文件夹中的文件大致有4种状态
Untracked:
未跟踪,
此文件在文件夹中,
但并没有加入到git库,
不参与版本控制.
通过git add 状态变为Staged.
Unmodify:
文件已经入库,
未修改,
即版本库中的文件快照内容与文件夹中完全一致.
这种类型的文件有两种去处,
如果它被修改,
而变为Modified.
如果使用git rm移出版本库,
则成为Untracked文件
Modified:
文件已修改,
仅仅是修改,
并没有进行其他的操作.
这个文件也有两个去处,
通过git add可进入暂存staged状态,
使用git checkout 则丢弃修改过,
返回到unmodify状态,
这个git checkout即从库中取出文件,
覆盖当前修改
Staged:
暂存状态.
执行git commit则将修改同步到库中,
这时库中的文件和本地文件又变为一致,
文件为Unmodify状态.
执行git reset HEAD filename取消暂存,
文件状态为Modified
Git
状态 untracked 和
not staged的区别
1)untrack 表示是新文件,没有被add过,是为跟踪的意思。
2)not staged 表示add过的文件,即跟踪文件,再次修改没有add,就是没有暂存的意思
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。