git 把文件从 版本管理中移除

来源:互联网 发布:台达plc编程说明书 编辑:程序博客网 时间:2024/04/28 16:00
转载
转自 http://blog.sina.com.cn/u/1509658847

刚学git时,一股脑吧所有文件全部加到版本管理中,
现在做Android开发,这样做就有很大的问题了,
gen  和bin  文件夹下的文件是编译生成的,最好不要加到版本管理中,最好加入到.gitignore文件中(这两个文件夹要留,只是把文件夹下的文件移除版本管理库)
可是,我已经加入到了版本管理中,怎么办?
一般来说,使用“git rm”命令

// 下面就以删除bin文件夹为例子,删除gen等文件,也是一样的道理,以此类推
1.刚开始 使用的是 git rm -r -n */gengen”)
参数解释:-r  递归移除目录,(Allow recursive removal when a leading directory name is given.)
   -n:加上这个参数,执行命令时,是不会删除任何文件,而是展示此命令要删除的文件列表预览,所以一般用这个参数先看看要删除哪些文件,防止误删,确认之后,就去掉此参数,真正的删除文件。  (Don't actually remove any file(s). Instead, just show if they exist 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 \*~ (会递归的删除当前目录 以及 子目录下的
以“~”结尾的文件
会递归删除当前目录及其子目录中所有 ~ 结尾的文件。


所以我最后的命令是

git rm  -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 would clean the project and/or try to run the Fix Project Properties utility (right-click on the Project -> Android Tools -> Fix Project Properties).


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