2017-05-31 3 views
0

J'ai besoin de réécrire l'historique de certaines révisions afin de "pirater" certaines branches qui sont synchronisées avec git-svn (et je veux dire révisions ici ... je ne veux pas réécrire l'histoire entière des branches) . Si nous supprimons les détails de git-svn, ce que je dois faire est de recréer l'historique d'une section d'une branche redéfinissant les parents des révisions (seuls les parents sont modifiés, rien d'autre).comment "facilement" modifier les parents pour les révisions?

Alors que vous obtenez une image plus claire de ce que je veux faire: je veux supprimer un certain nombre de révisions à une branche et les remplacera par une seule révision que je vais créer manuellement (avec COMMIT-arbre. .. Je vais utiliser l'arbre de la dernière révision que je vais supprimer de la branche). Ensuite, je vais recréer les révisions qui sont mises "en haut" des révisions que j'ai supprimées. Étant donné que je substitue une révision à l'historique, je peux «réécrire» les révisions des enfants en modifiant leurs parents pour utiliser les nouvelles révisions issues du processus de «réécriture» (pensez-y comme une opération de sélection ou de rebasage). .... seulement que je ne veux pas faire de cerisier ou de rebaser parce que j'ai déjà les arbres des révisions originales que j'essaie de réécrire, non?).

Il semblerait que git commit-tree serait l'outil que je pourrais utiliser pour y arriver (je peux utiliser l'objet arbre de la révision que je veux réécrire et ensuite je vais mettre en place les parents de la révision ... bien, des centaines de révisions) cependant détails comme le message, l'auteur, l'auteur ne sont pas si simples à définir avec commit-tree (doivent utiliser des variables d'environnement, le message peut être lu depuis stdin). Quel serait le moyen le plus simple si pas en utilisant commit-tree?

+0

'git replace' a un mode' --edit' qui est essentiellement un wrapper autour d'un 'git commit-tree', suivi bien sûr de l'écriture d'une référence' refs/replace/'. Cela semble être le chemin à parcourir. – torek

+0

Non scriptable donc il ne tiendra pas l'eau (besoin de le faire des centaines de fois). Maintenant, je me demande si ce que je peux faire est de créer les objets "à la main" en utilisant '' '' git hash-object''' en utilisant l'objet que je veux "réécrire" puis en modifiant ses parents pour qu'ils correspondent à ce dont j'ai besoin . – eftshift0

+0

Ah, eh bien, si vous voulez faire cela en code de script, il y a du code dans 'git-sh-setup' que' git filter-branch' utilise pour extraire toutes les informations de validation dans les variables d'envoies magiques. Voir, par exemple, 'get_author_ident_from_commit' et le script de branche de filtre,' set_ident' et 'finish_ident'. – torek

Répondre

0

Suivi de ma question initiale. Rappelez-vous de quoi il s'agissait en premier lieu? Je veux réécrire l'histoire d'une branche svn (changer localement Sur le svn repo la branche ne sera pas touchée) afin que je puisse créer une "fusion réelle" au lieu d'une série de révisions qui n'ont aucun rapport avec la branche c'est fusionné. J'ai fini par créer une solution basée sur git commit-tree. Je l'ai déjà publié sur githug au cas où quelqu'un essaye de faire la même chose.

https://github.com/eantoranz/git_svn_rewrite/blob/master/blend-git.txt

Cheers!