我有以下 json 文件:
{
"UseSqlite": false,
"UsersAvatarsFolder": "uploads",
"UserDefaultPhoto": "no_image.jpg"
}
现在我想告诉 git 忽略 "UseSqlite": false,
行所以我跟着 this solution使用 .gitattributes
file:
*.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
并且在 pull "UseSqlite"时
为 false
。但是这些过滤器不是那样工作的,知道吗?
最佳答案
我猜你得到的是一个配置文件,你想在其中确保 checkout 中的本地修改不会被意外 checkin 。在这种情况下,我敢打赌你正在使用SQLite 用于测试。有更简单的方法可以做到这一点,这也使系统更加灵活。
最简单的做法是拥有两个配置文件:一个用于生产,一个用于测试。系统默认为生产版,但您的测试工具选择了测试版。
但这引入了重复,所以你真正想要的是将几个配置文件 merge 在一起。你有一个充满默认值的配置文件,通常不会被触及,然后你有一个本地配置文件。该系统将两者 merge 在一起。例如……
config/default.json
{
"UseSqlite": false,
"UsersAvatarsFolder": "uploads",
"UserDefaultPhoto": "no_image.jpg"
}
config/local.json
{
"UseSqlite": true
}
系统加载两者,结果配置为:
{
"UseSqlite": true,
"UsersAvatarsFolder": "uploads",
"UserDefaultPhoto": "no_image.jpg"
}
那么config/local.json
可以被git忽略
这对测试和您的用户都有用。现在,当他们更新时,他们不会丢失对配置所做的更改。 config/default.json
得到更新,他们将获得任何新的或更改的默认值,同时在 config/local.json
中保留他们自己的自定义。
关于json - 使用 git 过滤器忽略 json 文件中的特定行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42471051/