2010-04-22 22 views
14

estoy leyendo sobre el uso de git como un cliente SVN aquí:¿Se requiere git svn rebase antes de git svn dcommit?

http://learn.github.com/p/git-svn.html

Esa página sugiere que haga svn git rebase antes dcommit git svn, que tiene mucho sentido; es como hacer svn update antes de hacer svn commit. Entonces, empecé a buscar en la documentación para dcommit git svn (Me preguntaba lo que la 'd' se trata):

http://git-scm.com/docs/git-svn

Usted tiene que desplazarse un poco para ver la documentación sobre dcommit, que dice esto:

Commit cada diff desde un cabezal especificado directamente al repositorio SVN, y luego reajustar o restablecer (dependiendo de si hay o no un diff entre SVN y cabeza).

Esto me confunde, porque si lo hace como dice la primera página, no habrá cambios para desplegar desde svn una vez que termine la primera parte de dcommit.

También estoy confundido por la parte que habla de reinicio; ¿no se ha reiniciado git para eliminar los cambios del área de preparación?

¿Por qué rebase o reinicie follow (la primera parte de) a dcommit?

Respuesta

19

responsabilidad: por lo general hago tienden a correr git svn rebase antes de hacer una git svn dcommit. Por lo general, guardo mis cambios en otra rama de git, para que la rebase no tenga ninguna posibilidad de fallar. Uso git rebase master en mi rama de tema para actualizarlo. Luego, cambio a la rama master y uso git merge para incorporar los cambios desde mi rama de tema a master (esto es un avance rápido debido a la rebase).

Mi explicación a continuación explica por qué esto no es mecánicamente necesario, pero estoy de acuerdo en que es una buena idea hacerlo. Sus cambios pueden no causar conflictos en términos de diferencias y fusión, pero si dcommit su código sin obtener los últimos cambios de svn y revisar sus efectos, podría estar cometiendo un código para svn que realmente no hace lo correcto.


Usted no tienen a git svn rebase antes de ejecutar git svn dcommit. Si las modificaciones que desea realizar son en archivos que no han cambiado en svn desde la última vez que se realizaron cambios, entonces git-svn no mostrará un conflicto. De esta forma, podría estar realizando cambios en un repositorio svn usando un repositorio git que no tiene todos los últimos cambios de svn.

Digamos que inicio un repositorio svn que contiene dos archivos, foo.txt y bar.txt. Solo tienen una única revisión hasta el momento. Hago un git svn clone para comenzar a rastrear el repositorio svn usando git.

 
$ git log --oneline --decorate 
7e72290 (git-svn, master) Initial commit. 

realiza cambios en foo.txt y git commit a su master rama local, por lo que se mueve por delante de git-svn.

 
$ git log --oneline --decorate 
aa70eca (master) Added a line to foo. 
7e72290 (git-svn) Initial commit. 

Lo que no se dio cuenta es que su amigo ya confirmaron cambios a bar.txt como la revisión SVN 2.

Ahora cuando se ejecuta desde git svn dcommitmaster, git buscará conjuntos de cambios entre el lugar donde se encuentra y donde git-svn dejó. En este caso, solo tiene uno: aa70eca. git intenta enviar ese diff a tu repositorio svn.

 
$ git svn dcommit 
Committing to [svn repo address] ... 
     M  foo.txt 
Committed r3 
     M  bar.txt 
r2 = 12b95b96e11f782f31b07a78756660cb82437ca2 (refs/remotes/git-svn) 
     M  foo.txt 
r3 = d4a7b84e0383f3af5fb0db439169c9f1b8af1152 (refs/remotes/git-svn) 
W: aa70ecae4121854ac3754fb882a483b67d706a4a and refs/remotes/git-svn differ, using rebase: 
:100644 100644 5771152459bfaa7cc62caa3b6b4d24e52ab8e447 dbfaecb10330d0509e092f1891a4a7e673802413 M  bar.txt 
First, rewinding head to replay your work on top of it... 
Nothing to do. 

$ git log --oneline --decorate 
d4a7b84 (git-svn, master) Added a line to foo. 
12b95b9 Added to bar. 
7e72290 Initial commit. 

Se puede ver que la confirmación tuvo éxito como la revisión SVN 3. Cuando git-svn entonces sincronizado su historial SVN local con el repositorio SVN, se fue a buscar todas las nuevas confirmaciones incluyendo el cambio que acaba de enviar a svn. Notarás que este cambio (d4a7b84) tiene un hash SHA diferente del que solías tener en git (aa70eca). Esto se debe a una variedad de cosas: diferentes sellos de tiempo de confirmación, nombres de autor potencialmente diferentes, el git-svn-id en el registro de la confirmación obtenida de svn, y ascendencia diferente — el svn r3 obtenido tiene r2 como padre, pero se ha descendido su confirmación de git de r1.

En este escenario, se encontró una diferencia después de ir a buscar entre la cabeza de git actual (master) y SVN, ya que el contenido en r2 cambió foo.txt. Como resultado, git-svn volverá a establecer la base.

Si hago un cambio y ningún otro svn commits ocurrieron mientras tanto (o que había estado funcionando git svn rebase para mantener al día), entonces git-svn no encontrará un diff entre la cabeza y SVN, por lo que sólo puede reiniciar:

 
$ git svn dcommit 
Committing to [svn repo address] ... 
     M  foo.txt 
Committed r4 
     M  foo.txt 
r4 = 533f7337999778628cf39fcd9155d085eb1c2b89 (refs/remotes/git-svn) 
No changes between current HEAD and refs/remotes/git-svn 
Resetting to the latest refs/remotes/git-svn 
+0

re git svn rebase no es necesario antes de "confirmar": al comprometerse, se refiere a git svn dcommit ¿verdad? Por separado, ¿quiere decir que nada se confundirá más tarde si presiono los cambios desde mi git local al svn remoto usando git svn dcommit asumiendo que no he tocado ningún archivo que haya cambiado en svn desde mi último git svn rebase? También estoy confundido acerca de una serie de cosas en su segundo párrafo. 1) ¿Hay algún punto en reimportar? 2) ¿Estás diciendo que has deducido esto del contenido de los mensajes de confirmación? – allyourcode

+0

3) ¿Qué quiere decir con "git-svn puede restablecerse al contenido obtenido de svn"? Pensé que el restablecimiento de git se usa para eliminar cambios del área de preparación; mientras que, parece que estás diciendo que restablecer cambia a qué revisión apunta la rama actual. 4) ¿Cómo podrían los cambios no ser empujados a svn después de hacer git svn dcommit? ¿Ese comando no empuja todos los cambios desde mi repositorio git local al repositorio svn remoto? – allyourcode

+0

He reescrito la mayor parte de mi respuesta para incluir ejemplos que deberían ilustrar por qué ir a buscar + rebase después de comprometer es crucial. Espero que tenga en cuenta los puntos 1 y 2. – MikeSep

Cuestiones relacionadas