Git忽略文件的几种方式以及.gitignore文件的忽略规则详解

作者:

文章目录
  • 在使用Git的过程中,我们喜欢有的文件比如日志,临时文件,编译的中间文件等不要提交到代码仓库,这时就要设置相应的忽略规则,来忽略这些文件的提交。 注意: 如果你创建.gitignore文件之前就push了某一文件,那么即使你在.gitignore文件中写入过滤该文件的规则,该规则也不会起作用,git仍然会对该文件进行版本管理。
  • 详细的忽略规则可以参考官方英文文档。 在 .gitingore 文件中,每一行指定一个忽略规则,Git 检查忽略规则的时候有多个来源,它的优先级如下(由高到低): 从命令行中读取可用的忽略规则 当前目录定义的规则 父级目录定义的规则,依次递推,目录结构较高的.gitignore文件被较近的.gitignore文件中相同的配置所覆盖 .git/info/exclude文件中定义的规则 core.excludesfile中定义的全局规则
  • 空格不匹配任意文件,可作为分隔符,方便阅读。 #用于注释,表示转义(如需使用实体,则要加引号"")。 *可以匹配任何字符(0或多个)。 ?可以匹配单个字符。(不可以匹配/) /用于分隔目录: 当/在开头时,表示从.gitignore文件所在的根目录开始匹配。 当/在末尾时,只匹配目录及该目录下面的全部内容,否则同名的目录和文件都将匹配。 !开头的模式标识否定,该文件将会再次被包含,如果排除了该文件的父级目录,则使用!也不会再次被包含。 []通常用于匹配一个字符列表,如:a[mn]z可匹配amz和anz。 **用于匹配多级目录,如a/**/b可匹配a/b,a/x/b,a/x/y/b。注意:git 对于 .gitignore配置文件是按行从上到下进行规则匹配的。
  • #: 表示此为注释,将被Git忽略。 *:表示忽略所有。 */:表示忽略所有目录。 1.txt: 忽略任意目录(当前目录即根目录及其子文件夹)下的1.txt的文件夹或同名文件,例如1.txt,/pojo/1.txt,/pojo/a/1.txt,若是文件夹则该文件夹下的所有内容都会被忽略。 *.txt: 忽略任意目录(当前目录即根目录及其子文件夹)下的所有以.txt结尾的文件夹或文件,若是文件夹则该文件夹下的所有内容都会被忽略。 /1.txt:忽略根路径下的1.txt的文件夹或同名文件,若是文件夹则该文件夹下的所有内容都会被忽略。 /*.txt: 忽略根路径下的所有以.txt结尾的文件夹或文件,若是文件夹则该文件夹下的所有内容都会被忽略,不忽略 /pojo/1.txt。 pojo:忽略任意目录(当前目录即根目录及其子文件夹)下的pojo文件夹或同名文件,若是文件夹则该文件夹下的所有内容都会被忽略。 /pojo: 忽略根目录下的pojo文件夹或同名文件,若是文件夹则该文件夹下的所有内容都会被忽略。 pojo/: 忽略目录 pojo下的全部内容;注意,不管是根目录下的/pojo/目录,还是某个目录下的 /child/pojo/,以及pojo文件夹里面的全部内容都会被忽略,同时忽略pojo文件夹,以pojo命名的文件不会忽略。 pojo/*:忽略当前路径下pojo文件夹下的全部内容,pojo文件夹不忽略。 /pojo/: 忽略根目录下的pojo文件夹,该文件夹下的所有内容都会被忽略,以pojo命名的文件不会忽略。 pojo/1.txt:忽略当前路径下的pojo下的1.txt的文件夹或同名文件,若是文件夹则该文件夹下的所有内容都会被忽略,不忽略pojo文件夹。 /pojo/1.txt:忽略根目录下的pojo文件下的1.txt的文件夹或同名文件,若是文件夹则该文件夹下的所有内容都会被忽略,不忽略pojo文件夹。 pojo/*.txt: 忽略当前路径下的pojo文件夹下所有以.txt结尾的文件夹或文件,若是文件夹则该文件夹下的所有内容都会被忽略,不忽略pojo/common/1.txt,不忽略/a/pojo/1.txt,不忽略pojo文件夹。 pojo/1.txt/*:忽略当前路径下的pojo文件夹下的1.txt文件夹中的所有文件,1.txt文件夹不忽略。 **/pojo: 忽略任意目录下的pojo文件夹或同名文件,若是文件夹则该文件夹下的所有内容都会被忽略。/pojo,/pojo/1.txt,/a/pojo,/a/pojo/1.txt,a/b/pojo等。 a/**/b: 忽略当前路径下的以a文件夹为开始,中间可以有0个或任意个目录的b文件夹或同名文件,若是文件夹则该文件夹下的所有内容都会被忽略,a/b,a/x/b,a/x/y/b,a/x/y/b/1.txt等。 /pojo/*和!/pojo/1.txt: 忽略pojo目录下的所有文件但不忽略pojo目录下的1.txt文件,pojo文件夹不忽略。注意上面的/pojo/*不能写为/pojo/,否则父目录被前面的规则排除掉了,1.txt文件虽然加了!过滤规则,也不会生效!
  • git check-ignore -v {文件或目录路径}
  • .gitignore只能忽略那些原来没有被track的文件,如果某些文件已经被纳入了版本管理中,则修改.gitignore是无效的。 解决方法就是先修改.gitignore文件,之后在执行以下内容先把本地缓存删除(改变成未track状态),然后再提交: git rm -r –cached . git add . git commit -m ‘update .gitignore’ 同样的,已被.gitignore忽略的文件是无法加入版本库的。 解决方法:要纳入版本管理,先移除规则。
  • 以上为个人经验,希望能给大家一个参考,也希望大家多多支持风君子博客。 您可能感兴趣的文章: Git中忽略文件机制的.gitignore与.git/info/exclude两种方式详解 Git忽略文件.gitignore操作方法指南 Git中使用.gitignore忽略文件的推送方式 git设置忽略文件.gitignore的方法
  • 目录
    • .gitignore文件
    • Git忽略规则以及优先级
    • .gitignore文件忽略规则
    • 常用匹配示例
    • 有三种方法可以实现忽略Git中不想提交的文件
      • 1、在Git项目中定义 .gitignore 文件(优先级最高,推荐!)
      • 2、在Git项目的设置中指定排除文件
      • 3、定义Git全局的 .gitignore 文件
    • 如何检查自己写的ignore规则是否有效?
      • gitignore规则不生效
        • 总结

          在使用Git的过程中,我们喜欢有的文件比如日志,临时文件,编译的中间文件等不要提交到代码仓库,这时就要设置相应的忽略规则,来忽略这些文件的提交。

          注意:

          如果你创建.gitignore文件之前就push了某一文件,那么即使你在.gitignore文件中写入过滤该文件的规则,该规则也不会起作用,git仍然会对该文件进行版本管理。

          详细的忽略规则可以参考官方英文文档。

          在 .gitingore 文件中,每一行指定一个忽略规则,Git 检查忽略规则的时候有多个来源,它的优先级如下(由高到低):

          1. 从命令行中读取可用的忽略规则
          2. 当前目录定义的规则
          3. 父级目录定义的规则,依次递推,目录结构较高的.gitignore文件被较近的.gitignore文件中相同的配置所覆盖
          4. .git/info/exclude文件中定义的规则
          5. core.excludesfile中定义的全局规则

          1. 空格不匹配任意文件,可作为分隔符,方便阅读。
          2. #用于注释,表示转义(如需使用实体,则要加引号"")。
          3. *可以匹配任何字符(0或多个)。
          4. ?可以匹配单个字符。(不可以匹配/)
          5. /用于分隔目录:
            • /在开头时,表示从.gitignore文件所在的根目录开始匹配。
            • /在末尾时,只匹配目录及该目录下面的全部内容,否则同名的目录和文件都将匹配。
          6. !开头的模式标识否定,该文件将会再次被包含,如果排除了该文件的父级目录,则使用!也不会再次被包含。
          7. []通常用于匹配一个字符列表,如:a[mn]z可匹配amz和anz。
          8. **用于匹配多级目录,如a/**/b可匹配a/ba/x/ba/x/y/b。注意:git 对于 .gitignore配置文件是按行从上到下进行规则匹配的。

          • #: 表示此为注释,将被Git忽略。
          • *:表示忽略所有。
          • */:表示忽略所有目录。
          • 1.txt: 忽略任意目录(当前目录即根目录及其子文件夹)下的1.txt的文件夹或同名文件,例如1.txt,/pojo/1.txt,/pojo/a/1.txt,若是文件夹则该文件夹下的所有内容都会被忽略。
          • *.txt: 忽略任意目录(当前目录即根目录及其子文件夹)下的所有以.txt结尾的文件夹或文件,若是文件夹则该文件夹下的所有内容都会被忽略。
          • /1.txt:忽略根路径下的1.txt的文件夹或同名文件,若是文件夹则该文件夹下的所有内容都会被忽略。
          • /*.txt: 忽略根路径下的所有以.txt结尾的文件夹或文件,若是文件夹则该文件夹下的所有内容都会被忽略,不忽略 /pojo/1.txt。
          • pojo:忽略任意目录(当前目录即根目录及其子文件夹)下的pojo文件夹或同名文件,若是文件夹则该文件夹下的所有内容都会被忽略。
          • /pojo: 忽略根目录下的pojo文件夹或同名文件,若是文件夹则该文件夹下的所有内容都会被忽略。
          • pojo/: 忽略目录 pojo下的全部内容;注意,不管是根目录下的/pojo/目录,还是某个目录下的 /child/pojo/,以及pojo文件夹里面的全部内容都会被忽略,同时忽略pojo文件夹,以pojo命名的文件不会忽略。
          • pojo/*:忽略当前路径下pojo文件夹下的全部内容,pojo文件夹不忽略。
          • /pojo/: 忽略根目录下的pojo文件夹,该文件夹下的所有内容都会被忽略,以pojo命名的文件不会忽略。
          • pojo/1.txt:忽略当前路径下的pojo下的1.txt的文件夹或同名文件,若是文件夹则该文件夹下的所有内容都会被忽略,不忽略pojo文件夹。
          • /pojo/1.txt:忽略根目录下的pojo文件下的1.txt的文件夹或同名文件,若是文件夹则该文件夹下的所有内容都会被忽略,不忽略pojo文件夹。
          • pojo/*.txt: 忽略当前路径下的pojo文件夹下所有以.txt结尾的文件夹或文件,若是文件夹则该文件夹下的所有内容都会被忽略,不忽略pojo/common/1.txt,不忽略/a/pojo/1.txt,不忽略pojo文件夹。
          • pojo/1.txt/*:忽略当前路径下的pojo文件夹下的1.txt文件夹中的所有文件,1.txt文件夹不忽略。
          • **/pojo: 忽略任意目录下的pojo文件夹或同名文件,若是文件夹则该文件夹下的所有内容都会被忽略。/pojo/pojo/1.txt/a/pojo/a/pojo/1.txta/b/pojo等。
          • a/**/b: 忽略当前路径下的以a文件夹为开始,中间可以有0个或任意个目录的b文件夹或同名文件,若是文件夹则该文件夹下的所有内容都会被忽略,a/ba/x/ba/x/y/ba/x/y/b/1.txt等。
          • /pojo/*!/pojo/1.txt: 忽略pojo目录下的所有文件但不忽略pojo目录下的1.txt文件,pojo文件夹不忽略。注意上面的/pojo/*不能写为/pojo/,否则父目录被前面的规则排除掉了,1.txt文件虽然加了!过滤规则,也不会生效!

          这种方式通过在项目的某个文件夹下定义 .gitignore 文件,在该文件中定义相应的忽略规则,来管理当前文件夹及其子文件夹下的文件的Git提交行为。

          .gitignore 文件是可以提交到公有仓库中,这就为该项目下的所有开发者都共享一套定义好的忽略规则。

          在 .gitingore 文件中,遵循相应的语法,在每一行指定一个忽略规则。如:

          样例一:

          HELP.md
          target/
          !.mvn/wrapper/maven-wrapper.jar
          !**/src/main/**/target/
          !**/src/test/**/target/
          
          ### STS ###
          .apt_generated
          .classpath
          .factorypath
          .project
          .settings
          .springBeans
          .sts4-cache
          
          ### IntelliJ IDEA ###
          .idea
          *.iws
          *.iml
          *.ipr
          mvnw
          mvnw.cmd
          .mvn
          
          
          ### NetBeans ###
          /nbproject/private/
          /nbbuild/
          /dist/
          /nbdist/
          /.nb-gradle/
          build/
          logs/
          !**/src/main/**/build/
          !**/src/test/**/build/
          
          ### VS Code ###
          .vscode/
          

          样例二:

          ######################
          # Project Specific
          ######################
          /target/www/**
          /src/test/javascript/coverage/
          /src/test/javascript/PhantomJS*/
          
          ######################
          # Node
          ######################
          /node/
          node_tmp/
          node_modules/
          npm-debug.log.*
          
          ######################
          # SASS
          ######################
          .sass-cache/
          
          ######################
          # Eclipse
          ######################
          *.pydevproject
          .project
          .metadata
          tmp/
          tmp/**/*
          *.tmp
          *.bak
          *.swp
          *~.nib
          local.properties
          .classpath
          .settings/
          .loadpath
          .factorypath
          /src/main/resources/rebel.xml
          
          # External tool builders
          .externalToolBuilders/**
          
          # Locally stored "Eclipse launch configurations"
          *.launch
          
          # CDT-specific
          .cproject
          
          # PDT-specific
          .buildpath
          
          ######################
          # Intellij
          ######################
          HELP.md
          .idea
          *.iws
          *.iml
          *.ipr
          mvnw
          mvnw.cmd
          .mvn
          *.ids
          *.orig
          classes/
          
          ######################
          # Visual Studio Code
          ######################
          .vscode/
          
          ######################
          # Maven
          ######################
          /log/
          target/
          
          ######################
          # Gradle
          ######################
          .gradle/
          /build/
          
          ######################
          # Package Files
          ######################
          *.jar
          *.war
          *.ear
          *.db
          
          ######################
          # Windows
          ######################
          # Windows image file caches
          Thumbs.db
          
          # Folder config file
          Desktop.ini
          
          ######################
          # Mac OSX
          ######################
          .DS_Store
          .svn
          
          # Thumbnails
          ._*
          
          # Files that might appear on external disk
          .Spotlight-V100
          .Trashes
          
          ######################
          # Logs
          ######################
          *.log
          
          ######################
          # Others
          ######################
          *.class
          *.*~
          *~
          .merge_file*
          
          ######################
          # Gradle Wrapper
          ######################
          !gradle/wrapper/gradle-wrapper.jar
          
          ######################
          # Maven Wrapper
          ######################
          !.mvn/wrapper/maven-wrapper.jar
          
          ######################
          # ESLint
          ######################
          .eslintcache
          /.apt_generated/
          
          server/package-lock.json
          server/mochawesome-report/
          
          

          这种方式只是临时指定该项目的行为,需要编辑当前项目下的 .git/info/exclude 文件,然后将需要忽略提交的文件写入其中。

          需要注意的是,这种方式指定的忽略文件的根目录是项目根目录。

          (个人使用方便,但是团队的话不适用,因为是在自己电脑设置的全局)

          除了可以在项目中定义 .gitignore 文件外,还可以设置全局的 git .ignore 文件来管理所有Git项目的行为。这种方式在不同的项目开发者之间是不共享的,是属于项目之上Git应用级别的行为。

          1) 创建忽略规则文件 xxxx.ignore(前缀名随便起,建议是 git.ignore).

          这个文件的存放位置原则上在哪里都可以,为了便于让~/.gitconfig 文件引用,建议也放在用户家目录下

          git.ignore 文件模版内容如下:

          # 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*
          .classpath
          .project
          .settings
          target
          .idea
          *.iml
          

          2) 在.gitconfig 文件中引用忽略配置文件(此文件在 Windows 的家目录中)我的是在C:UsersPC.gitconfig

          [user]
          	email = xuxin@wondertek.com.cn
          	name = xuxin666
          [credential "https://gitee.com"]
          	provider = generic
          [core]
          	excludesfile = C:/Users/PC/git.ignore
          

          注意:这里要使用“正斜线(/)”,不要使用“反斜线()”

          git check-ignore -v {文件或目录路径}
          

          .gitignore只能忽略那些原来没有被track的文件,如果某些文件已经被纳入了版本管理中,则修改.gitignore是无效的。

          解决方法就是先修改.gitignore文件,之后在执行以下内容先把本地缓存删除(改变成未track状态),然后再提交:

          git rm -r --cached . 
          
          git add .
          
          git commit -m 'update .gitignore'
          

          同样的,已被.gitignore忽略的文件是无法加入版本库的。

          解决方法:要纳入版本管理,先移除规则。

          以上为个人经验,希望能给大家一个参考,也希望大家多多支持风君子博客。

          您可能感兴趣的文章:

          • Git中忽略文件机制的.gitignore与.git/info/exclude两种方式详解
          • Git忽略文件.gitignore操作方法指南
          • Git中使用.gitignore忽略文件的推送方式
          • git设置忽略文件.gitignore的方法

          站内搜索