如何让 Git 忽略掉文件中的特定行内容?
近期在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 ingitattributesfile 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 "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文档,发现原来是分号惹的祸
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设置为"#"。
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分开写,一行一个配置项,这样逻辑就清晰多了。假设这个脚本的名字叫hidden_conf.sh,将这文件放在.git目录里面,如下代码:
!#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 '.git/hidden_conf.sh'
如何让 Git 忽略掉文件中的特定行内容?的更多相关文章
- git忽略掉文件权限检查
有时 git diff 执行显示文件内容没变化,但是有 old mode xxx new mode,原因是文件的权限,被chmod变化了,这种变化也被 diff 识别出来了,让git忽略掉文件权限检查 ...
- rev---将文件中的每行内容以字符为单位反序输出
rev命令将文件中的每行内容以字符为单位反序输出,即第一个字符最后输出,最后一个字符最先输出,依次类推.
- springMvc将对象json返回时自动忽略掉对象中的特定属性的注解方式
1.注解使用在 类名,接口头上 @JsonIgnoreProperties(value={"comid"}) //希望动态过滤掉的属性 例 @JsonIgnorePropertie ...
- linux下向一个文件中的某行插入数据的做法
sed -i 'ni\x' test.file 表示向test.file文件里的第n行的前面添加x内容sed -i 'na\x' test.file 表示向test.file ...
- [转载]git 忽略某些文件
项目中经常会生成一些Git系统不需要追踪(track)的文件.典型的是在编译生成过程中 产生的文件或是编程器生成的临时备份文件.当然,你不追踪(track)这些文件,可以 平时不用"git ...
- git忽略某些文件提交
git忽略某些文件提交 在项目中有些配置文件不需要提交,但是有同学在后面开发中发现在.igonore文件中无论如何都无法忽略某些文件的提交.原因在这里: 已经维护起来的文件,即使加上了gitign ...
- 如何使git忽略某些文件或文件夹
为什么要忽略某些文件或文件夹的变化? git作为一款项目文件变更版本管理软件,其主要功能之一就是追踪项目文件夹内各种文件及文件夹的变更情况.但是,在日常使用中,并非项目文件夹下的所有文件及文件夹变更都 ...
- uniq---报告或忽略文件中的重复行
uniq命令用于报告或忽略文件中的重复行,一般与sort命令结合使用. 语法 uniq(选项)(参数) 选项 -c或——count:在每列旁边显示该行重复出现的次数: -d或--repeated:仅显 ...
- 在使用 vscode 时 eslint 检测 .vue 文件中的less 部分内容
问题: 在使用 vscode 以及 eslint 来检测 基于 webpack 的 vue-cli 的项目中,eslint 无法检测到 .vue 文件中的less 部分内容. 解答: 1.通过 下载 ...
随机推荐
- TCP/IP协议头部结构体(网摘小结)(转)
源:TCP/IP协议头部结构体(网摘小结) TCP/IP协议头部结构体(转) 网络协议结构体定义 // i386 is little_endian. #ifndef LITTLE_ENDIAN #de ...
- HTML5语义化标签重构页面
在HTML5未出现之前我们都用div+css来构建页面,比如<div id=”header”>,div的滥用,使得代码的可读性和可维护性很差,现在用本文来介绍一下用HTML5′干净的’语义 ...
- 【转】一大波实用的 bash 别名和函数
作为一个命令行探索者,你或许发现你自己一遍又一遍重复同样的命令.如果你总是用ssh进入到同一台电脑,如果你总是将一连串命令连接起来,如果你总是用同样的参数运行一个程序,你也许希望在这种不断的重复中为你 ...
- php小知识。
合并数组的2个方式区别 1)键名为数字时,array_merge()不会覆盖掉原来的值,但+合并数组则会把最先出现的值作为最终结果返回,而把后面的数组拥有相同键名的那些值“抛弃”掉(不是覆盖) 2)键 ...
- Cocos2d-x 的“HelloWorld” 深入分析
本节所用Cocos2d-x版本:cocos2d-1.0.1-x-0.12.0 不能免俗,一切都从“HelloWorld!”开始.打开HelloWorld工程,里面有两个文件目录Classes和win3 ...
- 获取linq生成的sql语句
命名空间:using System.Data.Objects; var query = db.TxtRes.Join(db.LangRes, a => new { id1 = a.ResID, ...
- VS2013 opencv2.4.8
[转]http://my.phirobot.com/blog/2014-02-opencv_configuration_in_vs.html vs2010+opencv2.4.0:http://www ...
- 史上最全的css hack(ie6-9,firefox,chrome,opera,safari)
<!DOCTYPE html> <html> <head> <title>Css Hack</title> <style> #t ...
- Rest Project Performace Pressure Test
首次调整基线和配置修改 机器配置为 CPU: Intel(R) Xeon(R) CPU E5-2630 v2 @ 2.6GHz 24core 内存: 128G JDK Ver: 1.7.0_80 To ...
- MariaDB与MySQL在一台服务器同时运行
[root@HE3 ~]#groupadd mariadb -g 513 [root@HE3 ~]#useradd-u 513 -gmariadb -s /sbin/nologin -d /home/ ...