Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用git过滤器忽略json文件中的特定行_Json_Git_Sed - Fatal编程技术网

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

使用git过滤器忽略json文件中的特定行,json,git,sed,Json,Git,Sed,我有以下json文件: { "UseSqlite": false, "UsersAvatarsFolder": "uploads", "UserDefaultPhoto": "no_image.jpg" } 现在我想告诉git忽略“UseSqlite”:false,行,因此我使用.gittributes文件来忽略这一行: *.json filter=ignoreSqlite 然后在gitconfig中定义此筛选器: git config --global filter.ignor

我有以下json文件:

{
  "UseSqlite": false,
  "UsersAvatarsFolder": "uploads",
  "UserDefaultPhoto": "no_image.jpg"
}
现在我想告诉git忽略
“UseSqlite”:false,
行,因此我使用
.gittributes
文件来忽略这一行:

*.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”
真的
,当我拉动
“UseSqlite”
假的
。但是这些过滤器不是那样工作的,知道吗?

我猜你得到的是一个配置文件,你想确保签出中的本地修改不会被意外签入。在这种情况下,我敢打赌您正在使用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
中保留自己的自定义设置。谢谢,是的,这正是我要实现的,但我想知道为什么配置文件没有通过过滤器(请查看更新的问题)?@Sirwanafi你的双引号中仍然有未替换的双引号。你是对的,我是否应该使用\“来转义它,类似这样:
“sed's/\”UseSqlite\:.*/\“UseSqlite\”:true,/“
@Sirwanafi你在翻倍。它可能是
“sed's/\”UseSqlite\:.*/\”UseSqlite\:true,/““
@sirwanafif对不起,我不知道
sed
也不知道Git内容过滤器。无论如何,这不是一个很好的解决方案,改进配置处理是很困难的。正确使用
sed
和shell语法是很困难的,因为每一步Git本身读取配置,shell运行过滤器,sed本身解释命令都会添加自己的一层引号、空格、反斜杠和/或其他元字符操作。但正如Schwern所指出的,将配置文件分为“默认的,版本控制的”和“本地化的,但不作为软件的一部分进行版本控制的”配置文件是一种方法。(请注意,如果愿意,本地配置可以是指向本地配置存储库工作树的符号链接。)