Git: qu'est ce qu'un graftcommit ou une greffe-id?
Sur git-filter-branch , il est dit:
Pour définir un commit (qui est généralement à l'extrémité d'une autre histoire) pour être le parent de l'actuel initiale s'engager, afin de coller à l'autre de l'histoire derrière l'histoire actuelle:
git filter-branch --parent-filter 'sed "s/^$/-p <graft-id>/"' HEAD
(si la chaîne parent est vide - ce qui se produit lors de la propagation initiale - ajouter graftcommit en tant que parent).
c'est exactement ce que je veux, c'est-à-dire mettre le parent (à commit A
) d'une certaine commit racine ( B
). Voir ici pour une question connexe.
Mais c'est quoi exactement le greffon "id 1519420920" dans cette commande? Est-ce le nouveau parent, c'est-à-dire A
?
plus loin, un exemple encore plus simple est donné pour obtenir le même:
ou encore plus simple:
echo "$commit-id $graft-id" >> .git/info/grafts git filter-branch $graft-id..HEAD
encore une fois, qu'est-ce que $graft-id
est supposé être dans cet exemple? Et $commit-id
= A
, c'est ça? Ou est-ce $commit-id
= B
et $graft-id
= A
?
j'ai aussi lu ce mais je ne comprends vraiment pas pourquoi j'ai besoin d'un tel concept. Pourquoi je ne peux pas faire git filter-branch A..HEAD
?
Ok, je pense que j'ai tout compris, voir ma propre réponse.
pour expliquer pourquoi j'en avais besoin:
dans notre projet OpenLieroX , nous avions Google Breakpad inclus à un moment.
nous ne l'avons pas pris du SVN officiel (parce que cela n'a pas fonctionné à ce moment-là pour moi) mais de la dernière écurie LastFM à la place (c'était juste aléatoire qui est de là-bas -- je l'avais aussi sur mon disque et je savais que les gens de LastFM ont probablement pris une version stable de Breakpad).
ensuite, lorsque le temps passait, nous avons appliqué plusieurs correctifs à notre propre copie de Google Breakpad.
maintenant, plusieurs mois plus tard, nous voulons nettoyer un peu les histoires, obtenir une bonne vue d'ensemble de tous nos correctifs à Breakpad et peut-être aussi les obtenir en amont. Et surtout (pour nous), nous voulons mettre à jour notre copie de Breakpad.
donc, j'ai pensé que la meilleure chose serait soit pour créer un nouveau dépôt Git, récupérer l'historique des sources officielles quelque part dedans et obtenir tous les trucs spécifiques à Breakpad de notre dépôt principal via git filter-branch
dedans. J'ai utilisé ce miroir Breakpad comme base. Le filter-branch
était aussi un peu plus compliqué parce que nous avons déplacé l'ensemble du répertoire Breakpad à un point à l'intérieur du dépôt OpenLieroX.
donc j'ai fini avec trois branches:
-
breakpad-in-mainsrc
:git filter-branch
-première descente pour L'époque où Breakpad était danssrc/breakpad/external
. -
breakpad-in-libs
:git filter-branch
-deuxième course pour L'époque où Breakpad était danslibs/breakpad
. -
official
: copie demaster
du Breakpad mirror .
puis j'ai cherché le commit dans official
qui était le plus proche de la racine dans breakpad-in-mainsrc
. Je n'ai pas j'ai eu n'importe quelle correspondance parfaite, donc j'ai utilisé la plus proche (j'ai écrit un petit script Python pour le comprendre). Celui-ci est maintenant étiqueté comme olx-closest-initial-breakpad
.
et puis j'ai voulu fusionner ces trois histoires ensemble. Cela s'est très bien passé de la manière décrite ci-dessus (et compte tenu de ma propre réponse ci-dessous).
le résultat est ici: OpenLieroX Google Breakpad sur GitHub
2 réponses
c'est une caractéristique plutôt obscure.
si vous avez besoin de cela, vous feriez mieux de vous assurer doublement que vous savez exactement comment git fonctionne dans les coulisses et vous savez ce que vous voulez accomplir.
aussi, il y a une caractéristique plus récente, probablement plus utile (au moins il est plus flexible) appelé git replace
( man page )
IMHO que la même documentation contient des informations amples si vous avez vraiment besoin de cela.
mais voir
Ok, ça semble fonctionner comme je l'espérais. Pour répondre à mes propres questions:
- greffon "id 151990920" n'est en fait rien d'autre que de la commettre-id, c'est à dire le SHA1 d'un commit.
-
$commit-id
=B
(il doit être un SHA1 bien, pas de tags) -
$graft-id
=A
(encore une fois, doit être un SHA1)
alors le moyen donné encore plus simple fonctionne comme prévu.