【问题标题】:Using git filters to ignore a specific line in json file使用 git 过滤器忽略 json 文件中的特定行
【发布时间】: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 配置可以是到本地配置存储库工作树的符号链接。)

标签: json git sed


【解决方案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"
    }

那么config/local.json可以被git忽略。

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

【讨论】:

  • 谢谢,是的,这正是我要实现的目标,但我想知道为什么配置文件没有通过过滤器(请参阅更新后的问题)?
  • @SirwanAfifi 双引号内还有未转义的双引号。
  • 你是对的,我应该使用 \" 来逃避它,像这样:"sed 's/\""UseSqlite\"": .*/\""UseSqlite\"": true,/'"
  • @SirwanAfifi 你加倍了。可能是"sed 's/\"UseSqlite\": .*/\"UseSqlite\": true,/'"
  • @SirwanAfifi 抱歉,我不知道 sed 也不知道 Git 内容过滤器。无论如何,这不是一个很好的解决方案,改进您的配置处理是。
猜你喜欢
  • 2011-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-20
  • 2019-04-03
相关资源
最近更新 更多