2013-07-10 6 views
11

gitで変更を隠してからgit stash applyで再度適用する習慣があります。これは、私が間違って私が作った隠しを失うことから私を保つ利点がありますが、それはまた、急いで私のリストがかなり急速に成長することを意味します。特定のブランチに関連するすべてのstashを削除する

私がブランチを終えたら、私は自分のスティッシュリストに戻り、ブランチに関連するすべてのスタッシュを手動で削除します。 1つのコマンドでこれを行う方法はありますか?例えば

は、私の現在の隠しリストは次のようになります。

[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 

second_issuesからスタッシュのすべてをドロップするコマンドはありますか?

+1

+1非常に興味深い質問です。 stashは常に 'git stash list'で連続していますか? –

+0

残念ながら、いいえ。私が多くの仕事で忙しければ、私はブランチをたくさん切り替えることになり、スタッシュが混在することになります。 – Kevin

+0

私はそれが事実かもしれないと思っていて、この例のひし形は連続しているので、明確にしたいと思っていました。 –

答えて

3

何が?これは、特定のブランチ上に作成されたスタッシュをドロップする、すばやく汚い方法です。

ブランチ上に作成されたスタッシュに対してgrepを使用して検索し、stashの名前を取得し、最後にxargsを使用してその名前をgit stash dropに渡します。

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

編集manページに掘る

、それはgit stash listgit log形式のオプションを受け付けますと言います。
YOUR_BRANCHNAMEと一致する行だけを表示し、その行の "reflag identity name"(%gd: shortened reflag selector, e.g., [email protected]{1}、manページから)を出力するように指示します。
次に、出力をxargsに渡して隠しを削除します。

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

stashは、どのブランチにも依存しません。隠しは、あなたのリポジトリの隠しです。各リポジトリにはちょうど1つの隠しがありますが、隠しに必要なだけ多くの変更セットを置くことができ、後でそれらを保持します。このように、ブランチ間であなたのおしゃぶしさが違う場合はありません。あなたのケースでは、@ {6}はあなたがチェックアウトしたブランチに関係なく、同じコミットを表示します。隠しをクリアしたい場合は、git stash clearを実行すると、そのリポジトリのすべての隠された変更が隠されます。これはかなり破壊的な操作なので、使用するときは注意してください。

+1

これは本当かもしれません。ただし、stashのコミット・メッセージには、コミットが行われたブランチが含まれています。私はこれがOPが指しているものだと信じています。 –

+0

MonadNewbが正しいです。私は、枝はどの枝からも見え、どこにでも適用できることを理解しています。私は自分が作成したブランチに基づいてひだを削除したい。ありがとう、しかし! – Kevin

+0

これははるかに複雑な操作ですが、 'git stash list'の結果を表示するか、実際に.gitフォルダを横断して何の情報がどこにあるかによってあなたのために行うBASHスクリプトを書く必要があります格納されている場所から隠されています。私はその情報がどこにあるのかは分かりませんが、あなたが求めているものは、何かのBASHスクリプトなしでは不可能と思われる 'git stash help 'の表示に基づいています。 – usumoio

1

stashと特定のブランチの関係をチェックする方法の1つは、stashの親コミットがブランチに含まれているかどうかをチェックすることです。

stashの親コミットは、stashが作成されたコミットです。関心のある支店にこのコミットがある場合は、それらを削除したり、必要な処置を取ったりすることができます。

あなたのスタッシュのいずれかが由来場合には、現在HEADに含まれるコミットを検出するために小さなbashスクリプトがあります。これについて

#!/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 
関連する問題