2010-11-12 15 views
17

Mi repositorio es SVN, y hago todo el desarrollo con git. Tenemos un diseño estándar, y yo inicializado mi repo local con git svn init -s <url to repo>¿Cómo sabe git-svn a qué rama comprometerse?

Aquí está mi flujo de trabajo para trabajar con ramas:

# creates a new branch remotely 
git svn branch new-branch-name 

# switches to a branch or trunk locally 
git reset --hard name-of-branch 
git reset --hard trunk 

# merge changes from trunk into a branch 
git reset —hard name-of-branch 
git merge trunk 
git svn dcommit 

Ese último comando anterior confirmar los cambios en la rama rama Nombre-del. Mi pregunta es, ¿cómo sabe esto? Cuando hago git reset --hard foo, ¿qué ocurre exactamente?

Esto podría reducirse a una pregunta general sobre git. Cada vez que trato de buscar una respuesta me confundo sobre si la integración svn es un caso especial o no.

Respuesta

11

git-svn buscará el árbol de commit para antepasados ​​que correspondan a las ramas SVN activas (las ramas refs/remotes/... que corresponden a las ramas en SVN). Luego se comprometerá con ellos.

Tenga en cuenta que no debe fusionar y luego comprometer - SVN y el modelo de bifurcación de Git no coinciden, y este tipo de cosas pueden fubar su historial de SVN. En su lugar, debe git rebase trunk cuando se encuentre en la sucursal. (Alternativamente, git svn rebase.)

Además, tenga en cuenta que la rama se echa un vistazo antes del rebase debe ser una sucursal local. Si no es así, puede crear uno con git checkout -b local-branch-to-create remote-branch. Entonces git rebase trunk.

Si desea comprimir todas las confirmaciones que se cambiaron a una, haga esto después de la rebase: git reset --soft trunk && git commit.

Una vez que esté satisfecho con los commits que ahora viven en la parte superior del trunk, solo git svn dcommit para enviarlos al servidor SVN.

+0

[1] "git-svn buscará en el árbol de commits las anotaciones de antecesor que correspondan a las ramas de SVN activas. Luego se comprometerá con ellas". - A veces adivina mal - ¿hay alguna manera de especificarlo explícitamente? [2] "este tipo de cosas pueden arruinar tu historial de SVN", por lo que la historia será unidireccional, pero la combinación de los archivos de código debería estar bien, ¿sí? –

+0

hmm, la página man dice que '--commit-url' debe usarse solo para cambiar el transporte, y" Usar esta opción para cualquier otro propósito (no preguntar) es muy desaconsejado ". –

+0

Si desea especificar una rama específica para comprometerse, simplemente vuelva a establecer la base de su rama de entidad en la parte superior de la rama remota correspondiente en su repositorio de Git. – cdhowie

2

¿No es tan simple como crear una sucursal local y rastrear una sucursal svn remota? Cuando haces un git svn init --stdlayout url-of-svn-repo, git baja todo el svn repo, lo comprime para que pueda funcionar con git.

Después de que es sólo una cuestión de hecho de hacer algo como:

git checkout -b mybranch -t remotes/mybranch 

Si usted tiene una rama local de seguimiento de una rama remota, git svn dcommit empuja solamente a la rama remota rastreado.

+3

Intenté esto y 'git svn dcommit -n' todavía dice que se va a comprometer con trunk en lugar de la rama que quiero –

+0

No es tan fácil:" Git descubre a qué rama van tus dcommits buscando la propina de cualquiera de sus ramas de Subversion en su historial; debería tener solo una, y debería ser la última con un git-svn-id en su historial de sucursal actual ". https://git-scm.com/book/es/v2/Git-and-Other-Systems-Git-as-a-Client#switching-active-branches-LPtGtkszIW – jgomo3

1

manera simple si desea dcommit master git en el tronco SVN, pruebe los siguientes comandos:

git checkout master 
git rebase trunk 
git svn info # To verify that you're on the right branch 
git svn dcommit 

Lo mismo cuando en la otra rama (por ejemplo, 6.x)

git checkout 6.x 
git rebase 6.x # or git rebase remotes/6.x 
git svn info 
git svn dcommit 
Cuestiones relacionadas