git worktreeで作られたリンクワークツリー(子リポジトリ)をそのままDev Containerで起動するようにすると、コンテナ内でgitがうまく動作せず変更差分を見たりできません。
これはコンテナ内にメインワークツリー(親リポジトリ)が無いのが原因です。.git を見てみれば、リンクワークツリーの.gitにはメインワークツリーのパスが書いてあるだけなので、コンテナ内ではメインワークツリーが参照できなくなるのでこれは当然の挙動ということが分かります。
たとえば以下のような感じでmy-repoというリポジトリのワークツリーmy-repo-2を作ったとします。
$ cd my-repo
$ git worktree add ../my-repo-2
その後、my-repo-2を Dev Containerで開いてもgitを認識しません。VS Codeで差分を検出できませんし、git diff等のコマンドも動きません。
対処方法
ファイルマウントでメインワークツリーをコンテナ内に含める
対応するには、まずマウント設定でメインワークツリーがコンテナ内に含まれるようにします。
"mounts": [
"source=${localWorkspaceFolder}/../my-repo,target=/workspaces/my-repo,type=bind"
],
"workspaceFolder": "/workspaces/${localWorkspaceFolderBasename}"
devcontainer.jsonに上記のような感じの設定を追加して、リンクワークツリーをプロジェクトとしてDev Containerで開いたときに、コンテナ内にメインワークツリーが含まれるようにします。
ワークツリーのパス修正
ワークツリーのパスはホストの絶対パスになっているので、コンテナ内のパスになるよう修正します。コンテナ内でgit worktree repairを使えばOKです。
$ pushd ../my-repo
$ git worktree repair ../my-repo-2
$ popd
cat .gitして、コンテナ内のパスになっていることを確認できます。
別の方法: ワークツリーの相対パス化
.gitの中身が(ホストの)絶対パスになっていてコンテナ内で解決できないのが問題なので、ホストとコンテナ内の相対パスが同一なら.gitの中身を相対パスに書き換えることでも解決できます。
gitdir: ../my-repo/.git/worktrees/my-repo-2
これはホストでもコンテナにでも両方でgit操作を行いたい場合に有効です。
なおGit 2.48からはgit worktreeコマンドに--relative-pathsというオプションが追加されたそうです。これを使ってもできるかもしれません。