11
votes

Obtenir une liste de tous les enfants d'un commit donné

Je voudrais exécuter Git filtre-branche sur tous les enfants d'une commit donnée. Cela ne semble pas être une tâche facile, car il ne semble pas y avoir un moyen de dire Git REV-LIST pour ne pas renverser les enfants d'un commit particulier. L'utilisation de la syntaxe .. Syntaxe ne fonctionnera pas car elle inclura également le parent commettant toute fusion dans cette gamme. Je manque quelque chose ici?

Edit

Pour clarifier: J'ai une succursale appelée base qui a été fusionné dans dérivé plusieurs fois . J'aimerais énumérer et éventuellement exécuter filtre-branche sur, juste les engagements qui descendent de son plus récent commit. J'aimerais également énumérer des engagements similaires sur d'autres succursales.

La situation (simplifiée) ( dérivé est la branche à gauche): xxx

@ Araqnid's Suggestion ne semble pas fonctionner, à moins que je sois bâclé la lecture: xxx

car cela donne à tous les engagements dans dérivé Sauf pour les commits dans base . Ce genre de sens, puisque tout ce qu'il fait, c'est éliminer les ancêtres de l'Engagement négatif. Ce que je veux dire, c'est juste la première ligne.

git

0 commentaires

4 Réponses :


5
votes

Eh bien, "- Les branches" ou "--all" incluront tous les conseils de branche, puis "- Not A" exclura A et toutes ses ancêtres. Toutefois, "- Les branches - non-une" incluront des succursales qui n'incluent pas de, ce que je pense ne sont pas ce dont vous avez besoin.

Il n'y a pas de moyen facile d'obtenir tout ce que vous voulez, bien que vous puissiez y travailler. Cela listera toutes les succursales contenant commettre a: p> xxx pré>

alors vous devez répertorier toutes les révisions accessibles à l'une de ces personnes, mais pas une révision et toutes les révisions " >

git rev-list $(git for-each-ref refs/heads/* | while read rev type name; do
      git rev-list $rev | grep $(git rev-parse A) >/dev/null && echo $rev
    done) --not A


3 commentaires

Je pensais que ce serait quelque chose comme ça. Il semble étrange qu'il n'existe pas de manière plus simple de le faire. Je suppose que c'est parce que GIT Les commettes sont toujours liées à leurs parents et non à leurs enfants. Je vais lui donner un tour et vous faire savoir comment ça se passe.


hmm .. ne semble pas fonctionner. J'ai une succursale BASE (p. Ex. Développement) qui a été fusionnée plusieurs fois dans la succursale dérivée (par exemple, test) (ES). Je veux énumérer simplement les engagements qui sont des descendants de la base la plus récente commit. Toutefois Dérivé de liste Git Rev-List --Not Base --Oneeline montre que cette liste inclut dérivé commits comportant une ascendance commune avec la tête la tête . C'est-à-dire tout ce qui a une fusion de la base en tant qu'entour. Je vais mettre à jour ma question pour clarifier cela.


GIT FOR-CHAQUE REF REFS / TÊTE / \ * N'inclut pas les noms de branche avec SLAASHES /



0
votes

Cela semble le faire:

$ for rev in $(git rev-list --branches); do
    git rev-list $rev \
      | grep $(git rev-parse base) &>/dev/null \
    && echo $rev;
  done \
  | xargs -L 1 git rev-list -n 1 --oneline
f16fd151b374b2aeec8b9247489c518a6347d001 merged in the latest from the base branch
564d795afb63eab4ffe758dbcd726ca8b790f9f6 spelling correction


0 commentaires


1
votes

J'ai fait une version alternative. Je ne sais pas si c'est mieux ou pire.

$ getGitChildren 2e9df93
f210105376 feat(something): did that feature
9a1632ca04 fix(dummy): fix something


0 commentaires