2012-06-15 21 views
22

Tengo un gran repositorio CVS que contiene archivos en ISO-8859-1 y quiero convertir esto a git.Convertir la codificación del archivo del repositorio git

Claro, puedo configurar git para usar ISO-8859-1 para la codificación, pero me gustaría tenerlo en utf8.

Ahora con herramientas como iconv o recode puedo convertir la codificación de los archivos en mi árbol de trabajo. Podría cometer esto con un mensaje como converted encoding.

Mi pregunta ahora es, ¿existe la posibilidad de convertir el historial completo? Ya sea al convertir de cvs a git o después. Mi idea sería escribir un script que lea cada confirmación en el repositorio de git y convertirlo a utf8 y confirmarlo en un nuevo repositorio de git.

Esto es posible (no estoy seguro acerca de los códigos hash y cómo recorrer las confirmaciones, ramas y etiquetas). ¿O hay una herramienta que puede manejar algo como esto?

+3

Sí, puede reescribir el historial, pero probablemente no debería: nunca debe volver a escribir un repositorio, que ya ha enviado a alguna parte. Mi opinión es: 'iconv' y una confirmación normal es el camino a seguir. – KingCrunch

+1

Bien, gracias @KingCrunch. Pero desde que creé el repositorio de git recién se lo lleva a ninguna parte. Y también aceptaría crear un segundo repositorio con la codificación '' utf8'' basada en la historia de la primera. Que es básicamente el mismo en lugar de que yo no modificaría el repositorio existente. –

Respuesta

17

Puede hacerlo con git filter-branch. La idea es que tengas que cambiar la codificación de los archivos en cada commit, reescribiendo cada commit sobre la marcha.

Primero, escriba una secuencia de comandos que cambie la codificación de cada archivo en el repositorio. Se podría tener este aspecto:

#!/bin/sh 

find . -type f -print | while read f; do 
     mv -i "$f" "$f.recode.$$" 
     iconv -f iso-8859-1 -t utf-8 < "$f.recode.$$" > "$f" 
     rm -f "$f.recode.$$" 
done 

A continuación, utilice git filter-branch para ejecutar este script una y otra vez, una vez por cometer:

git filter-branch --tree-filter /tmp/recode-all-files HEAD 

donde /tmp/recode-all-files es el script anterior.

Inmediatamente después de que el repositorio se haya actualizado recientemente de CVS, es probable que solo tenga una rama en git con un historial lineal de nuevo. Si tiene varias ramas, puede necesitar mejorar el comando git filter-branch para editar todas las confirmaciones.

+0

¡Genial! Actualmente el comando se está ejecutando en un repositorio test git. De hecho, tengo muchas sucursales, acabo de consultar la documentación, ¿tengo que agregar '' --todos'' para filtrar todas las ramas? –

+0

Para todos los demás, '' git filter-branch --tree-filter/tmp/recode-all-files - --all'' filtra todas las ramas. –

+1

Estoy tratando de usar su respuesta pero recibo un comando recode-all-files: no encontrado. Estoy usando un mac, parece tener iconv instalado, no sé si tengo que establecer una configuración adicional en ese – marimaf

Cuestiones relacionadas