沙滩星空的博客沙滩星空的博客

gitignore:让Git忽略隐私文件到版本库

匹配规则

  1. 忽略具体目录。正斜杠/开头,代表当前 .gitignore 文件下的 绝对路径
  2. 忽略所有同名目录。正斜杠/结尾,表示文件夹。例:build/ 即忽略所有 build 文件夹,子目录下的build 目录也忽略。
  3. 取消忽略。使用 ! 开头。比如前面使用 *.apk,下面使用!a.apk,则此a.apk不被忽略。如果排除了该文件的父级目录,则使用 ! 也不会再次被包含。
  4. 匹配零个或多个字符。使用*符号。如*.[oa]忽略所有以".o"或".a"结尾;
  5. 匹配制定列表的任一字符。使用[]符号。如 [abc],也可以在括号内加连接符,如 [0-9] 匹配0至9的数;
  6. 匹配单个字符。使用 ? 符号。
  7. ** 匹配多级目录,可在开始,中间,结束

示例:

/mtk/               过滤整个文件夹
*.zip                过滤所有.zip文件
/mtk/do.c         过滤某个具体文件
!/mtk/one.txt     取消此文件的忽略

.ignore 配置文件按行从上到下进行规则匹配,意味着如果前面的规则匹配的范围更大,则后面的规则将不会生效.

示例:

a)忽略所有同名目录的文件。fd1/*
说明:忽略目录 fd1 下的全部内容。不管是根目录下的 /fd1/ 目录,还是子目录 /child/fd1/,都会被忽略;

b)忽略具体目录的文件:/fd1/*
说明:忽略根目录下的 /fd1/ 目录的全部内容;

c)规则:
/*
!.gitignore
!/fw/bin/
!/fw/sf/
说明:忽略全部内容,但是不忽略 .gitignore 文件、根目录下的 /fw/bin/ 和 /fw/sf/ 目录;

忽略规则的优先级

在 .gitingore 文件中,每一行指定一个忽略规则,Git检查忽略规则的时候有多个来源,它的优先级如下(由高到低):
1)从命令行中读取可用的忽略规则
2)当前目录定义的规则
3)父级目录定义的规则,依次递推
4)$GIT_DIR/info/exclude 文件中定义的规则
5)core.excludesfile中定义的全局规则


在Git项目中定义.gitignore文件

.idea
composer.lock
*.log
*.css.map
.sass-cache
/source/application/config.php
/source/application/database.php
/source/runtime/*
/source/.buildpath
/source/.project
/source/.settings
/web/.htaccess
/doc

在Git项目的设置中指定排除文件

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

定义Git全局的 .gitignore 文件

还可以设置全局的git .gitignore文件来管理所有Git项目的行为。这种方式在不同的项目开发者之间是不共享的,是属于项目之上Git应用级别的行为。这种方式也需要创建相应的 .gitignore 文件,可以放在任意位置。然后在使用以下命令配置Git:

git config --global core.excludesfile ~/.gitignore

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

1).gitignore只能忽略那些原来没有被track的文件.
如果某些文件已经被纳入了版本管理中,则修改.gitignore是无效的
2)想要.gitignore起作用,这些文件必须不在暂存区中才可以。
.gitignore只忽略没被staged(cached)文件,否则加入.gitignore时一定要先从staged移除,才可以忽略。

方法一: git清除本地缓存(改变成未track状态)后再提交:

 git rm -r --cached 文件/文件夹名字
 git add .
 git commit -m 'update .gitignore'
 git push -u origin master

方法二:

# 新增忽略文件
git update-index --assume-unchanged source/application/database.php
# 取消忽略文件
git update-index --no-assume-unchanged source/application/database.php

在使用.gitignore文件后如何删除远程仓库中以前上传的此类文件而保留本地文件
在使用git和github的时候,之前没有写.gitignore文件,就上传了一些没有必要的文件,在添加了.gitignore文件后,就想删除远程仓库中的文件却想保存本地的文件。这时候不可以直接使用"git rm directory",这样会删除本地仓库的文件。
可以使用"git rm -r –cached directory"来删除缓冲,然后进行"commit"和"push",这样会发现远程仓库中的不必要文件就被删除了,以后可以直接使用"git add -A"来添加修改的内容,上传的文件就会受到.gitignore文件的内容约束


git库所在的文件夹中的文件大致有4种状态
Untracked:
未跟踪, 此文件在文件夹中, 但并没有加入到git库, 不参与版本控制. 通过git add 状态变为Staged.

Unmodify:
文件已经入库, 未修改, 即版本库中的文件快照内容与文件夹中完全一致. 这种类型的文件有两种去处, 如果它被修改,
而变为Modified. 如果使用git rm移出版本库, 则成为Untracked文件

Modified:
文件已修改, 仅仅是修改, 并没有进行其他的操作. 这个文件也有两个去处, 通过git add可进入暂存staged状态,
使用git checkout 则丢弃修改过, 返回到unmodify状态, 这个git checkout即从库中取出文件, 覆盖当前修改

Staged:
暂存状态. 执行git commit则将修改同步到库中, 这时库中的文件和本地文件又变为一致, 文件为Unmodify状态.
执行git reset HEAD filename取消暂存, 文件状态为Modified

Git 状态 untracked 和 not staged的区别
1)untrack 表示是新文件,没有被add过,是为跟踪的意思。
2)not staged 表示add过的文件,即跟踪文件,再次修改没有add,就是没有暂存的意思


官方文档:https://git-scm.com/docs/gitignore
Git忽略提交 https://www.cnblogs.com/kevingrace/p/5690241.html
Git中使用.gitignore忽略文件的推送
gitignore语法规则及踩过的坑 https://blog.csdn.net/tianyake_1/article/details/112647944

未经允许不得转载:沙滩星空的博客 » gitignore:让Git忽略隐私文件到版本库

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址