【发布时间】:2017-07-17 04:46:08
【问题描述】:
我有以下 json 文件:
{
"UseSqlite": false,
"UsersAvatarsFolder": "uploads",
"UserDefaultPhoto": "no_image.jpg"
}
现在我想告诉 git 忽略 "UseSqlite": false, 行所以我按照 this solution 使用 .gitattributesfile 忽略此特定行:
*.json filter=ignoreSqlite
然后在gitconfig中定义了这个过滤器:
git config --global filter.ignoreSqlite.clean 'sed "s/"UseSqlite": .*/"UseSqlite": true/"'
git config --global filter.ignoreSqlite.smudge cat
但是好像不行:
'sed: -c: line 0: unexpected EOF while looking for matching `''
'sed: -c: line 1: syntax error: unexpected end of file
error: external filter 'sed failed 1
error: external filter 'sed failed
On branch master
我不确定sed 的语法。您能否看一下它并让我知道它的正确语法是什么?
更新:
我终于修正了语法:
git config --global filter.ignoreSqlite.smudge "sed 's/"UseSqlite": .*/"UseSqlite": true,/'"
git config --global filter.ignoreSqlite.clean "sed 's/"UseSqlite": .*/"UseSqlite": false,/'"
但它也不起作用,我希望当我推送修改时,"UseSqlite" 是 true,当我拉动 "UseSqlite" 时是 false。但是这些过滤器不能那样工作,知道吗?
【问题讨论】:
-
正确使用
sed和 shell 语法很棘手,因为每一步——Git 自己读取配置,shell 运行过滤器,sed 自己解释命令——都添加了自己的引号层,白色-空格、反斜杠和/或其他元字符操作。但正如 Schwern 所指出的,将其分为“默认和版本控制”和“本地化,但强调不版本作为软件的一部分”配置文件是这里的方法。 (请注意,如果您愿意,local 配置可以是到本地配置存储库工作树的符号链接。)