在使用git进行版本管理时,有一些不需要提交到版本库里的文件和文件夹,或者在管理一个实际应用的开源项目的时候,不可以把带有数据库信息的文件上传到开源平台当中,此时就需要让git自动忽略掉一下文件。文件忽略有几种方式:

  1. 没有被track的文件

    我们需要在项目的根目录当中创建.gitignore文件。 .gitignore 的格式规范如下:

    • 所有空行或者以注释符号 # 开头的行都会被 Git 忽略;
    • 匹配模式最后跟反斜杠(/)说明要忽略的是目录;
    • 要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号(!)取反;
    • 可以使用标准的 glob 模式匹配; 

    所谓的 glob 模式是指 shell 所使用的简化了的正则表达式:

    *星   匹配零个或多个任意字符;
    ?    只匹配一个任意字符;
    [abc] 匹配任何一个列在方括号中的字符(这个例子要么匹配一个 a,要么匹配一个 b,要么匹配一个 c);
    [0-9] 表示匹配所有 0 到 9 的数字;
    *?    代表任意的一个字符
    **    代表任意数目的字符
    *{!ab}    必须不是此类型
    *{ab,bb,cx}    代表ab,bb,cx中任一类型即可
    *[ ^abc]    代表必须不是a,b,c中任一字符

    由于git不会加入空目录,所以下面做法会导致tmp不会存在

    tmp/*             //忽略tmp文件夹所有文件

    改下方法,在tmp下也加一个.gitignore,内容为

    *
    !.gitignore

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

  2. 另外 git 还提供了另一种 exclude 的方式来做同样的事情。不同的是 .gitignore 这个文件本身会提交到版本库中去,用来保存的是公共的需要排除的文件。而 .git/info/exclude 这里设置的则是你自己本地需要排除的文件,不会提交到版本库,只对本地副本有效, 他不会影响到其他人。

    exclude 文件所在位置.git/info/exclude , 每个项目下都有自己的exclude

    vim .git/info/exclude

    全局ignore方法,唯一,本地所有git repo有效。~/.gitconfig/core.excludesfile
    1.账户文件夹下新建一个.gitignore_global文件
    2.直接修改.gitconfig的内容:

    [core]
    excludesfile = c:/Users/你的账户文件夹/.gitignore_global

    或者,在Git的命令行里输入:

    $ git config --global core.excludesfile ~/.gitignore_global

    注意:exclude 忽略的也是未tract的文件

  3. 文件已被track,即远程仓库中已经包含或者已经commit/add了,这时再在.gitignore中添加规则忽略已经无法生效了,正确的做法是:

    首先,删除暂存区或分支上的文件,`$ git rm --cached config.xml`
    
    然后,更新.gitignore文件忽略掉config.xml
    
    最后,`$ git commit -m ""`

      按照上面的方法,当你push之后,服务器的config.xml文件将被删除。本地存在可使用, 只是文件不被版本控制(如果没有更新 .gitignore, 会提示有untrack文件)。有一点需要注意的,git rm --cached 不会删除本地的物理文件;如果你真的是彻底不想要了,你也可以直接 rm+忽略+提交,即不要 --cached 参数。

  4. 只是想在本地忽略某文件的修改,但是服务器保存一份副本。 正确的做法是在每个clone下来的仓库中手动设置不要检查特定文件的更改情况。

    对于所有协同开发人员以及任何新加入的开发人员执行:

    $ git update-index --assume-unchanged FILE        在FILE处输入要忽略的文件. 假设未更改

    查看忽略的文件列表

    $ git ls-files -v|grep h\ //  \后面有空格

    如果要还原的话,使用命令:

    $ git update-index --no-assume-unchanged FILE

        这样就可以在本地版本库中忽略FILE文件的修改。但是,切记一点,这样做必须保证协同开发的所有人都执行此命令,但凡有一个人不执行,则FILE文件的更改等到commit和push的时候便会更新到服务器而导致不愿发生的情形出现。 亲手实验结果:如果本地执行假设未更改的命令,其他人修改了文件并推送后,本地git pull提示:error: Your local changes to the following files would be overwritten by merge: FILE。git status,nothing to commit, working tree clean。如果没有更改,可以正常git pull合并,但会失去忽略状态。

  5. .gitignore 还有个有意思的小功能

        一个空的 .gitignore 文件 可以当作是一个 placeholder 。当你需要为项目创建一个空的 log 目录时, 这就变的很有用。 你可以创建一个 log 目录 在里面放置一个空的 .gitignore 文件。这样当你 clone 这个 repo 的时候 git 会自动的创建好一个空的 log 目录了。

mayihetu
107 声望3 粉丝

« 上一篇
git-config
下一篇 »
git-分支管理