[解決済み] bash スクリプトを使用してすべての git ブランチを反復処理する方法
質問
bash スクリプトを使用して、リポジトリ内のすべてのローカルブランチを反復処理するにはどうすればよいですか。 私は反復して、ブランチといくつかのリモートブランチの間に違いがあるかどうかをチェックする必要があります。 元
for branch in $(git branch);
do
git log --oneline $branch ^remotes/origin/master;
done
私は上記のようなことをする必要がありますが、私が直面している問題は、$(git branch)は、リポジトリに存在するブランチと一緒にリポジトリフォルダ内のフォルダを私に与えることです。
これはこの問題を解決するための正しい方法でしょうか?それとも別の方法があるのでしょうか?
ありがとうございます。
どのように解決するのですか?
この場合 gitブランチ を使うべきではありません。Git では 「plumbing" インターフェース を提供します(現在および過去の多くの通常のGitコマンド(add、checkout、mergeなど)の実装は、この同じインターフェイスを使用しています)。
あなたが望む配管コマンドは git for-each-ref :
git for-each-ref --shell \
--format='git log --oneline %(refname) ^origin/master' \
refs/heads/
注意: この場合
remotes/
を引き起こす他の参照がない限り、リモート参照のプレフィックスは必要ありません。
origin/master
が参照名の検索パスの複数の場所にマッチするような他の参照がない限り(参照 "A symbolic ref name. ...」にある
git-rev-parse(1) のリビジョンの指定のセクションを参照ください。
). もし明確に曖昧さを避けたいのであれば、完全な参照名を指定しましょう。
refs/remotes/origin/master
.
このような出力が得られます。
git log --oneline 'refs/heads/master' ^origin/master
git log --oneline 'refs/heads/other' ^origin/master
git log --oneline 'refs/heads/pu' ^origin/master
この出力をパイプで sh .
シェルコードを生成するのが嫌な場合は、少し堅牢性をあきらめることもできます * にして、このようにします。
for branch in $(git for-each-ref --format='%(refname)' refs/heads/); do
git log --oneline "$branch" ^origin/master
done
* Ref 名はシェルの単語分割の影響を受けないようにする必要があります ( git-check-ref-format(1)を参照してください。 ). 個人的には、前者のバージョン(生成されたシェルコード)にこだわります。この方が、不適切なことが起こらないという確信があります。
あなたが指定した バッシュ を指定し、それが配列をサポートしているので、安全性を維持しながらも、ループの根幹を生成しないようにすることができます。
branches=()
eval "$(git for-each-ref --shell --format='branches+=(%(refname))' refs/heads/)"
for branch in "${branches[@]}"; do
# …
done
同じようなことを
$@
配列に対応したシェルでない場合は (
set --
で初期化し
set -- "$@" %(refname)
で要素を追加します)。
関連
-
[解決済み] Git で直近のローカルコミットを取り消すには?
-
[解決済み] Gitブランチをローカルやリモートで削除するには?
-
[解決済み] コミット前に 'git add' を取り消すにはどうすればよいですか?
-
[解決済み] Bashスクリプトのソースディレクトリをスクリプト自体から取得するにはどうすればよいですか?
-
[解決済み] 新しいローカルブランチをリモートの Git リポジトリにプッシュし、それを追跡するにはどうすればよいのでしょうか?
-
[解決済み] Git ですべてのリモートブランチをクローンする方法
-
[解決済み] Git のリモートブランチを作成する方法を教えてください。
-
[解決済み] リモートにないトラッキングブランチを削除
-
[解決済み】"git pull" でローカルファイルを強制的に上書きするには?
-
[解決済み】ローカルのGitブランチの名前を変更するには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
gitlab をアップロード ! [リモート拒否] dev -> dev (受信前のフックが拒否されました)
-
git commit コマンドで追跡した新規ファイルをコミットすると、プロンプト *** Please tell me who you are が表示されます。
-
Git error: cannot spawn ssh.の回避策。そのようなファイルやディレクトリはありません
-
Git学習まとめ(2)コミットには何も追加されていないが、未追跡のファイルは存在する
-
[解決済み] Git で現在のブランチ名を取得するには?
-
[解決済み】GITリポジトリをあるサーバーから新しいサーバーに移行する方法
-
[解決済み] Git プロジェクトのすべてのブランチで「grep 検索」を実行することはできますか?
-
[解決済み] gitでコミット間を前進・後退させる方法は?
-
[解決済み] チェリーピックのコンフリクトを解決するにはどうしたらいいですか?
-
[解決済み] Git タグリスト、コミット sha1 ハッシュの表示