2012-07-06 6 views
19

Utilicé el siguiente comando para clonar svn repo en git y luego de ejecutarlo, veo algunas ramas espurias.git-svn clon | ramas espurias

git svn clone [SVN repo URL] --no-metadata -A authors-transform.txt --stdlayout ~/temp

git branch -a

*(no branch) 
    master 
    remotes/abc-1.3.x 
    remotes/[email protected] 
    remotes/[email protected] 
    remotes/branch_test_script 
    remotes/tags/modules-1.2 
    remotes/tags/[email protected] 
    remotes/tags/[email protected] 
    remotes/tags/release-1.1 
    remotes/tags/[email protected] 
    remotes/tags/[email protected] 
    remotes/trunk 

ramas reales creados en svn eran abc, branch_test_script, módulos y liberación. ¿Alguien puede ayudar a entender qué son '[email protected]', '[email protected]' ... '[email protected]' etc.?

¿Cómo podemos deshacernos de estas ramas espurias/qué significan?

Gracias,
Gayathri

+0

Me es muy difícil encontrar de dónde vino este nombre, pero parece que estas ramas se crean a partir de confirmaciones SVN que ya no se referenciaron por la rama svn (o etiqueta) en la que se crearon originalmente. Al igual que las confirmaciones sin referencia en Git, excepto que fue posible recuperar el nombre de la rama para la confirmación. – fork0

+0

@ fork0: Gracias por la respuesta. Pero no entiendo claramente cómo las confirmaciones sin referencia pueden estar presentes en svn. ¿Cómo se pueden perder referencias? ¿Puedes compartir tus pensamientos sobre esto? – crankparty

+0

No lo sé. Quizás el mantenedor del repositorio SVN nunca los limpió (¿o SVN no tiene la capacidad en absoluto?). No quise decir que las referencias se perdieron, sino que alguien acaba de comprometerse desde un punto anterior en la historia. – fork0

Respuesta

15

tl; dr:

git svn crea estos "@" - ramas Si se creó una rama (o etiqueta) para un subdirectorio (o para otro directorio que no se realiza un seguimiento por git-svn). También siempre habrá una rama "regular" con el mismo nombre, pero sin el sufijo "@". La rama "@" solo existe como un punto de ramificación para la rama regular.


Nota: Envié un parche para esto; una versión editada de esta explicación es ahora parte de la página de manual oficial git svn, como una nueva sección "MANIPULACIÓN DE SUCURSALES SVN" (desde Git 1.8.1).


En Subversion, ramas y las etiquetas son sólo copias de un árbol de directorios, por lo que es posible (aunque por lo general desalienta) para crear una rama de un directorio que no es en sí una rama (o tronco) es. Por ejemplo, copiando/trunk/foo a/branches/bar, en lugar de copiar/trunk (una "subdirectoría branch", por así decirlo), o copiando un directorio que se encuentra fuera de la estructura trunk/tags/branches (que es posible en SVN).

En git, sin embargo, una bifurcación es siempre para todo el repositorio, las ramas del subdirectorio no existen. git svn por lo tanto, utiliza una solución alternativa. Si detecta una rama que fue copiada de un directorio que no es rastreado como una rama por git-svn, creará un nuevo historial. Por ejemplo, para una rama de directorios en/trunk/foo se copia a/ramas/bar en la revisión 1234, se creará:

  • Un nuevo git commit para cada revisión SVN r1233 al revés (tenga en cuenta el número es el última revisión antes de que se creara la sucursal). Los árboles de estos commits solo contendrán el subdirectorio ramificado. Por lo tanto, para cada revisión desde r1233 hacia atrás, normalmente habrá dos commits de git, uno con el árbol completo (creado cuando git-svn procesó el historial de trunk) y los nuevos.
  • Una rama ficticia llamada "bar @ 1233" (nombre de rama @ revisión), que apunta a la confirmación creada a partir del r1233 anterior.
  • Una confirmación de r1234, la confirmación que creó la rama. Este compromiso tendrá la rama anterior como su (único) antecesor.
  • Una rama llamada "barra", que apunta a la segunda confirmación.

De este modo, para la barra rama subdirectorio, se obtienen dos sucursales en git

  • bar a 1233, lo que representa el estado del repositorio que la rama fue creada a partir
  • bar, que representa la rama

No estoy muy seguro de por qué se crea esta rama ficticia. Creo que se hace para representar la información acerca de la revisión desde la cual se ramificó la sucursal, y para tener un historial completo de la sucursal.


Tenga en cuenta que todo este mecanismo se puede desconectar mediante el uso de la bandera --no-follow-parent. En ese caso, cada rama SVN dará como resultado una rama git con solo las confirmaciones del directorio de ramas SVN. Cada rama estará desconectada al resto de la historia y tendrá su propia confirmación raíz, correspondiente a la primera confirmación en la rama.

3

tuve tales extrañamente llamados ramas demasiado cuando clonado mi repositorio SVN en un repositorio git.

Después de revisar las ramas esperados (en su caso modules-1.2, abc-1.3.x, branch_test_script y release-1.1) me di cuenta de que los @revisionnumber ramas son otra cosa que se compromete en sus ramas prefijadas.

Si desea hacerlo de forma manual, abierta en la rama gitkabc-1.3.x y verificar que [email protected][email protected] y aparecer en la historia de esa rama. De ser así, podría eliminar la rama respectiva.

Esto podría ser un poco engorroso si tiene muchas ramas o muchos compromisos para examinar.

manera automática: pedir a Git que lo haga por usted:

git branch -r --contains [email protected] 

hará eco (o al menos debe)

abc-1.3.x 
[email protected] 
[email protected] 

Esto significa que se puede eliminar de forma segura [email protected] porque se encuentra en abc-1.3.x:

git branch -r -d [email protected] 

Debido a la historia lineal de SVN, por supuesto también lo contiene la confirmación (más reciente) 541512.


Nota al margen:
Usted puede haber notado que las etiquetas SVN en realidad no son convertidas a etiquetas y ramas Git Git nativos. Esto podría lograrse usando svn2git para clonar el repositorio SVN en un repositorio Git.

+0

¿Cómo eliminar estas ramas? ¿Hay algún parámetro que se pueda pasar a git para ignorar dichos commits y no crear branches? – crankparty

+0

Como escribí: las ramas podrían eliminarse usando 'git branch -r -d '. No creo que haya una bandera para lograr que las ramas no se creen. – eckes

+1

'git-svn' podría crear estas ramas" @ "innecesariamente, pero hay un caso importante en el que' abc @ 113346' es ** no ** antecesor de 'abc'. Eso sucede si la rama se elimina en subversión y luego se vuelve a crear copiando desde otro punto. Además, el hecho de que 'abc @ 113346' sea un antecesor de' abc' no significa que esto no haya ocurrido, podría significar que 'abc' se fusionó con trunk, eliminado (en alguna revisión más alta que 113346) y una nueva uno creado en su lugar desde el tronco. –