
Git Worktreeの管理方法について、 外部ツールなどを使わずにできる個人的便利設定。
Worktreeを管理する場所
Worktreeはレポジトリルートに.worktreeというディレクトリを作ってその中で管理するようにしています。 レポジトリの中で閉じたいので。
このディレクトリはルートのGit管理からは外したいので .gitignoreに
1
|
|
を追加しておきます。
.gitディレクトリの中に作るという案も出てたりしますが、 gitの内部構造用ディレクトリなので避けた方が無難です。
submoduleのような状態で管理している場合にはそもそも.gitがディレクトリでなくなり、 親の.gitディレクトリを使ったりするとよくわからなくなってくこともあるかもしれないので。
現状この方法で一つ困ってるのが、仮想環境を自動認識してくれるmiseを使った環境設定を行っている際。
.mise.tomlがworktreeとその親のディレクトリでも見つかって重複してしまうわけですが、 Pythonの仮想環境(だけ?かほかもそうかは見てません)を自動認識する際に その際にPATHが親ディレクトリの方の仮想環境が前につけられてしまいます。
その他の設定は例えばenvなどで違う値を指定していればworktreeの方が優先されて設定されます。
基本的には近い.mise.tomlの設定が優先されるようになっているはずですが、 どうもバグっぽい。
Python virtual env is in wrong order in PATH for nested configs · Issue #4515 · jdx/mise
これを避けるためにはやはりレポジトリ外にworktreeを作る必要があるのですが、
管理が煩雑になるので中に作りたい気持ちがあり、
現状では上のバグがそのうち治ることを期待して、
uv
を使った仮想環境ではworktreeではuv run ...
のようにして仮想環境を使うようにしています。
Worktree関連のalias
以下のようなGitのaliasを設定しておくと便利です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
|
wt
は単に短縮alias。wl
もそのまま。
wa
はworktree名を指定することで、.worktreeの中にその名前でworktreeを追加します。
1
|
|
レポジトリ下のいずれかの中にいてもalias内のコマンドはレポジトリルートで実行されるので
感ならず**
worktreeの中からgit wa
を実行してももとのレポジトリルートの中の.worktreeに作成されます。
wr
はworktreeを削除するaliasです。
worktree名が直接渡された場合はそのworktreeを削除します。
引数が与えられないか-f
/--force
だけが渡された場合は
現在存在するworktreeの中から選択して削除します。
git worktree list
ではもとのレポジトリルートの位置も表示されるので、
.worktree/
の中にあるものだけを選択できるようにしています。
上ではsentakuを使ってますが、 fzfやpeco など好きなもので。
Worktreeの切り替え
aliasだとディレクトリ移動はできないので、 worktreeの切り替えに関しては以下のようなシェルの関数を作って .bashrcなどで読み込んで起きます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
|
git
コマンドがある場合、まずgit-wc
という関数を定義します。