0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

git worktreeで作った環境でDev Containerを使う時にgitを使えるようにする

Posted at

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等のコマンドも動きません。

対処方法

ファイルマウントでメインワークツリーをコンテナ内に含める

対応するには、まずマウント設定でメインワークツリーがコンテナ内に含まれるようにします。

.devcontainer/devcontainer.json(例)
  "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の中身を相対パスに書き換えることでも解決できます。

.git
gitdir: ../my-repo/.git/worktrees/my-repo-2

これはホストでもコンテナにでも両方でgit操作を行いたい場合に有効です。

なおGit 2.48からはgit worktreeコマンドに--relative-pathsというオプションが追加されたそうです。これを使ってもできるかもしれません。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?