2017-02-26 61 views
0

我有以下的JSON文件:使用Git过滤器忽略JSON文件中的特定行

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

现在我想告诉混帐忽略"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。但是这些过滤器不能像那样工作,任何想法?

+0

获得'sed'和shell语法正确是棘手的,因为每一步--Git自己读取你的配置,运行过滤器的shell,sed自己解释一个命令 - 添加自己的一层引用,空白,反斜杠和/或其他元字符动作。但是正如Schwern所指出的那样,将它分解为“默认和版本控制”和“本地化”,但着重于*不作为软件的一部分“配置文件版本”是这里的一种方式。 (请注意,如果您愿意,* local * config可以是到本地配置存储库工作树的符号链接。) – torek

回答

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自己的自定义设置。

+0

谢谢,是的,这正是我要实现的,但我想知道为什么配置文件不通过过滤器(请参阅更新的问题)? –

+0

@SirwanAfifi你的双引号内还有非双引号。 – Schwern

+0

你说得对,我应该用\“来逃避它,像这样: '”sed's/\“”UseSqlite \“”:。*/\“”UseSqlite \“”:true,/'“ ' –