美文网首页
如何编写gitignore文件(摘抄)

如何编写gitignore文件(摘抄)

作者: shadow雨轩 | 来源:发表于2018-03-29 15:55 被阅读0次

    为什么要有.gitignore文件

    项目中经常会生成一些Git系统不需要追踪(track)的文件。典型的是在编译生成过程中 产生的文件或是编程器生成的临时备份文件。当然,你不追踪(track)这些文件,可以 平时不用"git add"去把它们加到索引中。 但是这样会很快变成一件烦人的事,你发现项目中到处有未追踪(untracked)的文件; 这样也使"git add ." 和"git commit -a" 变得实际上没有用处,同时"git status"命令的输出也会有它们。你可以在你的顶层工作目录中添加一个叫".gitignore"的文件,来告诉Git系统要忽略 掉哪些文件。

    忽略文件原则

    忽略操作系统自动生成的文件,比如缩略图等;

    忽略编译生成的中间文件、可执行文件等,也就是如果一个文件是通过另一个文件自动生成的,那自动生成的文件就没必要放进版本库,比如Java编译产生的.class文件;

    忽略你自己的带有敏感信息的配置文件,比如存放口令的配置文件。

    语法规范(熟悉正则很容易理解)

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

    以斜杠 “/” 结尾表示目录;

    以星号 “*” 通配多个字符;

    以问号 “?” 通配单个字符

    以方括号 “[]” 包含单个字符的匹配列表;

    以叹号 “!” 表示不忽略(跟踪)匹配到的文件或目录;

    可以在前面添加斜杠 “/” 来避免递归,下面的例子中可以很明白的看出来与下一条的区别。

    配置文件示例

    # 忽略 .a 文件

    *.a

    # 但否定忽略 lib.a, 尽管已经在前面忽略了 .a 文件

    !lib.a

    # 仅在当前目录下忽略 TODO 文件, 但不包括子目录下的 subdir/TODO

    /TODO

    # 忽略 build/ 文件夹下的所有文件

    build/

    # 忽略 doc/notes.txt, 不包括 doc/server/arch.txt

    doc/*.txt

    # 忽略所有的 .pdf 文件 在 doc/ directory 下的

    doc/**/*.pdf

    配置文件模板

    Github上为开发者提供了各种环境以及各种编程语言的 gitignore 文件配置模板:https://github.com/github/gitignore

    本人使用的是python项目的gitgnore文件 url:https://github.com/github/gitignore/blob/master/Python.gitignore

    .gitignore分为全局配置和局部配置,这个很容易理解全局配置是指修改当前.gitignore文件本机的git中的全部项目都起作用,局部的配置是指每个项目下的.gitignore文件只对向前所在的项目起作用。

    局部的配置只需要在项目目录中创建.gitignore文件即可。

    全局的配置设置方法为:

    $git config –global core.excludesfile ~/.gitignore

    这样,修改~/.gitignore这个文件将作用于所有 git 项目,并且作用于项目实例中的所有被跟踪的目录。

    # Windows: (使用windows用户,过滤存放图片文件夹下生成的缩略图)Thumbs.dbehthumbs.dbDesktop.ini# Python:*.py[cod]*.so*.egg*.egg-infodistbuildtarget.idea.classpath.project.settings*.iml.gitignore

    总结

    忽略某些文件时,需要编写.gitignore

    .gitignore文件本身要放到版本库里,并且可以对.gitignore做版本管理!

    从版本库中删除

    $ git rm test.txt

    rm 'test.txt'

    $ git commit -m "remove test.txt"

    有三种方法可以实现过滤掉Git里不想上传的文件,这三种方法都能达到目的,只不过适用情景不一样。

    1)第一种方法

    针对单一工程排除文件,这种方式会让这个工程的所有修改者在克隆代码的同时,也能克隆到过滤规则,而不用自己再写一份,这就能保证所有修改者应用的都是同一份规则,而不是张三自己有一套过滤规则,李四又使用另一套过滤规则,个人比较喜欢这个。配置步骤如下:

    在工程根目录下建立.gitignore文件,将要排除的文件或目录 写到.gitignore这个文件中,其中有两种写入方法。

    a)使用命令行增加排除文件 

    排除以.class结尾的文件 echo “*.class” >.gitignore (>> 是在文件尾增加,> 是删除已经存在的内容再增加),之后会在当前目录下生成一个.gitignore的文件。

    排除bin目录下的文件 echo “bin/” >.gitignore

    b)最方便的办法是,用记事本打开,增加需要排除的文件或目录,一行增加一个,例如:

    *.class

    *.apk

    bin/

    gen/

    .settings/

    proguard/

    2)第二种方法

    全局设置排除文件,这会在全局起作用,只要是Git管理的工程,在提交时都会自动排除不在控制范围内的文件或目录。这种方法对开发者来说,比较省事,只要一次全局配置,不用每次建立工程都要配置一遍过滤规则。但是这不保证其他的开发者在克隆你的代码后,他们那边的规则跟你的是一样的,这就带来了代码提交过程中的各种冲突问题。

    配置步骤如下:

    a)像方法(1)一样,也需要建立一个.gitignore文件,把要排除的文件写进去。

    b)但在这里,我们不规定一定要把.gitnore文件放到某个工程下面,而是任何地方,比如我们这里放到了Git默认的Home路径下,比如:/home/wangshibo/hqsb_ios

    c)使用命令方式可以配置全局排除文件 git config --global core.excludesfile ~/.gitignore,你会发现在~/.gitconfig文件中会出现excludesfile = /home/wangshibo/hqsb_ios/.gitignore。

    说明Git把文件过滤规则应用到了Global的规则中。

    3)第三种方法

    单个工程设置排除文件,在工程目录下找到.git/info/exclude,把要排除的文件写进去:

    *.class

    *.apk

    bin/

    gen/

    .settings/

    proguard/

    这种方法就不提倡了,只能针对单一工程配置,而且还不能将过滤规则同步到其他开发者,跟方法(1)(2)比较起来没有一点优势。

    ------------------------Git忽略规则及.gitignore规则不生效的解决办法-----------------------------

    在git中如果想忽略掉某个文件,不让这个文件提交到版本库中,可以使用修改根目录中 .gitignore 文件的方法(如无,则需自己手工建立此文件)。这个文件每一行保存了一个匹配的规则例如:

    # 此为注释 – 将被 Git 忽略

    *.a # 忽略所有 .a 结尾的文件

    !lib.a # 但 lib.a 除外

    /TODO # 仅仅忽略项目根目录下的 TODO 文件,不包括 subdir/TODO

    build/ # 忽略 build/ 目录下的所有文件

    doc/*.txt # 会忽略 doc/notes.txt 但不包括 doc/server/arch.txt

    规则很简单,不做过多解释,但是有时候在项目开发过程中,突然心血来潮想把某些目录或文件加入忽略规则,按照上述方法定义后发现并未生效,原因是.gitignore只能忽略那些原来没有被track的文件,如果某些文件已经被纳入了版本管理中,则修改.gitignore是无效的。那么解决方法就是先把本地缓存删除(改变成未track状态),然后再提交:

    git rm -r --cached .

    git add .

    git commit -m 'update .gitignore'

    注意:

    不要误解了 .gitignore 文件的用途,该文件只能作用于 Untracked Files,也就是那些从来没有被 Git 记录过的文件(自添加以后,从未 add 及 commit 过的文件)。

    如果文件曾经被 Git 记录过,那么.gitignore 就对它们完全无效。

    相关文章

      网友评论

          本文标题:如何编写gitignore文件(摘抄)

          本文链接:https://www.haomeiwen.com/subject/kinmcftx.html