2010-06-30 29 views
12

éditer La question se résume à "Can git rebase être instruit de rebaser des étiquettes, aussi?" Mais une réponse à la question initiale aiderait aussi.Les balises Can peuvent-elles être automatiquement déplacées après un git filter-branch et rebase?


demandé How to prepend the past to a git repository? j'ai suivi these instructions. < edit> Puis j'ai rebasé pour inclure un fichier qui était seulement dans les snapshots, voir here. < /edit> Depuis que l'historique a été réécrit (par git filter-branch ou git rebase ou les deux?) Toutes les étiquettes sont toujours sur la ligne de temps d'origine * et je voudrais en quelque sorte les déplacer vers le nouveau. Je pense que j'ai fait tous les messages de commit avec des tags uniques afin que je puisse essayer d'écrire un script qui les utilise, mais un git move-tags <from> <to> plus général serait mieux. Donc, y a-t-il un moyen d'adresser "la validation que N commet après sur le nouveau scénario de telle sorte que la Nième validation après sur l'ancienne ligne de temps soit étiquetée"? Toute autre solution, à l'exception du retagging manuel évident, serait également excellente.

(s'il vous plaît ne hésitez pas à corriger cette phrase horriblement longue en anglais plaine ...)

*) hey, git-grand-père a résolu le paradoxe!

+2

Le titre dit « rebasage », mais les corps parle sur « filtre-branche », avez-vous fait à la fois (comme le laisse entendre [ici] (http://stackoverflow.com/ questions/3150394/comment-annuler-supprimer-un-fichier-supprimé-dans-gits-histoire/3150528 # 3150528))? Avec '--tag-name-filter', filter-branch peut réécrire les tags, mais cela n'aidera pas s'il y a un rebasage ultérieur. –

+1

@Chris Désolé, j'ai corrigé ça. Oui, j'ai utilisé 'git rebase' après la greffe + filter-branch. Les balises sont bien après ce dernier, et j'aurais dû me rappeler que rebasing crée une branche distincte en laissant intactes les balises originales. Donc, la question de base est "Can' git rebase' devrait-il être chargé de rebaser les balises, aussi? " –

Répondre

6

J'ai écrit un script est ce que ca.

$ git-rebase-tags master 
Rebasing 107 tags onto 'master' 
Can't rebase tag 'staging-deploy-01' because there are no identical commits on 'master' 
Pointed tag 'v0.0.11' at commit 81e16f2ca1bc7802547bf19c1dba1a68212eafff 
Pointed tag 'v0.0.12' at commit 17051cc28084dd56ae56e96767bceee46217c02d 
Pointed tag 'v0.0.13' at commit 5d795076ba4b33f81d327dcf9bff727cef7771a2 
[...] 

Voir gist.github.com/908381.

Mais encore mieux, utilisez l'option --tag-name-filter intégrée dans git-filter-branch (1).

+0

+ 1 merci, le script est sympa pour moi d'apprendre les avantages de ruby ​​:) –

+0

Le script va-t-il également transférer les messages qui ont annoté les anciennes balises? –

3

Il n'y a pas de manière intégrée de faire ce que vous voulez en utilisant git. 'git rebase --tags' pourrait être intéressant mais il n'existe pas.

Si les messages de validation sont identiques que vous dites que vous pouvez ensuite passer par chaque balise dans refs/balises, faites:

'git log -1 --pretty=oneline <tagname>' 

Comparez le message de commit à la liste complète:

'git log --pretty=oneline <newbranches>' 

Si vous trouvez un match (et le hachage SHA1 est différent), puis faire:

'git tag --force <tagname> <new SHA1>' 
2

Selon Thomas Rast à http://git.661346.n2.nabble.com/Rebase-with-tags-td5582971.html:

Leonid Podolny a écrit:

Est-il possible, au moins, pour recevoir un ensemble de (ancien COMMIT nouveau commit) paires, donc que je vais écrire un petit script qui va faire ça pour moi?

Le crochet post-rewrite obtient cette liste, vous pouvez donc utiliser que si vous voulez à.

+0

Intéressant, je vais essayer ce coup la prochaine fois que j'essaierai un tel rebasement. Merci! –

2

Il y a une façon de faire git filter-branch les balises automatiquement mises à jour modifiées en utilisant l'option --tag-name-filter, comme décrit in this answer.

2

J'ai mis en place ma propre implémentation de python, git rebasetags

Si le rebasage est interactif, vous sera présenté avec un shell bash où vous pouvez faire les changements. En quittant ce shell, les tags seront restaurés.

enter image description here

De this post