如何让 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.通过 下载 ...
随机推荐
- LPC1788的外部中断和GPIO中断
首先是gpio中断,这一点和1768不同,1768使用的中断时和eint3共用中断通道,到了1788,专门为gpio开辟了中断 #ifndef __JOYPAD_H_ #define __JOYPAD ...
- UIResponder学习
http://blog.csdn.net/jimzhai/article/details/23283515 UIResponder 介绍 UIResponder 这个类定义了很多用来处理响应和时间处理 ...
- Linux cronolog
1. 关于本文 本文将以cronolog 1.6.2.apache 2.2.6为例,以CentOS 5为平台,讲述cronolog的安装和设置. 2. 关于cronolog cronol ...
- BZOJ 1101 [POI2007]Zap ——Dirichlet积
[题目分析] Dirichlet积+莫比乌斯函数. 对于莫比乌斯函数直接筛出处理前缀和. 对于后面向下取整的部分,可以分成sqrt(n)+sqrt(m)部分分别计算 学习了一下线性筛法. 积性函数可以 ...
- Lambda 可以转换成委托或expression树
1.关于C# Lambda Expressions: 一个Lambda Expression (译为Lambda式) 就是一个包含若干表达式和语句的匿名函数.可以被用作创建委托对象或表达式树类型.所 ...
- ubuntu内核的编译安装
原创声明:转载请注明出处. 一.操作环境: 1.ubuntu版本 2.linux原有内核版本 3.要安装的linux内核版本 linux-3.16.39 二.新内核的编译和安装 1.首先下载linux ...
- graphical Layout调大一点
布局最右边的放大器按钮好难找啊
- ios framework 开发
ios framework 开发 之 参考 ios framework 开发 之 实战 iOS workspace 依次编译多个工程
- jquery 中prop()的使用方法
1:设置input的选中属性:$('.passenger').find('.is-need-tel').prop('checked',true); 2:获取input是否选中: $('.passeng ...
- js原生设计模式——4安全的工厂方法模式之oop编程增强版
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8&qu ...