🚀

サブディレクトリの git リポジトリに対してコマンド一括実行(bare リポジトリ対応版)

2023/05/21に公開約1,200字

https://zenn.dev/mtmatma/articles/af86ce114f3c71
に対する改良版

コマンド

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/HEADhogehoge

手順3

sed -e "s#.git/HEAD#.git#" で bare リポジトリの分を置換する

hogehoge.git/HEADhogehoge.git

手順4

-I 指定で xargs を起動して git remote update を実行する。

xargs -r -I{} sh -cx "git -C {} remote update -p"

進捗が見やすいように -x を指定している。

Discussion

ログインするとコメントできます