
madeja gay
Estoy usando git-svn
para trabajar contra el repositorio central de Subversion de mi empresa. Recientemente hemos creado una nueva rama de funciones en el repositorio central.
¿Cómo se lo digo a Git? cuando corro git branch -r
Solo puedo ver las ramas que existían cuando corrí fetch
contra el repositorio de Subversion para inicializar mi repositorio de Git?
Puede agregar manualmente la sucursal remota,
git config --add svn-remote.newbranch.url https://svn/path_to_newbranch/
git config --add svn-remote.newbranch.fetch :refs/remotes/newbranch
git svn fetch newbranch [-r<rev>]
git checkout -b local-newbranch -t newbranch
git svn rebase newbranch

janos
Si desea rastrear TODAS las sucursales remotas de svn, entonces la solución es tan simple como:
git svn fetch
Esto buscará TODAS las sucursales remotas que aún no se han obtenido.
Sugerencia adicional: si revisó solo el tronco al principio y luego desea rastrear TODAS las ramas, entonces edite .git/config
tener este aspecto y volver a ejecutar git svn fetch
:
[svn-remote "svn"]
url = https://svn/path_to_repo_root/
fetch = path_to_trunk:refs/remotes/git-svn
branches = path_to_branches/*:refs/remotes/*
Los puntos clave son url
debe apuntar a la raíz del repositorio, y las rutas definidas en fetch
y branches
debe ser relativo a url
.
Si desea obtener solo ramas específicas en lugar de TODAS, hay un buen ejemplo en git svn --help
:
[svn-remote "huge-project"]
url = http://server.org/svn
fetch = trunk/src:refs/remotes/trunk
branches = branches/{red,green}/src:refs/remotes/branches/*
tags = tags/{1.0,2.0}/src:refs/remotes/tags/*
Con versiones anteriores de git-svn
una vez que especificó sucursales como esta, es posible que no pueda obtener nuevas sucursales con git svn fetch
. Una solución es agregar más fetch
líneas, así:
[svn-remote "huge-project"]
url = http://server.org/svn
fetch = trunk/src:refs/remotes/trunk
fetch = branches/blue:refs/remotes/branches/blue
fetch = branches/yellow:refs/remotes/branches/yellow
branches = branches/{red,green}/src:refs/remotes/branches/*
Otra solución de @AndyEstes: editar .git/svn/.metadata
y cambiar el valor de branches-maxRev
o tags-maxRev
a una revisión antes de que se crearan ramas o etiquetas recién especificadas. Una vez que hayas hecho esto, ejecuta git svn fetch
para rastrear la nueva rama remota svn.
Parece que solo necesitaba git svn fetch
; de alguna manera me había convencido de que obtendría todo el repositorio en lugar de solo los cambios.

tyler
Tal vez lo arruiné de alguna manera, pero seguí las instrucciones en la respuesta de vjangus y casi trabajó. El único problema era que newbranch no parecía estar ramificado desde el tronco. En gitk, era una especie de “flotación” por sí solo; no tenía antepasado común con el tronco.
La solución a esto fue:
- Encuentre el SHA1 de la última confirmación que ocurrió en el tronco antes de que se creara la rama.
- Encuentre el SHA1 de la primera confirmación en la nueva rama (el mensaje probablemente sea “Nueva rama creada, copiada de trunk@12345” o algo así)
git diff-tree <sha1 from step 1> <sha1 from step 2>
— no debería haber salida. Si hay salida, es posible que haya seleccionado las confirmaciones incorrectas.
git checkout local-newbranch
luego git rebase <sha1 from step 1>
. Esto se rebase local-newbranch
en el nuevo árbol pero remotes/newbranch
seguirá estando desconectado.
- ir al archivo
.git/refs/remotes/newbranch
y edítelo para que contenga el SHA1 completo del nuevo commit (en el rebasado newbranch
) que corresponde a la confirmación anterior a la que apunta actualmente. (O tal vez usar git-update-ref refs/remotes/newbranch <new-SHA>
. Gracias Inger.)
- la próxima vez que
git svn dcommit
para newbranch
, recibirá un montón de mensajes sobre la actualización de algunos registros. Esto es normal, creo.
recomiendo mantener gitk --all
ábralo todo el tiempo y actualícelo con frecuencia para realizar un seguimiento de lo que está haciendo. Todavía soy algo nuevo en git y git svn, así que sugiera mejoras para este método.

gil hamilton
Una simplificación de la respuesta de vjangus:
Si está utilizando el diseño estándar en SVN y ha realizado el inicio habitual de svn, git-svn hará las cosas de configuración por usted. Sólo:
- Buscar revisión de copia de rama en SVN
- Obtener esa revisión con git-svn
- Crear un nuevo control remoto de seguimiento de sucursales locales
Un ejemplo. La URL del SVN es svn+ssh://gil@svn.myplace.com/repo
. La sucursal de SVN que estoy buscando es newbranch
. Rama local de git (seguimiento remoto newbranch
) sera git-newbranch
.
Paso 1: encuentre la revisión de copia de rama
# svn log --stop-on-copy svn+ssh://gil@svn.myplace.com/repo/branches/newbranch | tail -4
r7802 | someone | 2014-03-21 18:54:58 +0000 (Fri, 21 Mar 2014) | 1 line
branching HEAD to newbranch
------------------------------------------------------------------------
Entonces, el punto de bifurcación en SVN es la revisión 7802.
Paso 2: Obtener la revisión
# git svn fetch -r 7802
Found possible branch point: svn+ssh://gil@svn.myplace.com/repo/trunk => svn+ssh://gil@svn.myplace.com/repo/branches/newbranch, 7801
Found branch parent: (refs/remotes/trunk) 8dcf3c5793ff1a8a79dc94d268c91c2bf388894a
Following parent with do_switch
Successfully followed parent
r7802 = 9bbd4194041675ca5c9c6f3917e05ca5654a8a1e (refs/remotes/newbranch)
git-svn hizo todo el trabajo y ahora conoce el control remoto:
# git show-ref | grep newbranch
2df23af4733f36f5ad3c14cc1fa582ceeb3edb5c refs/remotes/newbranch
Paso 3: Cree su nueva sucursal local rastreando la remota:
# git checkout -b git-newbranch -t newbranch
Checking out files: 100% (413/413), done.
Branch git-newbranch set up to track local ref refs/remotes/newbranch.
Switched to a new branch 'git-newbranch'
No he encontrado ninguna documentación sobre esta función, pero parece que la configuración de git svn admite múltiples entradas de recuperación. De esta manera, también puede agregar sucursales por separado sin necesidad de agregar otra entrada de repositorio svn remoto a su configuración ni usar comodines para obtener todas las sucursales de cierto directorio.
Suponga que su árbol SVN es realmente desagradable al tener muchas ramas sin ninguna lógica de cómo están ubicadas, por ejemplo, tener ramas y subdirectorios que contienen más ramas.
es decir
trunk
branches
-> branch1
-> sub-dir1
-> branch2
-> branch3
-> sub-dir2
-> branch4
-> sub-dir3
-> branchX
<... hundreds more ...>
y solo desea elegir manualmente algunas de las ramas que se incluirán en su repositorio de git.
Primero puede iniciar su repositorio con solo troncal sin ramas adicionales:
git svn clone -r 10000:HEAD https://svn.com/MyRepo myrepo --prefix=svn/ --trunk=trunk
Después de eso, debería ver la siguiente configuración:
localhost: elhigu$ git config --get-regexp "svn-remote."
svn-remote.svn.url https://svn.com/MyRepo
svn-remote.svn.fetch trunk:refs/remotes/svn/trunk
cuando quiera obtener una nueva rama de MyRepo, simplemente puede agregar nuevas entradas de obtención a la configuración de la siguiente manera:
git config --add svn-remote.svn.fetch branches/sub-dir2/branch4:refs/remotes/svn/branches/sub-dir2/branch4
O puede editar la misma configuración en .git/config
Para obtener las nuevas ramas después de agregarlas a la configuración, simplemente ejecute:
git svn fetch -r 10000:HEAD
[Edit] A veces parece ser necesario ejecutar fetch con el parámetro –all para obtener ramas recién agregadas:
git svn fetch --all -r 10000:HEAD

vadishev
En lugar de lidiar con las peculiaridades de git-svn, puede intentar SubGit.
Uno tiene que instalar SubGit en el repositorio de Subversion. Después de eso, se puede usar el flujo de trabajo estándar de git en lugar de usar comandos especiales de git-svn:
-
Empujando nuevos compromisos:
git-svn:
$ git commit
$ git svn rebase
$ git svn dcommit
SubGit:
$ git commit
$ git push
-
Obtener cambios entrantes
git-svn:
$ git svn rebase
SubGit:
$ git pull [--rebase]
-
Creando una nueva sucursal:
git-svn:
$ git svn branch foo
$ git checkout -b foo -t remotes/foo
$ git commit
$ git svn dcommit
SubGit:
$ git checkout -b foo
$ git commit
$ git push
Ver Documentación SubGit para más detalles.
Las respuestas de aquí: stackoverflow.com/questions/13376917/… también pueden ser útiles.
– Tomasz Gandor
27 de junio de 2016 a las 10:06