json git github localization git-merge

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.