2009-07-16 13 views
32

Estoy viendo git svn fetch recuperando repetidamente las mismas revisiones de Subversion cuando encuentra ramas en mi repositorio de Subversion. Somos utilizando el diseño del repositorio estándar de Subversion, con los directorios de nivel superior /trunk,/tags y/branches (y el repositorio de git fue creado con 'git svn init -s'). Sin embargo, las ramas problemáticas son a menudo copias hechas desde un subdirectorio dentro del tronco, en lugar del tronco .git svn fetch recupera la misma revisión de Subversion varias veces para las ramas

El svn git fetch de salida normalmente se ve algo como esto:

 
r2537 = d5b22e956157af036d4112e42e8fb927e45758c8 (trunk) 
     M  Enterprise/VC/libgc/SymbolVenue.cpp 
r2538 = cfed4ca0491da0b732f32bfff72ba678450a0915 (trunk) 
Found possible branch point: http://repo/prod_repos/trunk/Enterprise/VC => http://repo/prod_repos/branches/file_conversion, 2523 
W: Refspec glob conflict (ref: refs/remotes/[email protected]): 
expected path: branches/[email protected] 
    real path: trunk/Enterprise/Python 
Continuing ahead with trunk/Enterprise/Python 
W: Refspec glob conflict (ref: refs/remotes/trunk): 
expected path: branches/trunk 
    real path: trunk 
Continuing ahead with trunk 
Initializing parent: [email protected] 
     A  gc/QuoteService.cpp 
     A  gc/TestSuite.h 
     A  gc/quote_svc.pro 
     A  gc/QuoteService.h 
..... 

r1 = d349ed8cb2d76596fe2b83224986275be4600fad ([email protected]) 
     D  gc/FixMessageLogger.h 
..... 
r5 = 
r19 = 
r20 = 
..... 

Y estamos de vuelta en la revisión 1. svn git fetch continuación continúa trayendo revisiones hasta que llegue a la revisión que creó la rama.

¿Qué estoy haciendo mal? ¿Hay alguna forma de que le diga a git svn fetch a que no recupere las revisiones que ya ha sacado?

+0

Buena pregunta (+1). Eso me pasa a mí también, y parece una pérdida de tiempo. –

+0

Blame SVN, que almacena sucursales esencialmente como copias del repositorio ;-) Un poco de la historia y el funcionamiento interno es dada por David Wheeler en http://www.dwheeler.com/essays/scm.html – vonbrand

Respuesta

64

me di cuenta de esta pregunta porque me dieron el mismo mensaje de error:

W: Refspec glob conflict (ref: refs/remotes/trunk): 
expected path: branches/trunk 
    real path: trunk 

Resultó que .git/config tenía líneas duplicadas que parecen confundir git-svn, así:

[svn-remote "svn"] 
... 
    branches = project/branches/*:refs/remotes/* 
    tags = project/tags/*:refs/remotes/tags/* 
    branches = project/branches/*:refs/remotes/* 
    tags = project/tags/*:refs/remotes/tags/* 

Eliminar esos duplicados resolvió el comportamiento extraño de git-svn para mí, y podría ser así para usted. No estoy seguro de qué causó que git-svn duplicara esta información en primer lugar. Maté y continué el clon inicial, ¿esto podría estar relacionado?

+4

Tuve este problema también. Y también maté al clon inicial y lo reinicié. Parece que probablemente sea la causa ... –

+1

Hmm. Tenía los mismos listados duplicados en mi .git/config, pero incluso después de parar, eliminar los duplicados y volver a iniciar, el problema sigue presente. :( –

+3

El problema en mi caso, al menos, no es una entrada duplicada en el svn-remote. El problema es un poco más fundamental para la arquitectura de git-svn. En resumen, git svn no rastrea el directorio o archivo cambia el nombre, lo que significa que tiene que volver a buscar la historia. Eric Wong, el autor de git svn, tiene una mejor descripción [aquí] (http://osdir.com/ml/git/2009-07/msg01665.html) – razeh

2

git-svn parece estar haciendo repetidamente las mismas revisiones porque tiene etiquetas en su repositorio SVN. El concepto SVN de una etiqueta es ligeramente diferente de git: SVN tags are actually branches (por lo tanto, SVN tags are copies).

Tome una mirada más cercana a su salida:

r1 = d349ed8cb2d76596fe2b83224986275be4600fad ([email protected])

Aunque la revisión r1 = parece demasiado familiar, el resto del texto, probablemente difiere. Como mínimo, el nombre de la etiqueta (en este caso [email protected]) no será el mismo.

Creo que la única manera de evitar esto es haciendo que git-svn omita las etiquetas SVN. Si no puede vivir sin las etiquetas, también puede convert the SVN 'tag' branches to real git tags (pero hay que ir a buscar todas las ramas de la etiqueta, en primer lugar!)


Un SO pregunta relacionada con posibles soluciones temporales: Can Git-svn be used on large, branched repositories?

Algunos comentarios sobre este tema: git-svn --tags should at least /try/ to handle tags as tags.

9

Eliminar duplicados todavía creaba un problema para mí. Cada vez que vuelva a ejecutar su comando de clonación, p. git svn clon svn: //.../svnroot --no-metadata -A authors-transform.txt --stdlayout. Añade dos líneas más a.git/config. tuve que quitar todas las líneas que contienen ramas = ramas/: refs/mandos a distancia/ y tags = Etiquetas/: refs/mandos a distancia/tags/

Dejando config pareciendo a continuación:

[core] 
     repositoryformatversion = 0 
     filemode = true 
     bare = false 
     logallrefupdates = true 
[svn-remote "svn"] 
     noMetadata = 1 
     url = svn://.../svnroot 
     fetch = trunk:refs/remotes/trunk 
[svn] 
     authorsfile = /home/users/denn/authors-transform.txt 
~ 
+0

confirmo esta solución yo mismo . Gracias por compartir –

2

Si, en algún momento, el enlace troncal de su repositorio existió en una ubicación diferente en SVN, intente especificar esta ubicación para obtener adicionalmente el archivo de configuración del repositorio. Por ejemplo:

[svn-remote "svn"] 
... 
    fetch = project/trunk:refs/remotes/origin/trunk 
    fetch = previous/location/of/trunk:refs/remotes/origin/trunk-old1 
    fetch = another/location/of/trunk:refs/remotes/origin/trunk-old2 
    ... 

Para el proyecto que estaba importando, había muchas ramas y etiquetas que se habían creado a partir de estas ubicaciones anteriores. Como se trata de ramas/etiquetas creadas a partir de un lugar "desconocido", git svn estaba levantando las manos y buscando todo el historial para averiguarlo. (Este enfoque aún requería una búsqueda completa para cada ubicación, pero eso era MUCHO más rápido que una búsqueda de historial completo para cada etiqueta)

Cuestiones relacionadas