🕹

マイクロサービスで複数リポジトリのブランチをまとめて切り替えてpullしたい

2021/12/31に公開

モチベ

マイクロサービスだと、リポジトリの数が多くてブランチ切り替えたり、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コマンドにfindsedwhileを組み合わせたワンライナーを書きました。

find . -type d -maxdepth 1 | sed 1d | while read dir; do git -C "${dir}" switch master && git -C "${dir}" pull; done;

ワンライナーの概要

かなり簡単なワンライナーですが、ざっくり2パートに分かれています。

  1. findを使って対象のリポジトリを取得する
  2. 取得したリポジトリ名をループして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 switchgit 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を実行させることができます。

補足

すべてのリポジトリを一つのフォルダ配下にまとめて置いてます。リポジトリ名に規則があれば、lsgrepで絞っても良いのですが、諸事情でリポジトリ名が規則的じゃなかったので、findで1階層目のフォルダ名を取得する形にしています。

現在いるフォルダを対象にしているので、リポジトリがまとめられたフォルダで実行する必要があります。

Discussion