Git 与 JSON 个文件冲突

Git conflicts with JSON files

我们的网站使用一堆 JSON 翻译文件(每种语言一个文件)进行本地化。文件的内容如下所示:

{
    "Password": "Passwort",
    "Tables": "Tische"
}

许多团队成员同时编辑这些 JSON 文件,添加新短语并编辑现有短语,即使人们更改不同的行,我们也会遇到很多冲突。

有没有办法以有助于避免合并冲突的方式设置 git?

P.S。 我发现这个脚本可以帮助本地合并:https://gist.github.com/jphaas/ad7823b3469aac112a52。但是,我对一个可以为团队中的每个人解决问题的解决方案感兴趣(即使是通过 GitHub 的网络界面编辑 JSONs 的人)。

例如,有2个开发人员(开发人员A和B)在一个项目中工作。我将创建 2 个翻译文件:A.jsonB.jsonA.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 项目,它会更容易。我建议您使用 gruntgulp 来 运行 任务。比如可以参考https://www.npmjs.com/package/grunt-merge-json or https://www.npmjs.com/package/grunt-concat-json

在这种情况下我会做的一件事是在数据库 table 而不是 JSON 文件中维护配置 - 如果它们经常更改所有内容。正如其他人已经指出的那样,如果您一直对配置进行大量更改,那么您可以做很多事情来避免冲突。无论如何,您的示例看起来更像是英语单词和其他语言之间的映射,因此三列 table 就足够了。

如果需要,JSON 文件可以每次即时生成,也可以在部署期间从数据库 table.

为每个服务器生成一次

we get lots of conflicts even though people are changing different lines

这不应该是这种情况,只有当同一行被不同的人修改、提交然后合并后才会发生冲突。

哦,我真的试过了,遇到了一些奇怪的问题。

提交 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 行为,我的愚蠢建议是将 "padding" 添加到 JSON 文件(丑陋,不是吗?但不再有冲突):

{
    "a": "1",

    "b": "2",

    "c": "3",

    "d": "4",

    "e": "5",

    "f": "6",

    "g": "7"
}

你可以 运行 git pull --rebase。这样当其他人编辑了您的 JSON 文件时,git 将首先提取他们的更改,然后尝试在他们的之上应用您的更改。每次都有一个选项可以这样做:只需将您的分支名称放在 BRANCH 和 运行 的位置:git config branch.BRANCH.rebase true

另一个原因,您看到这么多冲突可能是因为您的开发人员使用了不同的行尾配置。请参阅 Git 中的 How to change line-ending settings。为了找出答案,您可以使用十六进制编辑器打开一个 json 文件,并查看整个文件中的所有行结尾是否一致。

摘自@Tim Biegeleisen 的评论,我认为这值得作为一个答案: