[eside-ghost] git svn y diferencias remotas

Yuki (aka Rubén Gómez) rugoli en gmail.com
Vie Sep 7 09:31:28 CEST 2012


2012/9/7 Txus Ordorika <txusinho en gmail.com>:
>> Cuando haces el fetch, él solo te debería crear la rama (una rama con
>> el fetch del subversion, y la otra donde has hecho el commit). Si que
>> puedes crear una rama para tu desarrollo, pero no es necesario...
>
> Pero cuando hago el fetch remoto me sobreescribe. O te refieres a que
> puedo comparar las dos versiones? (la del fetch del svn y la anterior
> que tengo en desarrollo)
Te sobrescribe? Yo la prueba que hice ayer no me lo hacía. La vuelvo a
hacer, y estos son los pasos:

1- Tengo el git local sincronizado con el subversion:
   git svn rebase
   Current branch master is up to date.

2- Hago commit local:
    echo "bla bla bla" > fichero
    git add fichero
    git commit -a -m "prueba"

3- compruebo el estado de la rama:
    git lg
   * 0a3b003 - (HEAD, master) prueba 89 seconds ago Rubén Gómez
<--- mi parte de desarrollo
   * 8033526 - (trunk) modificaciones nuevas 17 hours ago rgomez
<--- lo que está comiteado en el subversion

4- Hago commit en el subversion:
    svn add fichero2
    svn ci -m "desde el subversion"

5- No puedo/sé hacer diff contra el subversion remoto, así que hago
fetch (no un rebase!!!!) y veo qué pasa:
    git svn fetch
	A	fichero2
        r65 = c6ffeaed3763c8272a60cc165b575708a3555f25 (refs/remotes/trunk)

   git lg
    * c6ffeae - (trunk) desde el subversion 6 minutes ago rgomez
<---- Lo que hay en el subversion ahora, al hacer el fetch se
actualiza
    | * 0a3b003 - (HEAD, master) prueba 13 minutes ago Rubén Gómez
<--- Commit local del GIT (al haber hecho el "git fetch" git me crea
una rama para no mezclar los commits del subversion con lo mío en
local)
    |/
    * 8033526 - modificaciones nuevas 17 hours ago rgomez     <---
antiguo commit del subversion

6 - Puedo hacer diff entre donde la rama local (donde tengo un commit
local) contra lo que hay en el subversion.
    git diff trunk

7- Ahora ya hago un rebase de mi commit a la rama del subversion para
luego hacer un dcommit al subversion... o puedo hacer un cherry-pick
del commit del git y meterlo en la rama trunk o lo que se me ocurra...


Si en vez de hacer en el paso 5 un fetch hago un rebase:
   git svn rebase
	A	fiechero3       <--- fichero nuevo comiteado en subversion
        r66 = 1c4348a0b08bd5634229782a76fcaf36eeb75d97 (refs/remotes/trunk)
        First, rewinding head to replay your work on top of it...
        Applying: prueba 2  <---- el nuevo commit que había hecho en git

Vale, ahora ya me acuerdo. Cuando haces un "git svn rebase" lo que
pasa es que hace lo siguiente:
1- Hace un "git fetch" por debajo para descargarse los commits del
subversion (primera línea donde se baja el fichero3)
2- A cada commit del subversion le aplica la magia GIT para que tenga
su hash y demás historias
3- Quita todos los commits locales de nuestro espacio de trabajo git
hasta dejarlo como el subversion en su revisión (por eso hace el
"rewinding")
4- Aplica todos los commits locales sobre la rama ya actualizada:

Si yo ahora hago un "git lg":
* ab5434b - (HEAD, master) prueba 2 5 minutes ago Rubén Gómez   <--
el nuevo commit que había hecho en git
* 1c4348a - (trunk) fichero3 de prueba  6 minutes ago rgomez   <---
último commit del subversion

Las diferencias? Pues pocas, pero igual te gusta más una que otra. Con
"git svn fetch" tienes una rama aparte con el subversion y otra con
tus commits locales, con todo lo que eso te aporta. Con "git svn
rebase", cada vez que lo hagas, si alguien ha tocado los mismos
ficheros que tu has commiteado en local puede que tengas conflictos,
que tendrás que resolver en local. Lo bueno de esto último es que al
final no vas a tener que mirar los conflictos en el último momento, si
no que cada vez que hagas rebase lo vas a ir viendo.

Creo que tu estabas haciendo un "git svn rebase" siempre. Para gustos
los colores ;-)  Yo no he usado mucho git, pero tiene mil maneras de
trabajar, y alternativas para hacer lo mismo... Si no tienes las cosas
comiteadas en local, podrías tirar de "git stash"... O lo que te he
puesto antes de usar "git cherry-pick" en lugar del rebase...

> Quiero un diff entre lo que hay en subversion (remoto) y el último
> commit que tengo en el git (local), pero sin que me lo descargue a
> local y me machaque el último commit que tengo hecho.
Uhmmm, pues que yo sepa eso no se puede hacer, porque creo que GIT
necesita tener todo en local. Aquí comentan lo mismo
http://stackoverflow.com/questions/231211/using-git-how-do-i-find-modified-files-between-local-and-remote


Más información sobre la lista de distribución eside-ghost