Ich möchte git filter-branch
für alle untergeordneten Elemente eines bestimmten Commits ausführen. Dies scheint keine leichte Aufgabe zu sein, da es anscheinend keine Möglichkeit gibt, git rev-list
anzuweisen, nur Kinder eines bestimmten Commits zurückzugeben. Die Verwendung der Syntax .. wird nicht funktionieren, da sie auch die Eltern-Commits jeder Zusammenführung innerhalb dieses Bereichs enthält. Fehle ich hier etwas?
Zur Klarstellung: Ich habe einen Zweig namens base
, der mehrmals in derivative
zusammengeführt wurde. Ich würde gerne filter-branch
auflisten und eventuell auch nur die Commits ausführen, die von seinem letzten Commit abstammen. Ich möchte auch ähnliche Commits in anderen Branchen auflisten.
Die (vereinfachte) Situation ( derivative
ist der Zweig auf der linken Seite):
@ araqnids Vorschlag scheint nicht zu funktionieren, es sei denn, ich habe es verpatzt, es zu lesen:
%Vor% da dies alle Commits in derivative
enthält, mit Ausnahme der Commits in base
. Diese Art von Sinn macht Sinn, da sie nur die Vorfahren des negierten Commits entfernt. Was ich zeigen möchte, ist nur die erste Zeile.
Nun, "--branches" oder "--all" enthält alle Verzweigungstipps und "--not A" schließt dann A und alle seine Vorfahren aus. "--branches --not A" enthält jedoch Zweige, die kein A enthalten, was meiner Meinung nach nicht das ist, was Sie brauchen.
Es gibt keinen einfachen Weg, um alles zu bekommen, was Sie wollen, obwohl Sie es schaffen können. Dies listet alle Zweige auf, die Commit A enthalten:
%Vor%Dann müssen Sie alle Revisionen auflisten, die von diesen, aber nicht von A selbst und von irgendwelchen Revisionen zurück erreichbar sind
%Vor%Beachten Sie, dass ich dies nur einen sehr kurzen Test gegeben habe: p Aber ich denke, die Grundlagen sind solide.
Zeigen Sie die Abstammungspfade an, die A
von einer Menge anderer übernehmen sollen:
Zeige alle nicht erreichbaren Commits im Repo:
git fsck
--unreachable --no-reflogs \
| awk ' == "commit" {print }'
Verfolgen Sie alle Nachkommen von commit A
irgendwo im Repo:
Zeige alle Verweise, deren Verlauf ein Commit enthält:
%Vor% edit: Korrektur: Zeige keine unerwünschten Commits, wenn A
selbst Eltern mit anderen Kindern hat.
Ich habe eine alternative Version gemacht. Ich weiß nicht, ob es besser oder schlechter ist.
%Vor%wird so benutzt:
%Vor%Es gibt nur die direkte Kinderliste eines Commits.
Das scheint es zu tun:
%Vor% Der letzte Pipe-Abschnitt mit xargs
zeigt nur die Commit-Nachrichten für jeden dieser Commits.
Dies listet das Ziel-Commit zusätzlich zu seinen Kindern auf, was genau das ist, was ich wollte. Es ist allerdings ziemlich langsam: Es dauerte mehr als 3 Sekunden, um mit einem Repo mit 40 Commits zu laufen. Das ist nicht überraschend, denn es ist ungefähr so brutal wie André der Riese. Ich nehme an, eine elegantere Methode würde die rev-Liste für jeden ref durchgehen und einen Baum der Hashes jedes Commits erstellen, der mit seinen Kindern verknüpft ist, und dann mit dem Ziel-Commit beginnen. Aber das ist etwas kompliziert, also habe ich gehofft, dass es einen Git-Befehl für das :)
Ich muss noch herausfinden, wie ich diese Menge an Commits in filter-branch
bekomme. Ich denke, ich kann das rev-list
von $GIT_COMMIT
nur innerhalb meines --tree-filter
-Befehls grepsen.
Tags und Links git