我们的网站使用一堆带翻译的JSON文件进行本地化(每种语言一个文件)。文件的内容如下所示:
{
"Password": "Passwort",
"Tables": "Tische"
}
许多团队成员同时编辑这些JSON文件,添加新短语并编辑现有短语,即使人们正在更改不同的行,我们也会遇到很多冲突。
有没有办法以有助于避免合并冲突的方式设置git?
P.S。 我发现此脚本有助于本地合并:https://gist.github.com/jphaas/ad7823b3469aac112a52。但是,我对能够解决团队中每个人的问题的解决方案感兴趣(即使是通过GitHub的网络界面编辑JSON的人)。
答案 0 :(得分:11)
即使人们的变化不同,我们也会遇到很多冲突 线
不应该是这种情况,如果同一行由不同的人修改,提交然后合并,则只会发生冲突。
哦,我实际上尝试了这个并遇到了一些奇怪的问题。
提交1(主):
{
"a": "1",
"b": "2",
"c": "3",
"d": "4",
"e": "5",
"f": "6",
"g": "7"
}
提交2(tmp)
{
"A": "1",
"B": "2",
"C": "3",
"d": "4",
"e": "5",
"f": "6",
"g": "7"
}
提交3(主):
{
"a": "1",
"b": "2",
"c": "3",
"d": "4",
"E": "5",
"F": "6",
"G": "7"
}
git merge tmp
:正确的结果
{
"A": "1",
"B": "2",
"C": "3",
"d": "4",
"E": "5",
"F": "6",
"G": "7"
}
但是如果修改了行"d"
,我也会遇到冲突,也许git无法建立差异边界。我避免这种愚蠢的git行为的愚蠢建议是在JSON文件中添加“填充”(丑陋,不是吗?但是没有更多的冲突):
{
"a": "1",
"b": "2",
"c": "3",
"d": "4",
"e": "5",
"f": "6",
"g": "7"
}
答案 1 :(得分:7)
在这种情况下,我要做的一件事就是维护数据库表而不是JSON文件中的配置 - 如果它们经常更改的话。正如其他人已经指出的那样,如果您的配置始终发生大量更改,则无法避免冲突。无论如何,你的例子看起来更像是英语单词和其他语言之间的映射,所以三列表就足够了。
如果需要,JSON文件可以每次动态生成,也可以在部署期间从数据库表中为每个服务器生成一次。
答案 2 :(得分:3)
另一个原因,为什么你看到这么多的冲突可能是你的开发人员使用不同的行结束配置。请参阅Git中的How to change line-ending settings。为了找到答案,您可以使用十六进制编辑器打开一个json文件,并查看整个文件中的所有行结尾是否一致。
答案 3 :(得分:1)
您可以运行git pull --rebase
。这样,当其他人编辑了您的JSON文件时,git将首先提取他们的更改,然后尝试在他们的更改之上应用您的更改。每次都可以选择这样做:只需将您的分支名称替换为BRANCH并运行:git config branch.BRANCH.rebase true
答案 4 :(得分:-2)
例如,有2名开发人员(开发人员A和B)在项目中工作。我将创建2个翻译文件:A.json
和B.json
。 A.json
适用于开发人员A,B.json
适用于开发人员B.我将创建名为en_US.json
的翻译文件。 en_US.json
文件中会忽略.gitignore
。
所以翻译目录的结构如下:
$ tree . -a
.
├── A.json
├── B.json
├── en_US.json
└── .gitignore
所以现在,我必须创建一个任务来将所有JSON文件组合到en_US.json。如果您正在运行Javascript项目,则会更容易。我建议您使用grunt
或gulp
来运行任务。例如,您可以参考https://www.npmjs.com/package/grunt-merge-json或https://www.npmjs.com/package/grunt-concat-json