2010-08-31 12 views
9

Estoy usando git-svn para rastrear múltiples ramas en el mismo repositorio svn. Por lo general, esto funciona bien, pero hoy he hecho algunos restablecimientos y rebases, y de repente mis ramas no sería dcommit a la rama remota derecho más:¿Cómo determina git svn dcommit a dónde comprometerse?

$ git branch 
* master 
    a 
    b 

$ git svn dcommit -n 
Committing to svn://server/repo/trunk ... 

$ git checkout a 
$ git svn dcommit -n 
Committing to svn://server/repo/branches/a ... 

$ git checkout b 
$ git svn dcommit -n 
Committing to svn://server/repo/branches/a ... 

Así la rama B se comprometerían a las ramas/un directorio en lugar del directorio branches/b

He intentado cambiar la rama que se realiza un seguimiento:

$ git branch --set-upstream b remotes/b 

y otras cosas, pero la única solución que funcionó fue eliminar la rama B y volver a crearla:

$ git branch -D b 
$ git branch b remotes/b 
$ git svn dcommit -n 
Committing to svn://server/repo/branches/b ... 

Ahora mi pregunta es: ¿cómo svg sv determinar a qué directorio comprometerse? ¿Y cómo modifico este directorio?

Gracias,
Jonas

+0

http://stackoverflow.com/questions/1319319/git-svn-isnt-committing-to-branches-only-trunk – cmcginty

+1

Acepte una respuesta –

Respuesta

5

La configuración SVN que busca está en el archivo .git/config de su repositorio clonado. Se puede manipular con un editor de texto. Aquí hay un ejemplo:

$ cat .git/config   
[core] 
    repositoryformatversion = 0 
    filemode = true 
    bare = false 
    logallrefupdates = true 
    ignorecase = true 
[svn-remote "svn"] 
    url = https://pdfsam.svn.sourceforge.net/svnroot/pdfsam 
    fetch = trunk:refs/remotes/trunk 
    branches = branches/*:refs/remotes/* 
    tags = tags/*:refs/remotes/tags/* 

Se supone que las ramas coinciden nombre por nombre de forma predeterminada. Para el seguimiento de un nombre de la sucursal no coinciden, o bien cambiar el nombre de la sucursal local o agregar una configuración explícita (a distancia) para la rama extraño nombre-:

[svn-remote "weirdbranch"] 
    url = svn+ssh://ambientideas.com/svnrepos/myproject/branches/myweirdbranch 
    fetch = :refs/remotes/git-svn-myweirdbranchlocalname 

Además, si la realización de Git se funde de las ramas de múltiples repositorios SVN, el dcommit se (lógicamente, pero confunde a los usuarios nuevos) se dirige a la URL SVN del primer padre de commit de fusión. La documentación de Git indica que "git svn dcommit intentará confirmar en la parte superior de la confirmación SVN nombrada en git log --grep=^git-svn-id: --first-parent -1"

Si se reescribe una rama SVN contra otra, esto significa que las confirmaciones "más recientes" (la rama subordinada) serán las objetivo del dcommit. Con frecuencia, el usuario desea apuntar al repositorio SVN dominante (sucursal). Esto requiere que el usuario use la opción --no-ff al volver a establecer la base para garantizar los últimos puntos de confirmación en la rama dominante (nuevos commits seleccionados).

Otras preguntas StackOverflow relevantes incluyen:

+0

Gracias, eso es información valiosa de hecho! También encontré que git asignará una rama X a la rama remota R si cree que X está basada en R. Entonces, al volver a establecer X en R, podría forzar a git a comprometerse en la rama remota derecha. –

0

Mi problema con git svn fue similar.Mi estructura de las ramas era jerárquica de esta manera:

svn/projectX/branches/ 
svn/projectX/branches/Android 
svn/projectX/branches/Android/dev-shared 

Seguí primera instrucciones y ejemplos en el manual git-svn:

https://www.kernel.org/pub/software/scm/git/docs/git-svn.html

y clonado mi baúl usando:

git svn clone -s --prefix=svn/ https://mw.com/svn/projectX -T trunk -t tags -b branches/Android 

I luego revisé las ramas/Android/dev-shared branch y realicé cambios y los envié a mi sucursal local de git. Luego probé "git svn dcommit -n" para ver qué haría sin comprometerme.

Vi que estaba intentando comprometer mi branch commits al trunk en svn.

ME alegro de haber utilizado la opción "-n" y evité comprometerme con el lugar equivocado.

Después de mucha investigación el mejor recurso que encontré fue:

http://www.janosgyerik.com/practical-tips-for-using-git-with-large-subversion-repositories/

La solución se sugirió fue a la comprobación por primera vez un nuevo clon de SVN usando:

git svn clone http://me.com/projectX/trunk projectX 

y después editar manualmente el Archivo .git \ config para agregar entradas de recuperación adicionales para cada una de mis ramas en las que quería trabajar:

[svn-remote "svn"] 
    url = https://me.com/svn/projectX 
    fetch = trunk:refs/remotes/svn/trunk 
    fetch = branches/Android/dev-shared:refs/remotes/svn/branches/Android/dev-shared 

Luego, cuando reintenté "git svn dcommit -n", ahora me estaba comprometiendo con la rama correcta "branches/Android/dev-shared".

Cuestiones relacionadas