前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Git忽略提交规则 .gitignore文件(下)

Git忽略提交规则 .gitignore文件(下)

原创
作者头像
陈不成i
修改2021-06-07 17:44:19
1.9K0
修改2021-06-07 17:44:19
举报
文章被收录于专栏:ops技术分享

.gitignore忽略规则常用示例

1)示例

比如你的项目是java项目,.java文件编译后会生成.class文件,这些文件多数情况下是不想被传到仓库中的文件。这时候你可以直接适用github的.gitignore文件模板。https://github.com/github/gitignore/blob/master/Java.gitignore 将这些忽略文件信息复制到你的.gitignore文件中去:

  1. # Compiled class file
  2. \*.class
  3. # Log file
  4. \*.log
  5. # BlueJ files
  6. \*.ctxt
  7. # Mobile Tools for Java (J2ME)
  8. .mtj.tmp/
  9. # Package Files #
  10. \*.jar
  11. \*.war
  12. \*.nar
  13. \*.ear
  14. \*.zip
  15. \*.tar.gz
  16. \*.rar
  17. # virtual machine crash logs, see http://www.java.com/en/download/help/error\_hotspot.xml
  18. hs\_err\_pid\*

可以看到github为我们提供了最流行的.gitignore文件配置。保存.ignore文件后我们查看下git status,检查下是否还有我们不需要的文件会被添加到git中去:

  1. $ git status
  2. On branch master
  3. Initial commit
  4. Changes to be committed:
  5. (use "git rm --cached <file>..." to unstage)
  6. new file: .gitignore
  7. new file: HelloWorld.java
  8. Untracked files:
  9. (use "git add <file>..." to include in what will be committed)
  10. Config.ini

比如我的项目目录下有一个Config.ini文件,这个是个本地配置文件我不希望上传到git中去,我们可以在gitignore文件中添加这样的配置:

  1. Config.ini

或者你想忽略所有的.ini文件你可以这样写:

  1. \*.ini

如果有些文件已经被你忽略了,当你使用git add时是无法添加的,比如我忽略了*.class,现在我想把HelloWorld.class添加到git中去:

  1. $ git add HelloWorld.class
  2. The following paths are ignored by one of your .gitignore files:
  3. HelloWorld.class
  4. Use -f if you really want to add them.

git会提示我们这个文件已经被我们忽略了,需要加上-f参数才能强制添加到git中去:

  1. $ git status
  2. On branch master
  3. Initial commit
  4. Changes to be committed:
  5. (use "git rm --cached <file>..." to unstage)
  6. new file: .gitignore
  7. new file: HelloWorld.class
  8. new file: HelloWorld.java

这样就能强制添加到缓存中去了。如果我们意外的将想要忽略的文件添加到缓存中去了,我们可以使用rm命令将其从中移除:

  1. $ git rm HelloWorld.class --cached
  2. rm 'HelloWorld.class'

