マイクロサービスで複数リポジトリのブランチをまとめて切り替えて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を実行する
1. findを使って対象のリポジトリを取得する
まず、 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
これで対象にしたいリポジトリ名だけにできました。
2. 取得したリポジトリ名をループしてmasterブランチへの切り替えとpullを実行する
あとは、取得できたリポジトリ名を使って、リポジトリごとに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