使用git过滤器忽略json文件中的特定行

时间:2017-02-26 16:28:32

标签: json git sed

我有以下json文件:

{
  "UseSqlite": false,
  "UsersAvatarsFolder": "uploads",
  "UserDefaultPhoto": "no_image.jpg"
}

现在我想告诉git忽略"UseSqlite": false,行所以我跟着this solution使用.gitattributes文件忽略了这一特定行:

*.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时。但是这些过滤器不能那样工作,不知道吗?

1 个答案:

答案 0 :(得分:1)

我猜你所拥有的是一个配置文件,你要确保在结帐时不会意外签入本地修改。在这种情况下,我打赌你打赌你正在使用SQLite用于测试。有更简单的方法可以使系统更加灵活。

最简单的方法是有两个配置文件:一个用于生产,一个用于测试。系统默认为生产系统,但您的测试工具会选择测试工具。

但是这引入了重复,所以你真正想要的是将几个配置文件合并在一起。您有一个完整的默认配置文件,通常不会被触摸,然后您有一个本地配置文件。系统将两者合并在一起。例如......

config/default.json
    {
      "UseSqlite": false,
      "UsersAvatarsFolder": "uploads",
      "UserDefaultPhoto": "no_image.jpg"
    }

config/local.json
    {
      "UseSqlite": true
    }

系统加载两者,结果配置为:

    {
      "UseSqlite": true,
      "UsersAvatarsFolder": "uploads",
      "UserDefaultPhoto": "no_image.jpg"
    }

然后git可以忽略config/local.json

这对测试和用户都很有用。现在,当他们更新时,他们不会丢失对配置的更改。 config/default.json会更新,他们会获得任何新的或更改的默认值,同时在config/local.json中保留自己的自定义。