🚀
サブディレクトリの 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