マイクロサービスで複数リポジトリのブランチをまとめて切り替えてpullしたい
モチベ
マイクロサービスだと、リポジトリの数が多くてブランチ切り替えたり、pull したりが面倒だったのでワンライナーを用意して楽したい。
環境
- macOS Big Sur 11.6
- GNU bash, version 5.1.8(1)-release (x86_64-apple-darwin20.3.0)
- git version 2.33.0
解決方法
Gitコマンドにfind
とsed
、while
を組み合わせたワンライナーを書きました。
find . -type d -maxdepth 1 | sed 1d | while read dir; do git -C "${dir}" switch master && git -C "${dir}" pull; done;
ワンライナーの概要
かなり簡単なワンライナーですが、ざっくり2パートに分かれています。
-
find
を使って対象のリポジトリを取得する - 取得したリポジトリ名をループして
master
ブランチへの切り替えとpull
を実行する
find
を使って対象のリポジトリを取得する
1. まず、 1のfind
を使って対象のリポジトリを取得する部分を見ていきます。
find . -type d -maxdepth 1 | sed 1d
ポイントは3つで、
-
find
コマンドでd
オプションでディレクトリのみを対象とする -
maxdepth
オプションで1を指定することでリポジトリ名だけを取得する -
sed
コマンドでリポジトリ名のみになるよう最初の1行を削除する
最後のポイントについては、find . -type d -maxdepth 1
を実際に試してもらうとわかるのですが、find . -type d -maxdepth 1
コマンドを打ってみると、最初に.
が表示されてしまいます。なので、sed
を使って最初の1行のみ消しています。
$ find . -type d -maxdepth 1
.
./articles
./node_modules
./books
./memo
./.vscode
$ find . -type d -maxdepth 1 | sed 1d
./articles
./node_modules
./books
./memo
./.vscode
これで対象にしたいリポジトリ名だけにできました。
master
ブランチへの切り替えとpull
を実行する
2. 取得したリポジトリ名をループしてあとは、取得できたリポジトリ名を使って、リポジトリごとにgit switch
とgit pull
を実行できればOKです。
while read dir; do git -C "${dir}" switch master && git -C "${dir}" pull; done;
while
を使ってfind
の結果を1つずつループさせています。ここでのポイントは以下の2つです。
-
C
オプションを使って、cd
せずにgit
コマンドを実行する -
&&
を使って、ブランチ切り替えしたあとにpull
を実行させる
git
コマンドのC
オプションを使うことで、わざわざディレクトリ移動しなくても現在いるディレクトリからgit
コマンドを実行可能です。
git -C "${dir}" switch master && git -C "${dir}" pull
が実際に実行されるときには以下のような形で展開されるイメージ。
git -C ./articles switch master && git -C ./articles pull
また、&&
を使うことで、コマンドA && コマンドB
のようにコマンドAが成功したらコマンド2を実行させることができます。
補足
すべてのリポジトリを一つのフォルダ配下にまとめて置いてます。リポジトリ名に規則があれば、ls
とgrep
で絞っても良いのですが、諸事情でリポジトリ名が規則的じゃなかったので、find
で1階層目のフォルダ名を取得する形にしています。
現在いるフォルダを対象にしているので、リポジトリがまとめられたフォルダで実行する必要があります。
Discussion