Pues eso, posiblemente no sea la mejor manera, pero funciona.
Muchas veces nos volvemos locos con el SCM olvidando que es una herramienta para obtener un objetivo.
Subversion ya no mola, pero aunque no mole sigue funcionando bien y en muchas empresas. Git, Mercurial y otros SCM tienen funcionalidades añadidas que facilitan la vida al desarrollador, así que ¿por qué no usar ambos?
Cambiar de sistema de control de versiones es [muy] difícil. Por un lado la gente debería acostumbrarse, habría que migrar todo los proyectos, configurar los servidores, permisos, fallitos, ñapas varias... uff.
Existen otros SCM distribuídos, mercurial, bazaar, plastic SCM... git tiene buena documentación (ver links al final de la presentación) y se integra con subversion a las mil maravillas. Mercurial es más simple de entender para alguien que viene de Subversion, pero la integración con svn no es tan buena, por lo menos a día de hoy.
Dicho de otra forma, en vez de tener un repositorio central donde están alojadas todas las versiones, ahora tenemos en nuestra máquina todo el repositorio. En concreto en Git el repositorio se aloja en la carpeta especial .git
versiones va en cursiva por que el propio Linus, creador de git, dice; "it's content-addressable, and it has a notion of versioning,"
Comandos básicos:
1 $ git init
2 Initialized empty Git repository in /Users/javi/tmp/repo/.git/
3 $ echo 'python FTW' > file
4 $ git add file
5 $ git ci -m "1st commit"
6 [master (root-commit) a9270d1] 1st commit
7 1 files changed, 1 insertions(+), 0 deletions(-)
8 create mode 100644 file
Hay que tener cuidado, porque aunque algunos de los comandos se llaman igual pero no hacen lo mismo, por ejemplo revert.
http://svnbook.red-bean.com/nightly/en/svn-book.html fuente de la imagen
Hasta ahora siempre hemos trabajado con un repositorio, normalmente alojado en un servidor, nos bajamos el código, trabajamos sobre él y subimos.
http://progit.org/book/ch5-1.html
Con git podemos sincronizar con otros repositorios, no necesariamente debe haber uno central, aunque podemos trabajar en local sin problema, esto es, hacer commits, crear ramas, etc. Además el workflow es más variado ya que permite además de trabajar con el modelo cliente servidor de toda la vida, trabajar en repositorios intermedios, con repositorios de gente que integra.
Podría tener otra estructura, git-svn se adapta perfectamente
git-core y git-svn son los paquetes para ubuntu, en cada plataforma cada uno se las apañe para instalar git.
Seguro que hay otros clientes gráficos, como git-tower, pero no los he usado.
Comandos teniendo en cuenta que no haya conflictos:
1 $ svn checkout https://svn/trunk
2 $ cd trunk
3 $ vim file.py
4 hack hack hack
5 $ svn up # sin conflictos
6 $ svn commit -m "epic win feature, refs #1337"
Comandos:
1 $ git svn init -s https://svn/ # inicializa el repositorio git
2 $ git svn fetch # baja tooodas las revisiones
Aquí git se baja todo el repositorio, esto es, todas y cada una de las revisiones en local. Cabe la posibilidad de no bajar todo, ver las opciones del comando git-svn init. También es posible hacer git svn clone directamente.
Si solo quisiesemos bajar una parte del repositorio sería posible usando la URL a la carpeta en cuestión, de la misma forma que con subversion podemos solo bajar una parte del repositorio (mini punto para subversion).
Comandos:
1 $ vim file.py
2 hack
3 $ git add file.py
4 $ git commit -m "refactoring"
5 hack
6 $ git add file.py
7 $ git commit -m "improved function"
En git hay una fase intermedia entre los cambios que hacemos y el repositorio local, se llama staging area y ahí debemos aculumar los cambios que queramos almacenar en el siguiente changeset.
Comandos:
1 $ git svn rebase
El rebase hace la siguiente operación: - deshace los commits locales - baja la rama subversion y aplica sus cambios - re-aplica los cambios de nuevo. Sí, puede surgir conflictos
Ahora git tiene una rama remota que apunta al repositorio subversion, a la rama trunk, de forma que debe bajarse esa rama (puedes hacerlo con git svn fetch) y "mezclarla" con los cambios locales.
Comandos:
1 $ git svn dcommit
Ahora master está sincronizada con la rama trunk
Push se usa cuando queremos enviar los cambios a un repositorio externo nativo git.
Comandos:
1 $ git svn branch -m "bugfix" bug_1234
2 $ git checkout -b local/bug_1234 bug_1234
La rama no debe llamarse igual ni tener el prefijo local, se puede usar el esquema que se quiera.
Toda la versatilidad que da git la podemos aplicar sin problemas, siempre teniendo en mente que el resultado debe ir al repositorio subversion.
Creo que mi salud mental ha mejorado (o dejado de empeorar) enteros no teniendo esos larguiiiísimas esperas.
.note: bug en landslide
A mi me gusta hacer commit en cuanto tengo lo minimo funcional