2010-01-29 12 views
11

Entonces estoy usando git e interactuando con un repositorio svn.Usando git-svn para fusionar una rama svn de vuelta en el tronco y el tronco de nuevo en la rama

que tienen un tronco SVN que se parece a esto:

A-B-C-D 

Y un SVN bug_fixes rama que se ramifica a cometer B o C:

-c-d-e-f-g-h-i 

ahora tengo que conseguir el CDEFGHI compromete que están en mi rama svn en la rama principal.

Soy consciente de que podría hacer un commit aplastado, llamémoslo squash SQUASH (que contendría cdefghi), pero luego parece que tendría que eliminar la rama bug_fixes y comenzar una nueva rama para continuar limpiamente .

aquí: http://blog.red-bean.com/sussman/?p=92 Sugieren:

checkout la rama.

merge cambios principales en la rama.

Checkout el maestro.

merge --reintegrate la sucursal cambia a maestro.

Continuar con el desarrollo.

Desafortunadamente, git-svn no parece reconocer ningún comando "fusionar - reintegrar" para svn.

Entonces, ¿cómo hago para que branch y master tengan todos los commits, para que el desarrollo en ambos pueda continuar, usando los comandos de git-svn?

+0

lo que, básicamente, ninguna de las soluciones hacer una reintegración exacta, dejando toda la rama en conflicto si se lo sigue usando? – Quartz

+0

Francamente, mirando hacia atrás en esto, haría una de estas dos cosas: 1. Utilice un repositorio git sin svn. 2. Use un repositorio svn central, y realice todas las combinaciones y rebases en git, sin usar las ramas svn menos capaces. Si tuviera que compartir alguna rama, lo haría en un espejo git sin una rama principal y conservaría solo la rama principal en svn. Pero, en general, prescindiría de svn si fuera posible. – Kzqai

Respuesta

7

El Caveats section of the git-svn documentation advierte

En aras de la simplicidad y la interoperabilidad con un sistema menos capaces (SVN), se recomienda que todos los git svn usuarios clone, fetch y dcommit directamente desde el servidor SVN, y evitar todos git clone/pull/merge/push operaciones entre repositorios y ramas git.

El autor proporciona una recomendación:

El método recomendado para el intercambio de código entre las ramas git y usuarios es git format-patch y git am, o simplemente dcommit ing al repositorio SVN.

La adaptación a su situación

git format-patch --stdout c^..i >my.patch 
git reset --hard trunk 
git am <my.patch 

donde ci y son identificadores apropiados para las confirmaciones en su historia.

+0

Esto me permite aplicar todas las confirmaciones al tronco, pero no me permite seguir desarrollando en la rama. Desafortunadamente, dado que svn tiene un historial de revisión lineal, parece que el curso de acción recomendado es fusionar la rama en el tronco, luego eliminar la rama y crear uno con el mismo nombre. – Kzqai

1

¿No sería este un buen caso para volver a basar sus cosas locales (<branchpoint>..i) en el nuevo maestro obtenido de SVN?

+0

Eso funciona bien en git, pero no con el historial de revisión lineal de svn. De modo que puede obtener los cambios de la rama al tronco, pero el desarrollo continuo en la rama después es aparentemente inútil. – Kzqai

3

, por lo que un par de enfoques Ok que he encontrado:

git checkout your_branch 
git rebase master 
git checkout master 
git merge your_branch 

o

git checkout your_branch 
git rebase master 
git checkout master 
git merge --squash your_branch 

o

git checkout your_branch 
git rebase master 
git checkout master 
git rebase -i your_branch 

y después de todo eso.

git svn dcommit (to commit to master) 
git branch -D your_branch 

continuación (de SVN porque git-svn no admite eliminación) borrar la rama, y volver a crearla desde el tronco y comenzar el ciclo de nuevo.

+0

cómo obtener una sucursal de svn? está almacenado allí ... no en el repositorio local. – holms

+0

Creo que es solo una cuestión de "Git svn fetch" o algo así. http://www.kernel.org/pub/software/scm/git/docs/git-svn.html – Kzqai

+0

Creo que realmente deberías hacer un 'git svn rebase' en su lugar. Debe conservar un historial lineal de acuerdo con la documentación en https://git-scm.com/docs/git-svn#git-svn-emrebaseem – Paul

1

Si realiza una fusión, automáticamente la aplasta en 1 commit. Lamentablemente, no usa internamente svn: mergeinfo o --reintegrate como debería, por lo que pierdes la asociación con la rama creada a través de 'git svn branch'.

1

Lo que también se puede hacer es cereza recoger, siempre y cuando no se utilizaría de combinación.

Ambas declaraciones deben realizarse en la bifurcación sin los cambios.

Siempre que c sea mayor que yo y que quiera tomar toda la secuencia.

git cherry-pick c..i 

O confirmaciones separadas

git cherry-pick c d e f g h i 
Cuestiones relacionadas