🚀
サブディレクトリの git リポジトリに対してコマンド一括実行(bare リポジトリ対応版)
に対する改良版
コマンド
find . -maxdepth 3 -name HEAD 2> /dev/null | \
grep .git/HEAD | \
sed -e "s#/.git/HEAD##" | \
sed -e "s#.git/HEAD#.git#" | \
xargs -r -I{} sh -cx "git -C {} remote update -p"
-maxdepth 3
の 3 は 3 階層まで検索するという意味で必要な深さに設定する。
あるいは指定しない。指定しない場合はサブフォルダをすべて検索する。
最終的に xargs
を呼ぶ前の段階で必要なフィルタリングをして git remote update
を呼び出す対象を絞り込むことができる。
ポイント
前回のコード では xargs -r -n1 dirname
を使っていた。
しかしこれだと通常の git リポジトリは OK だが、bare リポジトリに対しては動作しない。
- 通常の git リポジトリは
hogehoge/.git
というフォルダ構成でhogehoge
に対して git 操作する。 - bare リポジトリは
hogehoge.git
みたいなフォルダ構成でhogehoge.git
に対して git 操作する。
いずれの場合も HEAD
というファイルがある。
- 通常の git リポジトリは
hogehoge/.git/HEAD
- bare リポジトリは
hogehoge.git/HEAD
手順1
以下のファイルを除外するため grep .git/HEAD
で 絞りこみを行う
.../.git/refs/remotes/origin/HEAD
.../.git/logs/HEAD
手順2
sed -e "s#/.git/HEAD##"
で以下のように通常の git リポジトリの分を置換する
hogehoge/.git/HEAD
→ hogehoge
手順3
sed -e "s#.git/HEAD#.git#"
で bare リポジトリの分を置換する
hogehoge.git/HEAD
→ hogehoge.git
手順4
-I
指定で xargs を起動して git remote update
を実行する。
xargs -r -I{} sh -cx "git -C {} remote update -p"
進捗が見やすいように -x
を指定している。
Discussion