Usando git para parchear regresiones
Hay varias razones primarias por las que git me parece lo más interesante en el espacio de DSCM (Decentralized Source Code Management):
- Su formato de almacenamiento está muy bien pensado. Sin las complicaciones teóricas que hacen daño a otros sistemas, compacto y flexible, con unas prestaciones excelentes.
- La detección heurística de copias y movimientos de archivos. Pedirle a los autores que marquen copias y movimientos no va a funcionar (metacrap), y sin duda no funcionará con la ingente cantidad de legacy (CVS sobre todo) que no puede marcarlo por limitaciones de formato. Su detección es buena, y nada impide incorporar esa metainformación al formato en el futuro, sujeta a auditoría autorial por personas.
- Las herramientas para hacer cosas en el cliente son muy buenas. Si bien tiene una curva de aprendizaje alta, estamos hablando de una herramienta para pofezionales, y no de algo que deba ser fácil de usar de entrada.
un ejemplo del último uso: el otro día encontré y reporté un bug trivial en python. Quise averiguar después de reportarlo en qué ramas de desarrollo estaba todavía presente, así que tuve que escribir la siguiente línea:
sgala@marlow ~/newcode/python.git (py3k)$ for i in $(git branch -a| sed -e "s/\*//"); do if git rev-parse --verify $i:Include/pymath.h >&/dev/null ;then PAGER= git grep doube $i:Include/pymath.h 2>/dev/null ; fi; done benjaminp-testing:Include/pymath.h:extern double copysign(doube, double); okkoto-sizeof:Include/pymath.h:extern double copysign(doube, double); py3k-ctypes-pep3118:Include/pymath.h:extern double copysign(doube, double); py3k-urllib:Include/pymath.h:extern double copysign(doube, double); tags/r26a3:Include/pymath.h:extern double copysign(doube, double); tags/r26b1:Include/pymath.h:extern double copysign(doube, double); tags/r26b2:Include/pymath.h:extern double copysign(doube, double); tags/r30a5:Include/pymath.h:extern double copysign(doube, double); tags/r30a5-real:Include/pymath.h:extern double copysign(doube, double); tags/r30a5-real@62867:Include/pymath.h:extern double copysign(doube, double); tags/r30b1:Include/pymath.h:extern double copysign(doube, double); tags/r30b2:Include/pymath.h:extern double copysign(doube, double); tlee-ast-optimize:Include/pymath.h:extern double copysign(doube, double); tnelson-trunk-bsddb-47-upgrade:Include/pymath.h:extern double copysign(doube, double); trunk-math:Include/pymath.h:extern double copysign(doube, double);
Lo que hace es: de todas las ramas del repositorio git branch -a| sed -e "s/\*//" ,
si en ellas está el archivo Include/pymath.h , es decir, si
git rev-parse --verify $i:Include/pymath.h >&/dev/null devuelve un código de retorno de no error,
imprime un grep de la string incorrecta PAGER= git grep doube $i:Include/pymath.h 2>/dev/null , sin errores.
En vez de ese simple comando, nada impediría mover la copia de trabajo a cada rama y probar un nuevo test, etc. Es esa gran flexibilidad, hija tanto de tener a mano todo el repositorio como de la gran eficiencia de gestión de la copia de trabajo, lo que más me gusta de su uso en el cliente. Y también la facilidad de uso de git log --stat -p --color -M -C para ver los cambios recientes, mucho mejor que intentar entender los correos que envían otros sistemas.
Mi productividad como depurador, que es casi sin duda el trabajo que mejor hago como desarrollador de software, el único en el que me consideran y me considero en la élite mundial, ha crecido tremendamente desde que tengo esa herramienta a mano. Así que ahora lo primero que hago cuando me enfrento a una base de código nueva es buscar un repositorio git o bien usar las herramientas adecuadas para crearlo.

Add your comment