フォルダー内のファイルに対してgitblameを実行すると、次のようになります。
git blame Foo/FileA.txt
戻ります
fatal: no such path 'Foo/FileA.txt' in HEAD
このファイルがファイルシステムに存在し、同じフォルダー内の他のファイルが正常に非難されていることがはっきりとわかります-では、何が起こっているのでしょうか?
今日はしばらく困惑していたので、この質問と回答を投稿していますが、すべての解決策に当てはまる回答は1つも見つかりませんでした。
これは、ファイルシステム上の親フォルダーの名前を、ケースによってのみ異なる新しい名前に変更したためです。一部のファイルは、フォルダーの名前変更の前に発生したコミットで追加されました。これは、Powershellプロンプトからの再現です。
_mkdir C:\RenameProblem
cd C:\RenameProblem
git init
mkdir foo
"FileA" > foo/FileA.txt
git add foo/FileA.txt
git commit -m "Add FileA"
_
次に、Windowsエクスプローラーで、ディレクトリ「foo」の名前を「Foo」に変更し、Powershellで次の手順を実行します。
_"FileB" > Foo/FileB.txt
git add Foo/FileB.txt
git commit -m "Add FileB"
_
この時点で、_git blame /Foo/FileA.txt
_(フォルダーの名前が変更されたためにタブ補完が生成されます)はそのようなパスエラーなしで失敗しますが、_git blame /Foo/FileB.txt
_または_git blame /foo/FileA.txt
_は成功します。
さらに、_git ls-files Foo
_を呼び出すと、_FileB.txt
_のみがリストされ、_git ls-files foo
_は_FileA.txt
_のみがリストされます。 Windows上にいるのに最適な場所ではありません。
私の場合、フォルダ名の2つのバージョン間で多数のファイルが分割されていました。
これを解決するには、ファイルの名前を_git mv
_に変更します。
_git mv foo/FileA.txt Foo/FileA.txt
git commit -am "Rename foo to Foo"
_
多数のファイルの名前を変更する必要がある場合は、Powershellを少し使用します(また、_git mv
_には_-n
_スイッチがあり、「what-if」ドライランを実行するため、名前の変更を確認できます。正しい):
_git ls-files foo | % { (& git mv $_ $('F' + $_.Substring(1))) }
_
上記では、_git ls-files
_を使用して問題の「foo」フォルダー内のファイルのリストを取得し、これを「ForEach」にパイプして(_%
_はそのショートカットです)、_git mv
_を実行します。元の名前(_$_
_)と新しい名前の「F」および残りのファイル名('F' + $_.Substring(1))
)を提供する各ファイル
別の可能性は、ファイルまたはそれを含むディレクトリがシンボリックリンクであるということです。 ls -l
を使用して、これが当てはまることを確認できます。代わりに、ファイルを元の場所のせいにしてみてください。
ファイルディレクトリから端末に入り、それを非難することはうまくいくでしょう。