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.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 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 的评论,我认为这值得作为一个答案:
npm i -g coffeescript
- follow instructions on top of the gist
- 另外,将要点保存在您的项目中
- 回去工作
我们的网站使用一堆 JSON 翻译文件(每种语言一个文件)进行本地化。文件的内容如下所示:
{
"Password": "Passwort",
"Tables": "Tische"
}
许多团队成员同时编辑这些 JSON 文件,添加新短语并编辑现有短语,即使人们更改不同的行,我们也会遇到很多冲突。
有没有办法以有助于避免合并冲突的方式设置 git?
P.S。 我发现这个脚本可以帮助本地合并:https://gist.github.com/jphaas/ad7823b3469aac112a52。但是,我对一个可以为团队中的每个人解决问题的解决方案感兴趣(即使是通过 GitHub 的网络界面编辑 JSONs 的人)。
例如,有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 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 的评论,我认为这值得作为一个答案:
npm i -g coffeescript
- follow instructions on top of the gist
- 另外,将要点保存在您的项目中
- 回去工作