開発機に必要なリポジトリをまとめてcloneしたい

【mise】mise bootstrapで開発機のセットアップを宣言的に管理する で紹介したmise bootstrapのうち、gitリポジトリのcloneと更新を担当するのがmise bootstrap reposである。mise.toml[bootstrap.repos]に必要なリポジトリを列挙しておくと、新しい開発機でもまとめてcloneできる。

このコマンドはDockerの使い捨てコンテナで動作を確認した。

基本: urlでリポジトリを指定する

[bootstrap.repos]にclone先のパスをキー、urlにリポジトリのURLを指定する。

[bootstrap.repos]
"~/myrepo" = { url = "https://github.com/example/myrepo.git" }
$ mise bootstrap repos apply -y
Cloning into '/root/myrepo'...
done.
mise repos: applied ~/myrepo

既にcloneされている場合は何もしない冪等な動作になる。

$ mise bootstrap repos apply -y
mise repos: 1 repo(s) already current

mise bootstrap repos statusで状態を確認する

mise bootstrap repos statusで、各リポジトリが現在どういう状態にあるかを確認できる。

$ mise bootstrap repos status
~/myrepo  https://github.com/example/myrepo.git  missing

cloneした後に確認すると、状態がcurrentに変わる。

$ mise bootstrap repos status
~/myrepo  https://github.com/example/myrepo.git  current

–dry-runでプレビューする

mise bootstrap repos apply --dry-runで、実際には実行せず実行されるgitコマンドだけを表示できる。

$ mise bootstrap repos apply --dry-run
git clone https://github.com/example/myrepo.git /root/myrepo

updateでリモートの変更を取り込む

applyはまだcloneされていないリポジトリを新規にcloneするだけで、既にcloneされたリポジトリのリモートの更新は取り込まない。リモートの最新状態を反映するにはmise bootstrap repos updateを使う。

$ mise bootstrap repos update -y
From https://github.com/example/myrepo
   722b6b1..b5c553a  main       -> origin/main
Updating 722b6b1..b5c553a
Fast-forward
 README.md | 1 +
 1 file changed, 1 insertion(+)
mise repos: updated ~/myrepo

ローカル変更があると更新はエラーになる

コミットされていないローカルの変更が残っている状態でupdateを実行すると、意図せず変更を失わないようエラーになる。

$ mise bootstrap repos update -y
mise ERROR repos: ~/myrepo has local changes; commit, stash, or clean them before bootstrap

複数リポジトリを一括更新する際、一部のリポジトリだけ手元で作業中の場合は--skip-dirtyを付けると、ローカル変更があるリポジトリだけスキップして残りを更新できる。

$ mise bootstrap repos update --skip-dirty -y
mise WARN  repos: ~/myrepo has local changes, skipping

execで全リポジトリにコマンドを実行する

mise bootstrap repos execで、[bootstrap.repos]に登録した全リポジトリに対して同じコマンドをまとめて実行できる。

$ mise bootstrap repos exec -- git log --oneline -1
repo: ~/myrepo
b5c553a update

複数のリポジトリを横断して最新コミットを確認したり、一括でgit fetchのような操作をしたい場合に使える。