tortoise - migrate svn to git with branches
Error dcommit de Git Svn-reinicie el commit (6)
Con mucho aprecio por la extraordinaria paciencia de VonC y sfassen conmigo, la solución se resolvió por sí sola. No sé cómo ni por qué, pero quizás mi rebase inicial no funcionó. Para arreglarlo terminé de rebasar de nuevo. De mi rama local de tronco:
$ git co -b backup # backup the commits to my local trunk
$ git co trunk # return to the local trunk
$ git svn rebase # rebase the trunk from the Svn server
$ git br -d backup # delete the backup branch
La clave, por supuesto, fue que la rebase funcionó esta vez. No tengo idea de por qué no funcionó la primera vez que lo hice, pero no puedo hacer retroceder el reloj para no detenerme en ello.
Gracias de nuevo por las sugerencias de todos y la paciencia con un novato.
La semana pasada, hice una serie de cambios en mi sucursal local antes de salir de la ciudad para el fin de semana. Esta mañana quise enviar todos esos cambios al repositorio de Svn de la compañía, pero tengo un conflicto de fusión en un archivo:
Fusionar conflicto durante la confirmación: su archivo o directorio ''build.properties.sample'' probablemente esté desactualizado: el recurso de la versión no corresponde al recurso dentro de la transacción. O bien el recurso de la versión solicitada está desactualizado (debe actualizarse), o el recurso de la versión solicitada es más nuevo que la raíz de la transacción (reinicie la confirmación).
No estoy seguro exactamente de por qué estoy recibiendo esto, pero antes de intentar dcommit, hice una rebase de git svn . Que "sobreescribió" mis comillas. Para recuperarme de eso, hice un reinicio de git - hard HEAD @ {1} . Ahora mi copia de trabajo parece estar donde espero que esté, pero no tengo idea de cómo superar el conflicto de fusión; No hay realmente ningún conflicto para resolver que pueda encontrar.
Cualquier pensamiento sería apreciado.
EDIT: Sólo quería especificar que estoy trabajando localmente. Tengo una rama local para el tronco que hace referencia a svn / trunk (la rama remota). Todo mi trabajo fue hecho en el baúl local:
$ git branch
maint-1.0.x
master
* trunk
$ git branch -r
svn/maintenance/my-project-1.0.0
svn/trunk
De manera similar, el registro de git actualmente muestra 10 confirmaciones en mi troncal local desde la última confirmación con una ID de Svn.
Esperemos que eso responda algunas preguntas.
Gracias de nuevo.
Debería haber creado una sucursal local, y haber realizado el trabajo en eso, luego, cuando regrese, actualice el maestro, vuelva a utilizar la sucursal local, fusione nuevamente con el maestro y luego comience.
Así que intentaría copiar los cambios, para respaldarlos.
Cree una rama local desde el punto de sincronización svn, fusione sus cambios allí. Luego, vuelva a realizar los cambios en la rama maestra, busque, vuelva a hacer la base de la rama, fusione desde la rama local, corrija los conflictos y luego comience.
$ git checkout -b backup # create a local backup branch with all your work
$ git checkout master
$ git checkout -b backup2 # 2nd copy just to be safe
$ git checkout master
$ git reset --hard <this is the revision of the last svn-id> # clean up master to make the svn merge easier
$ git svn fetch # this should update to the current version on the svn server
$ git rebase master backup # may get a conflict here, fix and commit
... # after conflict is fixed and commited
$ git checkout master
$ git merge backup --ff # merge in your local commits
$ git svn dcommit # push back to the svn
Puedes obtener información adicional here
Otra answer te pueda interesar.
git-svn articulos de flujo de trabajo
Iba a comentar, pero pensé que esto merecía más visibilidad ...
git svn rebase
debe reescribir tus confirmaciones. Por la descripción y los comentarios, tengo la impresión de que, después de que vuelvas a usar la base, has vuelto a colocar tus antiguos compromisos en la parte superior. Las confirmaciones deben reemplazarse con versiones más recientes que no entren en conflicto.
Para evitar tener que cavar a través del reflog, es posible que desee adquirir el hábito de hacer una etiqueta rápida antes de hacer su git svn dcommit
. Después de que dcommit tenga éxito, borre la etiqueta. Si la etiqueta falla, puedes hacer un git reset --hard
seguido de una git merge <tag>
. Vuelva a ejecutar su rebase para que su historial vuelva a estar en orden, vuelva a etiquetar y vuelva a enviar de nuevo.
Para completar la excelente respuesta de , aquí hay algunos detalles:
Con git-svn
, obtienes por defecto una rama local llamada master. No debe realizar ningún trabajo en él, solo mantenerlo actualizado con la rama de tronco svn con:
-
git svn fetch
para obtener el historial de la rama del tronco svn en su rama local del tronco: no aplicará esas modificaciones en su directorio de trabajo -
git checkout master
para activar la rama troncal (solo si estaba en otra rama) -
git rebase trunk
para sincronizar master con trunk.
Sin embargo, todas sus modificaciones deben realizarse en otra sucursal local (llamémoslo local-devel
).
-
git branch local-devel
-
git checkout local-devel
Si tiene una solución urgente que hacer:
-
git checkout master
: swith en master (), -
git svn fetch
&&git rebase trunk
para actualizarlo con svn trunk -
git branch fastfix && git checkout fastfix
,git branch fastfix && git checkout fastfix
- arreglar el error, compilar, probar,
-
git commit -a
: local commit, -
git svn dcommit
actualizar la modificación al repositorio svn distante -
git checkout master && git rebase trunk
: actualizar master nuevamente -
git branch -D fastfix
: elimina la rama de hotfix -
git checkout local-devel && git rebase master
: vuelve a dev, con el historial actualizado realizado en el master reproducido en tu rama dev
Es un poco molesto al principio, pero es mucho más cómodo que un svn diff
en un archivo que se aplicará más adelante.
Tuve una situación similar. Estaba haciendo un git svn dcommit
sobre una mala conexión de red y falló en algún momento. Descubrí que el problema se debió al hecho de que el repositorio de Subversion ya tenía un nuevo commit, pero la contraparte local de git-svn consideró que un commit todavía no estaba en SVN. Las soluciones de otras respuestas aquí no ayudaron, sin embargo esto sí:
git svn reset -r <last_svn_commit_git_was_aware_of>
git svn fetch
git svn rebase
Después de esto, finalmente pude hacer git svn dcommit
sin ningún error.
Varios lugares en los que he leído que es una mala práctica al usar git svn para usar una rama separada. Algo relacionado con git se compromete a no aparecer en svn de la manera que usted esperaría.
La siguiente respuesta de http://progit.org/book/ch8-1.html parece ser la forma más limpia:
git svn rebase
git svn dcommit
También probé la opción más popular de arriba, pero no siempre me funcionó, ya que el cambio de git no retrocede para coincidir con el svn en sentido ascendente, sino que se remonta a la última confirmación de git.