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 dcommit
master
, 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
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
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
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