zoukankan      html  css  js  c++  java
  • .gitignore 语法 & 注意事项: abc,abc/,/abc, /abc/ , abc/* 和 /abc/* 的区别, 你分得清吗

    .gitignore  语法

     .gitignore 很好用, 但是 如果不搞懂其语法, 也会是引起一些误会

    比如 file/ , 它是忽略所有 名为 file 的目录,不管它处于什么层级!这样就可能不是我们想要的。如果仅仅想忽略根目录下的 file 目录,那么应该是这样写:

    /file/

    1、abc,abc/,/abc, /abc/ ,  abc/* 和 /abc/*  的区别

    那么, abc,abc/,/abc, /abc/ ,  abc/* 和 /abc/*  的区别, 你分得清吗?

     abc 是指匹配名为 abc 的文件或目录, 从根目录开始递归! 就是说会对所有文件进行比对 (和过滤)。

    abc/ 同上, 但是仅仅对目录进行比对!

    /abc 同abc, 是指匹配名为 abc 的文件或目录, 从根目录开始, 不递归! 就是说会仅仅对根目录下文件进行比对。

    abc/* 同abc/ , 是对 abc 目录下的文件进行比对! 但是不ignore abc 目录本身。

    /abc/* 同上,但仅仅对根目录下的abc 目录下的文件进行比对!

    2、* 和 **  的区别

    * 是单个目录或一串字符串,

    ** 是多个目录

    /*/abc
    */abc
    /**/abc
    **/abc
    **/abc

    附:

    #注释           .gitignore的注释
    *.txt           忽略所有 .txt 后缀的文件
    !src.a          忽略除 src.a 外的其他文件
    /todo           仅忽略项目根目录下的 todo 文件,不包括 src/todo
    build/          忽略 build/目录下的所有文件,过滤整个build文件夹;
    doc/*.txt       忽略doc目录下所有 .txt 后缀的文件,但不包括doc子目录的 .txt 的文件
     
    bin/:           忽略当前路径下的 bin 文件夹,该文件夹下的所有内容都会被忽略,不忽略 bin 文件
    /bin:           忽略根目录下的 bin 文件
    /*.c:           忽略 cat.c,不忽略 build/cat.c
    debug/*.obj:    忽略debug/io.obj,不忽略 debug/common/io.obj和tools/debug/io.obj
    **/foo:         忽略/foo, a/foo, a/b/foo等
    a/**/b:         忽略a/b, a/x/b, a/x/y/b等
    !/bin/run.sh    不忽略bin目录下的run.sh文件
    *.log:          忽略所有 .log 文件
    config.js:      忽略当前路径的 config.js 文件
     
    /mtk/           忽略整个文件夹
    *.zip           忽略所有.zip文件
    /mtk/do.c       忽略某个具体文件

    3、语法解释

    在 .gitignore 文件中,每一行的忽略规则的语法如下:

    1)空格不匹配任意文件,可作为分隔符,可用反斜杠转义;

    2)以“#”开头的行都会被 Git 忽略。即#开头的文件标识注释,可以使用反斜杠进行转义;

    3)可以使用标准的glob模式匹配。所谓的glob模式是指shell所使用的简化了的正则表达式;

    4)以斜杠 "/" 开头表示目录;"/" 结束的模式只匹配该文件夹以及在该文件夹路径下的内容,但是不匹配该文件;"/"开始的模式匹配项目跟目录;如果一个模式不包含斜杠,则它匹配相对于当前 .gitignore 文件路径的内容,如果该模式不在 .gitignore 文件中,则相对于项目根目录;

    5)以星号 "*" 通配多个字符,即匹配多个任意字符;使用两个星号 "**" 表示匹配任意中间目录,比如`a/**/z`可以匹配 a/z, a/b/z 或 a/b/c/z等;

    6)以问号"?"通配单个字符,即匹配一个任意字符;

    7)以方括号“ [] ”包含单个字符的匹配列表,即匹配任何一个列在方括号中的字符。比如[abc]表示要么匹配一个a,要么匹配一个b,要么匹配一个c;如果在方括号中使用短划线分隔两个字符,表示所有在这两个字符范围内的都可以匹配。比如[0-9]表示匹配所有0到9的数字,[a-z]表示匹配任意的小写字母);

    8)以叹号"!"表示不忽略(跟踪)匹配到的文件或目录,即要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号(!)取反;

    --- 特别注意的是 / 的运用!

    语法规范

    • 空行或是以#开头的行即注释行将被忽略。

    • 可以在前面添加正斜杠/来避免递归,下面的例子中可以很明白的看出来与下一条的区别。
    • 可以在后面添加正斜杠/来忽略文件夹,例如build/即忽略build文件夹。
    • 可以使用!来否定忽略,即比如在前面用了*.apk,然后使用!a.apk,则这个a.apk不会被忽略。
    • *用来匹配零个或多个字符,如*.[oa]忽略所有以".o"或".a"结尾,*~忽略所有以~结尾的文件(这种文件通常被许多编辑器标记为临时文件);[]用来匹配括号内的任一字符,如[abc],也可以在括号内加连接符,如[0-9]匹配0至9的数;?用来匹配单个字符。

    .gitignore  不生效的问题

    有时候呢, 我修改了.gitignore, 增加了一些gitignore 规则,发现并没有其作用。难道有时延吗? 是缓存原因吗? 难道需要把这个 .gitignore 先提交、push ?然并卵! 即使 重启idea、电脑 之后,发现还是一样的!

    难道 我对.gitignore  语法 还有理解不到位的?

    后面发现, 是因为文件之前就已经添加了,所以, .gitignore 也不会再限制它了。 就是说如果 已经存在于 git 缓冲区的文件等内容,那么 .gitignore  是不会处理的。

     —— 这些绿色的部分, 本来是不应该出现的, 是应该忽略的,是不应该被vcs 管理的。 但是现在问题是怎么把它们去除?

    原来 idea 是有一个功能是 自动的添加git 项目目录下的文件(当然, 这个设定可以修改), ——  不过, 我好像并没有添加那些文件。

    颜色很重要

    另外,颜色很重要。需要比较好的眼力:

     正常颜色的是 push 过的。

    绿色的是 add 过的

    红色的是 没有添加vcs的,即unversioned

    黄色的是被.gitignore 忽略的。 如果把 .iml 从 .gitignore去掉,那么 上图的两个iml 文件 都变成了 红色!

    有时候呢, 你 checkout 到另外一个分支,然后切换回来就没有了问题。( 我怀疑是不是idea 的bug ) 。 观察颜色发现, 我之前没有add 的文件, 它也添加了。

    因为发生了冲突,我选择了  smart checkout。 特别需要注意的是 smart checkout

    即使文件没有add。 从shelf  缓存架看到 之前add 的部分被delete 了! 

     

    参考

    https://cloud.tencent.com/developer/article/1693065#:~:text=%E5%9C%A8%20.gitignore%20%E6%96%87%E4%BB%B6%E4%B8%AD%EF%BC%8C%E6%AF%8F%E4%B8%80%E8%A1%8C%E7%9A%84%E5%BF%BD%E7%95%A5%E8%A7%84%E5%88%99%E7%9A%84%E8%AF%AD%E6%B3%95%E5%A6%82%E4%B8%8B%EF%BC%9A%201%EF%BC%89%E7%A9%BA%E6%A0%BC%E4%B8%8D%E5%8C%B9%E9%85%8D%E4%BB%BB%E6%84%8F%E6%96%87%E4%BB%B6%EF%BC%8C%E5%8F%AF%E4%BD%9C%E4%B8%BA%E5%88%86%E9%9A%94%E7%AC%A6%EF%BC%8C%E5%8F%AF%E7%94%A8%E5%8F%8D%E6%96%9C%E6%9D%A0%E8%BD%AC%E4%B9%89%EF%BC%9B%202%EF%BC%89%E4%BB%A5%E2%80%9C%EF%BC%83%E2%80%9D%E5%BC%80%E5%A4%B4%E7%9A%84%E8%A1%8C%E9%83%BD%E4%BC%9A%E8%A2%AB,Git%20%E5%BF%BD%E7%95%A5%E3%80%82%20%E5%8D%B3%23%E5%BC%80%E5%A4%B4%E7%9A%84%E6%96%87%E4%BB%B6%E6%A0%87%E8%AF%86%E6%B3%A8%E9%87%8A%EF%BC%8C%E5%8F%AF%E4%BB%A5%E4%BD%BF%E7%94%A8%E5%8F%8D%E6%96%9C%E6%9D%A0%E8%BF%9B%E8%A1%8C%E8%BD%AC%E4%B9%89%EF%BC%9B%203%EF%BC%89%E5%8F%AF%E4%BB%A5%E4%BD%BF%E7%94%A8%E6%A0%87%E5%87%86%E7%9A%84glob%E6%A8%A1%E5%BC%8F%E5%8C%B9%E9%85%8D%E3%80%82%20%E6%89%80%E8%B0%93%E7%9A%84glob%E6%A8%A1%E5%BC%8F%E6%98%AF%E6%8C%87shell%E6%89%80%E4%BD%BF%E7%94%A8%E7%9A%84%E7%AE%80%E5%8C%96%E4%BA%86%E7%9A%84%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%EF%BC%9B


    版权声明
    本文原创发表于 博客园,作者为 阿K .     本文欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则视为侵权。
    欢迎关注本人微信公众号:觉醒的码农,或者扫码进群:

  • 相关阅读:
    MySQL递归查询树状表的子节点、父节点
    ajax传递参数给springmvc总结[转]
    转:Java中String与byte[]的转换
    easymock的用法
    java的反射
    spring的依赖注入
    等页面加载完
    ajax请求
    对象的复制
    springJDBC
  • 原文地址:https://www.cnblogs.com/FlyAway2013/p/15426421.html
Copyright © 2011-2022 走看看