设为首页 收藏本站
查看: 990|回复: 0

[经验分享] 如何让 Git 忽略掉文件中的特定行内容?

[复制链接]

尚未签到

发表于 2018-1-13 11:30:05 | 显示全部楼层 |阅读模式
  近期在git遇到几个问题,让我重新认识到git的强大性,下面列出来记录一下
  有一个数据库的配置文件,在用 git add 添加到 index file 时不能透露了相关配置。而如果用 .gitignore 去操作这需求,却会放弃add整个文件,如果这样做的话,commit后其他人就看不到这里面有个config配置文件了,这结果很明显不是我们想要的。怎么做呢?搜索了下要使用git下面的filter配置去过滤那些秘密。官方文档的描述如下:

  filter.driver.clean
  
The command which is used to convert the content of a worktree file to a blob upon checkin. See gitattributes(5) for details.


  filter.driver.smudge
  
The command which is used to convert the content of a blob object to a worktree file upon checkout. See gitattributes(5) for details.



SYNOPSIS
  $GIT_DIR/info/attributes, .gitattributes



DESCRIPTION
  A gitattributes file is a simple text file that gives attributes to pathnames.
  
Each line in gitattributes file is of form:

  

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 &quot;sed 's/\'10\.66\.111\.111\'/\'\'/g;s/\'blog\'/\'\'/g'&quot;
  关于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文档,发现原来是分号惹的祸

  The syntax is fairly flexible and permissive; whitespaces are mostly ignored. The # and ; characters begin comments to the end of line, blank lines are ignored.

  然后我意识性地在分号前面加了个 \ 转义符,然而还是那个错误。机智的我立马搜 stackoverflow ,不出所料这坑早已有人踩过了,立马找出了答案。以下是链接


  • Start a git commit message with a hashmark (#)
  • Escape comment character (#) in git commit messsage[duplicate]
  于是,把commentChar设置为&quot;#&quot;。
git config core.commentChar &quot;#&quot;  
git config filter.rm_conf.clean &quot;sed \&quot;s/'10\.66\.111\.111'/''/g;s/'blog'/''/g\&quot;&quot;
  再run一次,达到了预期的效果!
  but,感觉这样写起来不太美观啊,同一个文件需要隐藏配置项一多起来,就很难看懂这段command了。那我们就把这段脚本放在一个.sh里面,sed分开写,一行一个配置项,这样逻辑就清晰多了。假设这个脚本的名字叫hidden_conf.sh,将这文件放在.git目录里面,如下代码:
!#bin/bash  

  
# filter服务器地址
  
sed -i 's/'10\.66\.111\.111'/''/g' config.php
  
# filter数据库名
  
sed -i &quot;s/'blog'/''/g&quot; config.php
  然后再改下git中config的配置:
git config filter.rm_conf.clean '.git/hidden_conf.sh'

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-434619-1-1.html 上篇帖子: 源代码管理工具 git 下篇帖子: Androidstudio项目分享到Git@OSC托管
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表