with tortoise migrar branches git git-svn

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

Article


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.