Git过滤上传文件的方法

2015-05-14 Eric Wang 更多博文 » 博客 » GitHub »

Git

原文链接 http://codepub.cn/2015/05/14/Git-filtering-method-of-uploaded-files/
注:以下为加速网络访问所做的原文缓存,经过重新格式化,可能存在格式方面的问题,或偶有遗漏信息,请以原文为准。


针对单一工程排除文件

针对单一工程排除文件,这种方式会让这个工程的所有修改者在克隆代码的同时,也能克隆到过滤规则,而不用自己再写一份,这就能保证所有修改者应用的都是同一份规则。在工程根目录下建立.gitignore文件,将要排除的文件或目录写到.gitignore这个文件中,有两种写入方法: ① 使用命令行增加排除文件 例如排除以.class结尾的文件

echo  "*.class" > .gitignore

例如排除bin目录下的所有文件

echo "bin/*" > .gitignore

注意,如果需要排除多级目录下的文件,比如bin/classes/A.class 那么.gitignore中的内容应该写全路径,即bin/classes/A.class

② 最方便的办法是,用记事本打开,增加需要排除的文件或目录,一行增加一个,如:

*.class
*.apk
bin/*
.settings/*
proguard/*

全局设置排除文件

全局设置排除文件,这会在全局起作用,只要是Git管理的工程,在提交时都会自动排除不在控制范围内的文件或目录。这种方法对开发者来说,比较省事,只要一次全局配置,不用每次建立工程都要配置一遍过滤规则。但是这不保证其他的开发者在克隆你的代码后,他们那边的规则跟你的是一样的,这就带来了代码提交过程中的各种冲突问题。配置步骤如下:

① 同样需要建立一个.gitignore文件,把要排除的文件写进去。但在这里,我们不规定一定要把.gitnore文件放到某个工程下面,而是任何地方,比如我们这里放到了Git默认的Home路径下,在我的 windows上就是C:\Users\yourusername。使用命令方式可以配置全局排除文件

git config --global core.excludesfile ~/.gitignore

你会发现在~/.gitconfig文件中会出现excludesfile = C:/Users/yourusername/.gitignore。说明Git把文件过滤规则应用到了Global的规则中。

② 单个工程设置排除文件,在工程目录下找到.git/info/exclude,把要排除的文件写进去:

*.class
*.apk
bin/
gen/

这种方法就不提倡了,只能针对单一工程配置,而且还不能将过滤规则同步到其他开发者,优势不大。

编写.gitignore规则文件的两种模式

两种模式分别是开放模式和保守模式

① 开放模式负责设置过滤哪些文件和文件夹 过滤文件夹设置: /mtk/ 表示过滤这个文件夹 过滤文件设置:

*.zip
*.rar
*.err

指定过滤某个文件: /mtk/do.doc

② 保守模式负责设置哪些文件不被过滤,也就是哪些文件要跟踪 跟踪某个文件夹: !/people/master 跟踪某类文件:

!*.c
!*.h

跟踪某个指定文件: !/people/master/IT.h 采用共享模式与保守模式结合配置的办法。eg:一个文件夹下有很多文件夹和文件,而我只想跟踪其中的一个文件,这样设置就可以满足这种情况,先用共享模式把整个目录 都设置为不跟踪,然后再用保守模式把这个文件夹中想要跟踪的文件设置为被跟踪,配置很简单,就可以跟踪想要跟踪的文件。

.gitignore文件失效问题

比如在一个本地仓库中,产生了诸多的日志记录,而这些记录都是本地操作产生的,我们不必将其提交到远程仓库中,那么我们在.gitignore中添加了logs/20150514.log的过滤规则,但是在使用git status的时候,还是可以看到modified:logs/20150514.log,说明规则没有起作用。

为什么增加了.gitignore里的规则却没有效果呢? 这是因为.gitignore文件只能作用于Untracked Files,也就是那些从来没有被Git记录过的文件(自添加以后,从未add及commit过的文件)。

之所以规则不生效,是因为那些.log文件曾经被Git记录过,因此.gitignore对它们完全无效,解决办法如下:

  • 从Git的数据库中删除对于该文件的追踪;
  • 把对应的规则写入.gitignore,让忽略真正生效;
  • 提交+推送

只有这样做,所有的团队成员才会保持一致而不会有后遗症,也只有这样做,其他的团队成员根本不需要做额外的工作来维持对一个文件的改变忽略。

最后有一点需要注意的,git rm --cached logs/20150514.log 删除的是追踪状态,而不是物理文件;如果你真的是彻底不想要了,你也可以直接 rm+忽略+提交。

参考文献 [1] http://blog.csdn.net/hustpzb/article/details/8649545 [2] http://segmentfault.com/q/1010000000430426