有些比较机密的文件不想放在Git中一起备份,如数据库的存取密码或AWS服务器的存取金钥……
除了比较机密的文件,对于一些程序编译的中间文件或暂存文件,同样不想将其放在Git中。因为每次只要一编译,就等于产生一个新的文件,对项目来说通常没有实质的利用价值。
1. 忽略这个文件
如果不想把文件放在Git中,只需在项目目录中放一个.gitignore文件,并且设置想要忽略的规则即可。如果这个文件不存在,就手动新增它:
$ touch .gitignore
然后编辑这个文件的内容:
# 文件名称 .gitignore # 忽略secret.yml文件 secret.yml # 忽略config目录下的database.yml文件 config/database.yml # 忽略db目录下所有后缀是 .sqlite3的文件 /db/*.sqlite3 # 忽略所有后缀是 .tmp的文件 *.tmp # 如果想要忽略.gitignore这个文件也可以,只是通常不会这么做 # .gitignore
只要.gitignore文件存在,即使这个文件没有被Commit或Push上Git服务器,也会有效果。但通常建议将这个文件Commit进项目并且push上Git服务器,以便让一起开发项目的所有人可以共享相同的文件。
在新增文件时,只要符合.gitignore文件中的规定,这个文件就会被忽视。例如,现在的状态是刚刚完成Commit,暂存区与工作目录都是干净的:
$ git status On branch master nothing to commit, working tree clean
这时加入要被忽略的文件secret.yml:
$ touch secret.yml
再看一下状态:
$ git status On branch master nothing to commit, working tree clean
现在,这个文件虽然确实存在这个目录中,但Git已经“感应”不到它了,即它被Git无视了。
如果不知道自己所用的工具或程序语言通常会忽略哪些文件,可以登录https://github.com/github/gitignore查看,上面整理了一份各种程序语言常见的.gitignore文件。
2. 可以忽略这个忽略吗
虽然.gitignore文件列出了一些忽略的规则,但其实这些忽略的规则也是可以被忽略的。只需在执行git add命令时加上-f参数:
$ git add -f文件名称
就可以无视规则了。
3. 咦?怎么没效果
以上面的例子来说,这个项目中刚好有个config目录,而这个目录中刚好有个database.yml文件,完全符合被忽略的规则。照理说这个改动应该会被无视,但编辑database.yml之后却发现:
$ git status On branch master Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) modified: config/database.yml
其状态竟然变成了modified,这是为什么?
这是因为config/database.yml文件在.gitignore之前就存在了。.gitignore文件设置的规则只对那些在规则设置之后存入的文件有效,那些已经存在的文件就像既得利益者一样,这些规则对它们是无效的。
如果想套用.gitignore的规则,就必须先使用git rm --cached命令把这些“既得利益者”移出Git,然后它们就会被忽略了。
4. 清除忽略的文件
如果想清除那些已经被忽略的文件,可以使用git clean命令并配合-X参数:
$ git clean -fX
那个额外加上的-f参数是指强制删除。这样一来,就可以清除那些被忽略的文件了。