关闭

解决 .gitignore无效,不能过滤某些文件

1015人阅读 评论(0) 收藏 举报
分类:


刚开始新建一个项目可能会把.idea/workspace.xml等这种系统文件或编译中间过程的文件都用git add添加到了git版本库中来管理,这样即使后来添加了.gitignore文件也不能忽略掉已经添加到版本库中的文件,这时需要用 git rm --cache xxx文件 再在.gitignore中添加该文件从而实现了对该文件的忽略。。。(.gitignore 与 .git添加到同一级目录即可)


gen  和bin 文件夹下的文件是编译生成的,最好不要加到版本管理中,最好加入到.gitignore文件中(这两个文件夹要留,只是把文件夹下的文件移除版本管理库)

可是,我已经加入到了版本管理中,怎么办?
一般来说,使用“git rm”命令

// 下面就以删除bin文件夹为例子,删除gen等文件,也是一样的道理,以此类推
1.刚开始 使用的是 git rm -r -n */gengen”)
参数解释:-r  递归移除目录,(Allow recursive removal when aleading directory name is given.)
  -n:加上这个参数,执行命令时,是不会删除任何文件,而是展示此命令要删除的文件列表预览,所以一般用这个参数先看看要删除哪些文件,防止误删,确认之后,就去掉此参数,真正的删除文件。 (Don't actually remove any file(s). Instead, just show if theyexist in the index and would otherwise be
          removed by the command.)

但是上面的命令真正会删除文件,我觉得,我需要的只是从版本管理库中删除,不再跟踪此文件,而硬盘上的这个文件还是要的,所以,上面的命令还要增加参数来实现此目的。

引用:

\******************开始***************\

 我们想把文件从 Git仓库中删除(亦即从暂存区域移除),但仍然希 望保留在当前工作目录中。换句话说,仅是从跟踪清单中删除。比如一些大型日志文件或者 一堆.a 编译文件,不小心纳入仓库后,要移除跟踪但不删除文件,以便稍后在 .gitignore 文件中补上,用 --cached选项即可:

\******************结束***************\
 
2.按照上面的引用,我修改的命令如下:
 git rm  -r -n--cached   */bin
 git rm *~ (只删除当前目录下以“
~”结尾的文件)
注意到星号 * 之前的反斜杠 \,因为 Git 有它自己的文件模式扩展匹配方式,所以我们 不用shell 来帮忙展开(译注:实际上不加反斜杠也可以运行,只不过按照 shell 扩展的话,仅仅删除指定目录下的文件而不会递归匹配。上面的例子本来就指定了目录,所以效果等同,但下面的例子就会用递归方式匹配,所以必须加反斜杠。)。此命令删除所有 log/ 目录下扩展名为 .log的文件。类似的比如:
 git rm \*~ (会递归的删除当前目录 以及 子目录下的
以“~”结尾的文件
会递归删除当前目录及其子目录中所有 ~ 结尾的文件。


所以我最后的命令是

gitrm  -r -n--cached  */bin/\* (注意:此命令会真正删除文件,你可以加上"-n"参数 查看文件列表)

3.删除gen文件夹 只要把上面的“bin”改为“gen”即可
4.把这俩文件夹移除版本管理,但是
有问题了,就是
在你执行 “git status”查看当前状态,会发现 gen和bin文件夹下的文件会出现,提示没有在版本管理里面
这就很烦人,我们既想把gen和bin移除版本管理库,
但是这样的提示,会耽误我们的“git add”命令,也会干扰我们使用“git status”的
结果列表
我们想忽略这俩文件夹,

我参考了下面的连接
http://stackoverflow.com/questions/3325736/eclipse-android-and-gitignore

我们可以在与 “.git”文件夹同级目录下建立“.gitignore”文件,就是这俩文件在同一个目录下
“.gitignore”文件里面的内容就是 我们要忽略的文件,这些文件即使不在版本管理库,也不会提示的
文件内容如下:

# built application files
*.apk
*.ap_

# files for the dex VM
*.dex

# Java class files
*.class

# generated files
bin/
gen/

# Local configuration file (sdk path, etc)
local.properties

# Eclipse project files
#.classpath
#.project

# Proguard folder generated by Eclipse
proguard/

# Intellij project files
*.iml
*.ipr
*.iws
.idea/


上面这些文件就被忽略。
原文是删除了“.classpath”和“.project”,我不建议这样做,这两个文件还是留在版本管理库,否则,你把项目导出到别的地方,再导入时就会有问题。

记得

参考如下:

\******************开始***************\
 
一般我们总会有些文件无需纳入 Git 的管理,也不希望它们总出现在未跟踪文件列表。通常都是些自动生成的文件,像是日志或者编译过程中创建的等等。我们可以创建一个名为 .gitignore的文件,列出要忽略的文件模式,来看一个简单的例子:

$ cat .gitignore *.[oa]
*~

第一行告诉 Git 忽略所有以 .o 或 .a 结尾的文件。一般这类对象文件和存档文件都是编译过程中出现的,我们用不着跟踪它们的版本。第二行告诉 Git 忽略所有以波浪符(~) 结尾的文件,许多文本编辑软件(比如Emacs)都用这样的文件名保存副本。此外,你可能 还需要忽略 log,tmp 或者 pid目录,以及自动生成的文档等等。要养成一开始就设置好 .gitignore 文件的习惯,以免将来误提交这类无用的文件。
文件 .gitignore 的格式规范如下:
• 所有空行或者以注释符号 # 开头的行都会被 Git 忽略。
• 可以使用标准的 glob 模式匹配。
• 匹配模式最后跟反斜杠(/)说明要忽略的是目录。
• 要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号(!)取反。
所谓的 glob 模式是指 shell 所使用的简化了的正则表达式。星号(*)匹配零个或多个任 意字符;[abc]匹配任何一个列在方括号中的字符(这个例子要么匹配一个 a,要么匹配一 个 b,要么匹配一个c);问号(?)只匹配一个任意字符;如果在方括号中使用短划线分 隔两个字符,表示所有在这两个字符范围内的都可以匹配(比如 [0-9]表示匹配所有 0 到 9 的数字)。
我们再看一个 .gitignore 文件的例子:

# 此为注释 – 将被 Git 忽略
*.a # 忽略所有 .a 结尾的文件
!lib.a # 但 lib.a 除外
/TODO # 仅仅忽略项目根目录下的 TODO 文件,不包括 subdir/TODO build/ # 忽略 build/目录下的所有文件
doc

\******************结束***************\

如果做完上面的设置后,出现编译错误,课按照下面的方法解决

With regards to the error, I wouldclean the project and/or try to run the Fix ProjectProperties utility (right-click on the Project-> Android Tools -> Fix ProjectProperties).


这里推荐一个学习git 的入门帖子:写的还不错
http://www.nshen.net/sitelog/2011/08/03/git-note.html
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:137676次
    • 积分:2254
    • 等级:
    • 排名:第16704名
    • 原创:82篇
    • 转载:44篇
    • 译文:0篇
    • 评论:29条
    最新评论