usakdsteen

ゆうさくですてぃーん

ぎっと:ディレクトリジャンクション内のファイル操作危険なので

Windows7 SP1

Git BASH (MINGW32(MSYS))

$ git --version
git version 2.28.0.windows.1

ディレクトリジャンクション直下のファイルをgit rmすると、当該ファイルが削除されるがディレクトリジャンクション自体も削除される件…

(※ディレクトリジャンクション直下のディレクトリ内のファイル削除だとそうはならない…)

 

再現コード?

 

コマンドプロンプト(cmd.exe)側の操作

C:\temp\> mkdir hoge
C:\temp\> cd hoge
C:\temp\hoge\> echo foo > foo.txt
C:\temp\hoge\> echo bar > bar.txt
C:\temp\hoge\> echo baz > baz.txt
C:\temp\hoge\> mkdir fuga
C:\temp\hoge\> cd fuga
C:\temp\hoge\fuga\> echo pee > pee.txt
C:\temp\hoge\fuga\> echo poo > poo.txt
C:\temp\hoge\fuga\> cd ..
C:\temp\hoge\> cd ..
C:\temp\> mkdir proj
C:\temp\> cd proj
C:\temp\proj\> mklink /J piyo ..\hoge

Git BASH(MINGW32(MSYS))側の操作

user@host MINGW32 /c/temp/
$ cd proj
user@host MINGW32 /c/temp/proj/
$ git init
user@host MINGW32 /c/temp/proj/ (master)
$ git config --add user.name "user"
user@host MINGW32 /c/temp/proj/ (master)
$ git config --add user.email "user@host"
user@host MINGW32 /c/temp/proj/ (master)
$ git add .
user@host MINGW32 /c/temp/proj/ (master)
$ git commit -m "initial commit"
user@host MINGW32 /c/temp/proj/ (master)
$ git rm piyo/bar.txt
user@host MINGW32 /c/temp/proj/ (master)
$ git status
On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        deleted:    piyo/bar.txt

Changes not staged for commit:
  (use "git add/rm <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        deleted:    piyo/baz.txt
        deleted:    piyo/foo.txt
        deleted:    piyo/fuga/pee.txt
        deleted:    piyo/fuga/poo.txt

これはディレクトリジャンクションのpiyoが削除されてることがdirコマンドなりlsコマンドなりすれば確認できる(参照先のhogeは残ってるしhoge内ではbar.txtだけが削除された状態になっている…)

 

 うろおぼえだけど

たしかWindowsディレクトリジャンクションについて、ディレクトリジャンクションに未対応のツールやらアプリやらが存在することが多いから使用には注意しろって、どっかに書いてあった気がする(どこで見たか覚えてねえ…MS以外のサイトかもしれん…

 

docs.microsoft.com

docs.microsoft.com

 

 

 

Git for WindowsリポジトリのIssueを軽く眺めてみたけど

それっぽいissueは見当たらないが(つか英語読めん…)

https://github.com/git-for-windows/git/issues?q=is%3Aissue+junction+is%3Aopen

 

 

まぁそもそもGit BASH(MINGW32)でディレクトリジャンクション内にcdコマンドで移動するとパスを辿れないらしく、色々困ったことにはなる