2011-04-18 8 views
7

Tengo algo de reescritura de la historia para hacer, por lo que me gustaría mantener mi árbol original intacto por el momento. Sin embargo, el árbol reescrito también debe copiar las etiquetas previamente utilizadas. ¿Hay alguna opción manual menos que, por ejemplo, anteponiendo nombres de etiqueta con el nombre de la rama?git: ¿Hay algo así como etiquetas por rama?

Respuesta

14

No, no hay nada como una etiqueta por rama en git. Todas las ramas y etiquetas son solo tipos de referencias en Git; una referencia es solo un nombre que apunta a una revisión particular en el historial de revisión. Por ejemplo, si usted tiene devel y master ramas y v1.0 y v2.0 etiquetas, las referencias se vería algo como esto:

 
refs/heads/devel -> * 
        /\ 
        * * <- refs/heads/master 
        | | 
        * * 
        \/
        * <- refs/tags/v2.0 
        | 
        * 
        | 
        * <- refs/tags/v1.0 
        | 
        * 

Como se puede ver, no hay nada atado esas etiquetas a las ramas; de hecho, todas esas etiquetas están contenidas en las ramas master y devel. Al mirar dentro de su repositorio .git, puede ver que realmente no hay más estructura para una etiqueta que eso; es solo un archivo que contiene un SHA-1 que hace referencia a una confirmación dentro de .git/refs, o una línea en .git/packed-refs (las etiquetas estarán frecuentemente en packed-refs porque no cambian con frecuencia, mientras que las ramas generalmente serán archivos separados dentro de git/refs).

Por lo tanto, si desea reescribir el historial y conservar las etiquetas antiguas, deberá volver a escribir los nombres de las etiquetas. Como lo señala Sehe, esto se hace usando git filter-branch --tag-name-filter.

+2

... que luego se hecho con 'git filter-branch ..... --tag-name-filter cat' – sehe

+0

@sehe: gracias, eso me recuerda mejorar [este script] (http://stackoverflow.com/questions/4278264/git -split-history-of-some-files-into-a-separate-branch/4283970 # 4283970) –

1

Puede namespace una etiqueta en un directorio llamado así por la rama que desea que la etiqueta (tipo de) pertenecen a, y no tiene que ser manual:

git-thisBranch() { git symbolic-ref --short HEAD; } 
git-localTag() { 
    local name="$1"; shift; 
    git tag $(git-thisBranch)/"$name" "[email protected]"; 
} 
Cuestiones relacionadas