Git, reescribiendo el historial de la twig principal y las tags asociadas

Acabo de tener mi primera experiencia con la reescritura del historial de uno de mis repositorys (usando git-filter-branch). El problema es que el repository tenía varias tags, que después de la reescritura parecen estar completamente desconectadas del historial resultante. Creo que esto se debe al hecho de que el historial asociado con las tags no se ha reescrito, por lo que deben señalar las confirmaciones anteriores. Entonces, ¿qué puedo hacer para "aplicar" las tags en el nuevo historial? Un poco de arte ASCII, tal vez es más fácil entender mi pregunta:

Repo original:

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

Repo estructura reportada por gitk --all historia después de reescribir:

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

Parece el último paso de este procedimiento descrito aquí

 $ 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 

La idea es leer las tags de las versiones anteriores de los repositorys, para volver a aplicarlas en el nuevo historial.


Nota: en su uso original de git-filter-branch, ¿usó el:

 -- --all 

?

el -- que separa las opciones de la twig de filter de las opciones de revisión, y el --all para reescribir todas las twigs y tags.

Puede haber mantenido la label en su lugar en la nueva historia (aunque todavía no lo he probado)

En primer lugar, también debe reescribir las tags , por ejemplo, (como dijo VonC ) mediante el uso de la opción --all para reescribir todas las references.

Si tiene tags anotadas ( tags de peso pesado), también debe usar la opción --tag-name-filter , por ejemplo, como --tag-name-filter cat . Tenga en count que no puede volver a escribir las tags firmadas.

Si desea realizar un cambio que se puede hacer con git filter-branch , puede usar --tag-name-filter como se explicó anteriormente.

Sin embargo, si desea hacer un reajuste interactivo, necesita algo más.

Ambas cosas se pueden lograr con git rebasetags

En caso de que la rebase sea interactiva, se te presentará un shell bash donde podrás hacer los cambios. Al salir de ese caparazón, las tags serán restauradas.

enter image description here

De esta publicación