2013-07-10 5 views
11

Ich habe die Gewohnheit, meine Änderungen in git zu verstauen und sie erneut mit git stash apply. Das hat den Vorteil, dass ich nicht versehentlich einen Vorrat verliere, aber es bedeutet auch, dass meine Liste von Stagen ziemlich schnell wächst.Fallen alle mit einem bestimmten Zweig verbundenen Stürze

Wenn ich mit einer Verzweigung fertig bin, gehe ich zurück durch meine Stash-Liste und entferne manuell alle Stages, die mit der Verzweigung verbunden sind. Gibt es eine Möglichkeit, dies in einem einzigen Befehl zu tun?

Zum Beispiel meine aktuellen Stash Liste sieht wie folgt aus:

[email protected]:~/my/dev/work$ git stash list 
[email protected]{0}: WIP on master: 346f844 Commit comment 
[email protected]{1}: WIP on second_issues: a2f63e5 Commit comment 
[email protected]{2}: WIP on second_issues: c1c96a9 Commit comment 
[email protected]{3}: WIP on second_issues: d3c7949 Commit comment 
[email protected]{4}: WIP on second_issues: d3c7949 Commit comment 
[email protected]{5}: WIP on second_issues: d3c7949 Commit comment 
[email protected]{6}: WIP on second_issues: 9964898 Commit comment 

Gibt es einen Befehl, der alle der stashes von second_issues fallen würde?

+1

+1 sehr interessante Frage. Werden die Stapel in der "Git Stash List" immer sequenziell sein? –

+0

Leider nicht. Wenn ich mich mit einer Menge Aufgaben beschäftige, werde ich viel anfangen, Filialen zu wechseln, und am Ende mit vermischten Taschen enden. – Kevin

+0

Ich dachte, dass das der Fall sein könnte und wollte klären, da die Taschen im Beispiel sequentiell sind. –

Antwort

3

Was ist das? Es ist eine schnelle und schmutzige Art und Weise, die die in einem bestimmten Zweig erstellten Stapel ablegt.

Es listet einfach alle Stashes auf, sucht mit grep nach den Stashes, die auf einem Zweig erstellt wurden, erhält seinen Stashnamen und übergibt schließlich diese Namen git stash drop durch xargs.

git stash list | grep -E '[email protected]{[0-9]+}.+ YOUR_BRANCH_NAME' | cut -d ':' -f 1 | xargs git stash drop 

bearbeiten

in den Manpages Graben, sagt es die git stash list akzeptiert auch git log Formatoptionen.
So sagen wir es Zeilen zu drucken, die nur YOUR_BRANCHNAME übereinstimmen, und von diesen Zeilen, um nur seinen "Reflag-Identitätsnamen" (%gd: shortened reflag selector, e.g., [email protected]{1}, von der man-Seite) zu drucken.
Dann übergeben wir die Ausgabe an xargs, um das Versteck fallen zu lassen.

git stash list --grep='YOUR_BRANCHNAME' --format='%gd' | xargs git stash drop 
2

Der Stash ist von keinem Zweig abhängig. Der Stash ist nur der Speicher für Ihr Repository. Jedes Repository hat genau ein Versteck, aber Sie können beliebig viele Verzeichnungssets in ein Versteck legen und für später aufbewahren. Daher ist es nicht so, dass Ihre Filialen zwischen Zweigen unterschiedlich sind. In Ihrem Fall wird stash @ {6} Ihnen den gleichen Commit zeigen, egal welchen Zweig Sie ausgecheckt haben. Wenn Sie Ihren Stash löschen möchten, können Sie git stash clear ausführen, und das wird Ihren Versteck aller verdeckten Änderungen für diesen Repo löschen. Dies ist eine ziemlich zerstörerische Operation, also seien Sie vorsichtig, wenn Sie sie benutzen.

+1

Das mag stimmen.Die Commit-Nachricht für einen Stash enthält jedoch den Zweig, in dem der Commit ausgeführt wurde. Ich glaube, darauf bezieht sich das OP. –

+0

MonadNewb hat Recht. Ich verstehe, dass Taschen aus jedem Zweig sichtbar sind und überall angewendet werden können. Ich möchte Stapel löschen, abhängig davon, aus welchem ​​Zweig ich sie erstellt habe. Trotzdem danke! – Kevin

+0

Okay, das ist eine viel komplexere Operation, Sie müssten ein BASH-Skript schreiben, das das für Sie erledigt, indem Sie entweder die Ergebnisse von 'git stash list' anzeigen oder den .git-Ordner tatsächlich durchqueren wurde von wo aus gelagert. Ich bin mir nicht sicher, wo diese Information ist, aber basierend auf 'git stash help', wonach Sie fragen, scheint es ohne ein BASH-Skript nicht möglich zu sein. – usumoio

1

Ein Ansatz, um die Beziehung zwischen einem Stash und einem gegebenen Zweig zu überprüfen, besteht darin, zu überprüfen, ob das Eltern-Commit des Stash in Ihrem Zweig enthalten ist.

Das Eltern-Commit eines Stash ist das Commit, aus dem der Stash erstellt wurde. Wenn dieses Commit in Ihrem Interessensgebiet vorhanden ist, können Sie es fallenlassen oder die erforderlichen Maßnahmen ergreifen.

Es gibt eine kleine Bash-Skript zu erkennen, ob alle Ihre stashes von einem Commit entstanden, dass derzeit in HEAD enthalten ist:

#!/bin/bash 

# Get a list of all stashes, like "[email protected]{0}", "[email protected]{1}", and so on 
stashList=$(git stash list | grep -o "^[email protected]{[0-9]*}") 

for stashRef in $stashList; do 

    # Obtain hashes for the stash and its first parent 
    currentHash=$(git rev-parse $stashRef) 
    parentHash=$(git rev-parse $stashRef^) 

    echo "$stashRef: $currentHash" 
    echo "parent: $parentHash" 

    # merge-base checks for the common parent 
    mergeBase=$(git merge-base $parentHash HEAD) 

    # If a commit is contained in another commit, it will be the base 
    # commit returned by merge-base 
    if [[ $mergeBase == $parentHash ]]; then 
     echo 'Contained in HEAD' 
    else 
     echo 'Not contained in HEAD' 
    fi 
done 
Verwandte Themen