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 ...のようにして仮想環境を使うようにしています。
追記: 2025/10/03
まず、miseのレポジトリのIssuesが閉じられてました。
Discussionsに以下のようなやり取りがあって、作者がIssues嫌いで閉じたようです。
IssuesでやるようなことはDiscussionsでやっている模様。
上記のIssueも消えてしまってちょっとトラックするのに面倒ですが、
このDiscussionに上のIssueはコピー?されている感じです。
また、この問題はすでに
fix: python nested venv path order by elvismacak · Pull Request #6124 · jdx/mise
で解決しているようです。
の9月1日リリースのv2025.9.1でこの修正が入っています。
追記ここまで
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という関数を定義します。