简单来说,要实现过滤掉Git里不想上传的文件,如上介绍三种方法能达到这种目的,只不过适用情景不一样:

  1. \============第一种方法===========
  2. 针对单一工程排除文件,这种方式会让这个工程的所有修改者在克隆代码的同时,也能克隆到过滤规则,而不用自己再写一份,
  3. 这就能保证所有修改者应用的都是同一份规则,而不是张三自己有一套过滤规则,李四又使用另一套过滤规则,个人比较喜欢这个。
  4. 配置步骤如下:
  5. 在工程根目录下建立.gitignore文件,将要排除的文件或目录 写到.gitignore这个文件中,其中有两种写入方法:
  6. a)使用命令行增加排除文件
  7. 排除以.class结尾的文件 echo "\*.class" >.gitignore (>> 是在文件尾增加,> 是删除已经存在的内容再增加),之后会在当前目录下
  8. 生成一个.gitignore的文件。排除bin目录下的文件 echo "bin/" >.gitignore
  9. b)最方便的办法是,用记事本打开,增加需要排除的文件或目录,一行增加一个,例如:
  10. \*.class
  11. \*.apk
  12. bin/
  13. gen/
  14. .settings/
  15. proguard/
  16. ===========第二种方法===========
  17. 全局设置排除文件,这会在全局起作用,只要是Git管理的工程,在提交时都会自动排除不在控制范围内的文件或目录。这种方法对开发者来说,
  18. 比较省事,只要一次全局配置,不用每次建立工程都要配置一遍过滤规则。但是这不保证其他的开发者在克隆你的代码后,他们那边的规则跟你
  19. 的是一样的,这就带来了代码提交过程中的各种冲突问题。
  20. 配置步骤如下:
  21. a)像方法(1)一样,也需要建立一个.gitignore文件,把要排除的文件写进去。
  22. b)但在这里,我们不规定一定要把.gitnore文件放到某个工程下面,而是任何地方,比如我们这里放到了Git默认的Home路径下,比如:/home/wangshibo/hqsb\_ios
  23. c)使用命令方式可以配置全局排除文件:
  24. # git config --global core.excludesfile ~/.gitignore
  25. 你会发现在~/.gitconfig文件中会出现excludesfile = /home/wangshibo/hqsb\_ios/.gitignore。
  26. 说明Git把文件过滤规则应用到了Global的规则中。
  27. ===========第三种方法===========
  28. 单个工程设置排除文件,在工程目录下找到.git/info/exclude,把要排除的文件写进去:
  29. \*.class
  30. \*.apk
  31. bin/
  32. gen/
  33. .settings/
  34. proguard/
  35. 这种方法就不提倡了,只能针对单一工程配置,而且还不能将过滤规则同步到其他开发者,跟方法一和方法二比较起来没有一点优势。

Git忽略规则(.gitignore配置)不生效原因和解决

  1. 第一种方法:
  2. .gitignore中已经标明忽略的文件目录下的文件,git push的时候还会出现在push的目录中,或者用git status查看状态,想要忽略的文件还是显示被追踪状态。
  3. 原因是因为在git忽略目录中,新建的文件在git中会有缓存,如果某些文件已经被纳入了版本管理中,就算是在.gitignore中已经声明了忽略路径也是不起作用的,
  4. 这时候我们就应该先把本地缓存删除,然后再进行git的提交,这样就不会出现忽略的文件了。
  5. 解决方法: git清除本地缓存(改变成未track状态),然后再提交:
  6. \[root@kevin ~\]# git rm -r --cached .
  7. \[root@kevin ~\]# git add .
  8. \[root@kevin ~\]# git commit -m 'update .gitignore'
  9. \[root@kevin ~\]# git push -u origin master
  10. 需要特别注意的是:
  11. 1).gitignore只能忽略那些原来没有被track的文件,如果某些文件已经被纳入了版本管理中,则修改.gitignore是无效的。
  12. 2)想要.gitignore起作用,必须要在这些文件不在暂存区中才可以,.gitignore文件只是忽略没有被staged(cached)文件,
  13. 对于已经被staged文件,加入ignore文件时一定要先从staged移除,才可以忽略。
  14. 第二种方法:(推荐)
  15. 在每个clone下来的仓库中手动设置不要检查特定文件的更改情况。
  16. \[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种状态

  1. Untracked:
  2. 未跟踪, 此文件在文件夹中, 但并没有加入到git库, 不参与版本控制. 通过git add 状态变为Staged.
  3. Unmodify:
  4. 文件已经入库, 未修改, 即版本库中的文件快照内容与文件夹中完全一致. 这种类型的文件有两种去处, 如果它被修改,
  5. 而变为Modified. 如果使用git rm移出版本库, 则成为Untracked文件
  6. Modified:
  7. 文件已修改, 仅仅是修改, 并没有进行其他的操作. 这个文件也有两个去处, 通过git add可进入暂存staged状态,
  8. 使用git checkout 则丢弃修改过, 返回到unmodify状态, 这个git checkout即从库中取出文件, 覆盖当前修改
  9. Staged:
  10. 暂存状态. 执行git commit则将修改同步到库中, 这时库中的文件和本地文件又变为一致, 文件为Unmodify状态.
  11. 执行git reset HEAD filename取消暂存, 文件状态为Modified
  12. Git 状态 untracked 和 not staged的区别
  13. 1)untrack 表示是新文件,没有被add过,是为跟踪的意思。
  14. 2)not staged 表示add过的文件,即跟踪文件,再次修改没有add,就是没有暂存的意思

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档