Git entra en conflicto con archivos JSON
github localization (5)
Nuestro sitio web se localiza utilizando un montón de archivos JSON con traducciones (un archivo por idioma). El contenido de los archivos se ve así:
{
"Password": "Passwort",
"Tables": "Tische"
}
Muchos miembros del equipo editan estos archivos JSON al mismo tiempo, añaden nuevas frases y editan las existentes, y tenemos muchos conflictos a pesar de que las personas están cambiando líneas diferentes.
¿Hay una manera de configurar git de tal manera que ayude a evitar conflictos de fusión?
PS He encontrado este script para ayudar a fusionar localmente: https://gist.github.com/jphaas/ad7823b3469aac112a52 . Sin embargo, estoy interesado en una solución que solucione el problema para todos en el equipo (incluso para las personas que editan JSON a través de la interfaz web de GitHub).
Tenemos muchos conflictos a pesar de que las personas están cambiando diferentes líneas.
Este no debería ser el caso, solo se obtienen conflictos si la misma línea es modificada por diferentes personas, se confirma y luego se fusiona.
Oh, en realidad probé esto y encontré algunos problemas extraños.
Commit 1 (master):
{
"a": "1",
"b": "2",
"c": "3",
"d": "4",
"e": "5",
"f": "6",
"g": "7"
}
Commit 2 (tmp)
{
"A": "1",
"B": "2",
"C": "3",
"d": "4",
"e": "5",
"f": "6",
"g": "7"
}
Commit 3 (master):
{
"a": "1",
"b": "2",
"c": "3",
"d": "4",
"E": "5",
"F": "6",
"G": "7"
}
git merge tmp
: resultado correcto
{
"A": "1",
"B": "2",
"C": "3",
"d": "4",
"E": "5",
"F": "6",
"G": "7"
}
Sin embargo, tengo conflictos si también se modificó la fila "d"
, tal vez git no pudo establecer límites de diferencias. Mi estúpida sugerencia para evitar este estúpido comportamiento de git es agregar "relleno" al archivo JSON (feo, ¿no? Pero no más conflictos):
{
"a": "1",
"b": "2",
"c": "3",
"d": "4",
"e": "5",
"f": "6",
"g": "7"
}
Otra razón por la que ve tantos conflictos podría ser que sus desarrolladores estén usando diferentes configuraciones de final de línea. Consulte Cómo cambiar la configuración de final de línea en Git. Para averiguarlo, puede abrir un archivo json con un editor Hex y ver si todos los finales de línea son consistentes en todo el archivo.
Podrías ejecutar git pull --rebase
. De esa manera, cuando alguien más haya editado su archivo JSON, git primero extraerá sus cambios y luego intentará aplicarlos a los suyos. Hay una opción para hacer esto cada vez: simplemente ponga el nombre de su sucursal en lugar de BRANCH y ejecute esto: git config branch.BRANCH.rebase true
Por ejemplo, hay 2 desarrolladores (desarrollador A y B) que trabajan en un proyecto. A.json
2 archivos de traducción: A.json
y B.json
. A.json
es para el desarrollador A, B.json
es para el desarrollador B. Y crearé el archivo de traducción llamado en_US.json
. en_US.json
se ignora en el archivo .gitignore
.
Así que la estructura del directorio de traducción de la siguiente manera:
$ tree . -a
.
├── A.json
├── B.json
├── en_US.json
└── .gitignore
Así que ahora, tengo que crear una tarea para combinar todos los archivos JSON en en_US.json. Es más fácil si está ejecutando un proyecto de Javascript. Te sugiero que uses un grunt
o gulp
para ejecutar la tarea. Por ejemplo, puede consultar https://www.npmjs.com/package/grunt-merge-json o https://www.npmjs.com/package/grunt-concat-json
Una cosa que haría en tal escenario sería mantener las configuraciones en una tabla de base de datos en lugar de un archivo JSON, si cambian con tanta frecuencia. Como ya otros lo han señalado, no hay mucho que pueda hacer para evitar conflictos si tiene ese gran número de cambios que ocurren en la configuración todo el tiempo. De todos modos, su ejemplo se parece más a una asignación entre la palabra en inglés y algún otro idioma, por lo que una tabla de tres columnas debería ser suficiente.
El archivo JSON, si es necesario, podría generarse sobre la marcha cada vez o generarse una vez durante el despliegue para cada servidor desde la tabla de la base de datos.