2009-07-16 18 views
5

Ho appena avuto la mia prima esperienza con la riscrittura della cronologia di uno dei miei repository (utilizzando git-filter-branch). Il problema è che il repository aveva diversi tag, che dopo la riscrittura sembrano essere completamente scollegati dalla cronologia dei risultati. Penso che ciò sia dovuto al fatto che la cronologia associata ai tag non è stata riscritta, quindi devono puntare ai vecchi commit. Quindi, cosa posso fare per "applicare" i tag sulla nuova cronologia. Un po 'arte ASCII, forse è più facile capire la mia domanda:Git, cronologia di riscrittura del ramo principale e tag associati

repo originale: struttura

+ HEAD 
| 
| 
+ TAG 0.2.0 
| 
| 
+ TAG 0.1.0 
| 
| 
+ Initial commit 

Repo riportato da gitk --all dopo che la storia di riscrittura:

+ HEAD 
    | 
    | 
    | 
    | 
    | 
    | 
    | 
    | 
    + Initial commit 
+ HEAD 
| 
| 
+ TAG 0.2.0 
| 
| 
+ TAG 0.1.0 
| 
| 
+ Initial commit 

risposta

5

apparire come il ultimo passaggio di questo procedure described here

$ git log --pretty=oneline origin/releases | 
    sed -n -e '/^\([0-9a-f]\{40\}\) Tag\(release\)\? \(.*\)/s--\3|\1|Tag release \3-p' 
    > ~/paludis-git-tags 

$ while read name msg head ; do 
    git tag -m "${msg}" ${name} ${head} ; 
    done < paludis-git-tags 

L'idea è di leggere i tag dalle vecchie versioni dei repository, per riapplicarli sulla nuova cronologia.


Nota: nel vostro uso originale del git-filter-branch, hai usato il:

-- --all 

?

la -- che separa le opzioni di filtro-ramo di opzioni di revisione, e il --all di riscrivere tutti i rami e tag.

Potrebbe essere mantenuto il tag in posizione sul nuova storia (non ho ancora provato però)

+0

Grazie VonC, ho perso il '- --all' parte.Fortunatamente ho avuto un backup del repository e ho provato di nuovo con l'opzione '--all' e ha funzionato come volevo. –

3

In primo luogo, si deve tag riscrittura troppo, per esempio (come VonC said) utilizzando l'opzione --all per riscrivere tutti i riferimenti.

Se si dispone di tag annotati (tag pesanti) è necessario utilizzare anche l'opzione --tag-name-filter, ad es. come --tag-name-filter cat. Si noti che non è possibile riscrivere i tag firmati!

+0

Grazie Jakub, non sapevo di tag annotati e firmati. Informazioni utili Grazie ancora. –

1

Se si desidera eseguire una modifica che può essere eseguita con git filter-branch, è possibile utilizzare --tag-name-filter come spiegato sopra.

Se si desidera eseguire il rebasing interattivo, è necessario qualcos'altro.

Entrambe le cose possono essere compiute con git rebasetags

Nel caso in cui il rebase è interattivo, verrà presentato con una shell bash in cui è possibile apportare le modifiche. All'uscita da quella shell, i tag verranno ripristinati.

enter image description here

Da this post

Problemi correlati