質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
SourceTree

SourceTreeは、Gitのクライアントツール。視覚的に操作するGUI形式でGitの操作が容易になります。MacやWindowsなどのOSに依存しておらず、PC環境に合わせてインストールすることが可能です。

Git

Gitはオープンソースの分散バージョン管理システム(DVCS)です。

Q&A

解決済

1回答

782閲覧

Gitでのブランチ削除スクリプトについて

退会済みユーザー

退会済みユーザー

総合スコア0

SourceTree

SourceTreeは、Gitのクライアントツール。視覚的に操作するGUI形式でGitの操作が容易になります。MacやWindowsなどのOSに依存しておらず、PC環境に合わせてインストールすることが可能です。

Git

Gitはオープンソースの分散バージョン管理システム(DVCS)です。

0グッド

0クリップ

投稿2022/02/25 03:14

Sourcetree(Git)でマージ済みのローカル作業ブランチを一括削除したいと思った際に調べた記事でのコマンドのそれぞれの意味についてご教授いただきたいと思います。
検索した記事
https://qiita.com/hajimeni/items/73d2155fc59e152630c4

この記事内で

// develop と main は消さないようにしています。 git branch --merged|egrep -v '\*|develop|main'|xargs git branch -d

とあるのですが、個人的にはここから応用していってすべての「hoge/」がついたマージ済みのブランチ・・みたいな感じにしていきたいのですがしっかり理解していないため聞きたい次第です。

下記に自分の調べた結果とわからない部分について記載しましたのでご回答いただけると助かります。

・git branch --merged
→マージ済みのブランチ一覧を表示

・egrep
→パターン検索

・-v
→これが何なのかわかりません

・'*|develop|main'
→なんでこれが「develop と main以外」なのかわかりません。(Not要素はどこなのでしょうか?)

・xargs
→出力された情報を次のコマンドに渡す(今回の場合「git branch -d」)

・git branch -d
→ブランチ削除

・それぞれのコマンドなどを分けている「|」
→何を指しているかわからない。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

egrep -v は以下の通りです。

https://www.ibm.com/docs/ja/aix/7.2?topic=e-egrep-command#egrep__row-d3e74217

指定されたパターンと一致する行を除くすべての行を表示します。

つまり、正規表現でマッチしなかったものを出力します。

'\*|develop|main'

この部分の | は正規表現の一部で、「または」を意味します。
つまり \* または develop または main です。
\* は記号としてのアスタリスクです。* は正規表現で特別な意味を持つ記号なので、それを無効化してただのアスタリスクを表すために \ をつけています。

git branch を実行すると、現在チェックアウトされているブランチに * がつくことがわかると思います。つまり、developmain に加えて、現在のブランチを除外しています。

' で囲まれた部分が正規表現ですが、囲まれていない部分にある | はパイプ演算子です。
左辺のコマンドを実行し、その出力を右辺の標準入力に渡しています。

投稿2022/02/25 03:25

Zuishin

総合スコア28660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2022/02/25 03:32 編集

お早い回答ありがとうございます。 大変助かります。 ・「egrep -v 」についてありがとうございます。 ・「'\*|develop|main'」が指している内容についてありがとうございます。  特に現在ブランチに「*」が付くことは知らなかったので助かります。 1点質問なのですが、パイプ演算子の役割が「左辺のコマンドを実行し、その出力を右辺の標準入力に渡しています。」とあるのですが、なんで「xargs」が必要なのでしょうか? xargsについて調べると先のパイプ演算子のように右辺に引数として情報を渡す的な感じのことが紹介されているのですが、パイプ演算子のみではいけない感じなのでしょうか?
Zuishin

2022/02/25 03:55

入力方法として大きく二つあります。 一つが標準入力で、一つが引数です。 xargs は標準入力から得られたものを引数として指定されたコマンドに渡すコマンドです。 このパイプは、git の出力が egrep の標準入力に渡され、egrep の出力が xargs の標準入力に渡されています。 そして xargs は git コマンドを起動し、入力を引数に変換して渡しています。 どのようなデータを標準入力から受け取るか、引数で受け取るかはそのコマンドによって違うため、xargs はその変換を請け負います。
Zuishin

2022/02/25 03:57

たとえば、echo 'main' | xargs git branch -d は、git branch -d main と同じ意味になります。
退会済みユーザー

退会済みユーザー

2022/02/25 04:40 編集

返答ありがとうございます! 今回、「git branch -d」は引数が必要なのに対し、パイプ演算子だとそれが対応できないため「xargs」で引数に変換して「git branch -d」に渡している感じなのですね。 申し訳ありませんがもう1つ質問があるのですが、「egrep -v」はパターン一致を除くすべてというのはわかったのですが、「~以外且つ、~パターンに一致」というような条件にしたい場合はどのようにすればいいのでしょうか? 例として、「作業ブランチ以外且つ「hoge/」がついているマージされているブランチ」 (現状の作業ブランチには「hoge/」がついているとします。(これは削除したくない)) git branch --merged|egrep -v '\*'|egrep 'hoge/'|xargs git branch -d 上記のように、一旦作業ブランチを除いて、その後「hoge/」を除くような感じになるのでしょうか
Zuishin

2022/02/25 05:44 編集

そのように egrep を二回通す方法が保守性も高く、簡単で良いと思います。 | xargs git branch -d を取り除けば画面に出力されるので、それで間違いないか確認してみてください。
退会済みユーザー

退会済みユーザー

2022/02/25 09:48

こちら実際にコマンドを打ってみたところ期待通りの表示になりました。 大変助かりました。ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問