近期在 git 遇到几个问题,让我重新认识到 git 的强大性,下面列出来记录一下
有一个数据库的配置文件,在用
添加到
- git add
时不能透露了相关配置。而如果用
- index file
去操作这需求,却会放弃 add 整个文件,如果这样做的话,commit 后其他人就看不到这里面有个 config 配置文件了,这结果很明显不是我们想要的。怎么做呢?搜索了下要使用 git 下面的 filter 配置去过滤那些秘密。官方文档的描述如下:
- .gitignore
- pattern attr1 attr2 ...
文档详情内容请看
,这里不展开讨论
- git config --help
这是我当时的一个 config.php 文件:
- <?php
- return array(
- 'DB_TYPE' => 'MySql', // 数据库类型
- 'DB_HOST' => '10.66.111.111', // 服务器地址
- 'DB_NAME' => 'blog', // 数据库名
- );
根据文档的提示,我们应该这么做:
- echo config.php filter=rm_conf >> .gitattributes
- git config filter.rm_conf.clean "sed 's/\'10\.66\.111\.111\'/\'\'/g;s/\'blog\'/\'\'/g'"
关于 sed 的命令的用法及参数说明,
按照第二条命令运行,再用
添加到
- git add
时,发现错误提示
- index file
- sed 's/\'10\.66\.111\.111\'/\'\'/g;s/\'blog\'/\'\'/g': -c: line 0: unexpected EOF while looking for matching `''
- sed 's/\'10\.66\.111\.111\'/\'\'/g;s/\'blog\'/\'\'/g': -c: line 1: syntax error: unexpected end of file
- error: external filter sed 's/\'10\.66\.111\.111\'/\'\'/g;s/\'blog\'/\'\'/g' failed 1
- error: external filter sed 's/\'10\.66\.111\.111\'/\'\'/g;s/\'blog\'/\'\'/g' failed
唔... 具体哪里错了呢,我们单独在命令行写
- sed 's/\'10\.66\.111\.111\'/\'\'/g;s/\'blog\'/\'\'/g' config.php
命令行打印出了正确的结果
- return array(
- 'DB_TYPE' => 'MySql', // 数据库类型
- 'DB_HOST' => '', // 服务器地址
- 'DB_NAME' => '', // 数据库名
- );
一脸懵逼.. 再仔细查了下 git 的 help 文档,发现原来是分号惹的祸
然后我意识性地在分号前面加了个
转义符,然而还是那个错误。机智的我立马搜 stackoverflow ,不出所料这坑早已有人踩过了,立马找出了答案。以下是链接
- \
于是,把
设置为
- commentChar
。
- "#"
- git config core.commentChar "#"
- git config filter.rm_conf.clean "sed \"s/'10\.66\.111\.111'/''/g;s/'blog'/''/g\""
再 run 一次,达到了预期的效果!
but,感觉这样写起来不太美观啊,同一个文件需要隐藏配置项一多起来,就很难看懂这段 command 了。那我们就把这段脚本放在一个. sh 里面,sed 分开写,一行一个配置项,这样逻辑就清晰多了。假设这个脚本的名字叫
,将这文件放在. git 目录里面,如下代码:
- hidden_conf.sh
- !#bin/bash
- # filter服务器地址
- sed -i 's/'10\.66\.111\.111'/''/g' config.php
- # filter数据库名
- sed -i "s/'blog'/''/g" config.php
然后再改下 git 中 config 的配置:
- git config filter.rm_conf.clean 'hidden_conf.sh'
来源: http://www.cnblogs.com/haiku/p/6414067.html