Abrufen einer Liste aller untergeordneten Elemente eines bestimmten Commits

8

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?

bearbeite

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):

%Vor%

@ 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.

    
intuited 10.04.2010, 15:52
quelle

4 Antworten

5

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.

    
araqnid 10.04.2010 16:47
quelle
4

Zeigen Sie die Abstammungspfade an, die A von einer Menge anderer übernehmen sollen:

  

git log --ancestry-path ^A others

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:

%Vor%

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.

    
jthill 15.06.2014 16:27
quelle
1

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.

    
Baptiste Mesta 23.03.2017 10:29
quelle
0

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 :)

gibt

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.

    
intuited 10.04.2010 23:21
quelle

Tags und Links