web-dev-qa-db-ja.com

Windowsでのgitの非難は、「致命的:HEADにそのようなパス<path>がない」と報告します

フォルダー内のファイルに対してgitblameを実行すると、次のようになります。

git blame Foo/FileA.txt

戻ります

fatal: no such path 'Foo/FileA.txt' in HEAD

このファイルがファイルシステムに存在し、同じフォルダー内の他のファイルが正常に非難されていることがはっきりとわかります-では、何が起こっているのでしょうか?

今日はしばらく困惑していたので、この質問と回答を投稿していますが、すべての解決策に当てはまる回答は1つも見つかりませんでした。

13
James World

これは、ファイルシステム上の親フォルダーの名前を、ケースによってのみ異なる新しい名前に変更したためです。一部のファイルは、フォルダーの名前変更の前に発生したコミットで追加されました。これは、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)))を提供する各ファイル

14
James World

別の可能性は、ファイルまたはそれを含むディレクトリがシンボリックリンクであるということです。 ls -lを使用して、これが当てはまることを確認できます。代わりに、ファイルを元の場所のせいにしてみてください。

1
Michael Litvin

ファイルディレクトリから端末に入り、それを非難することはうまくいくでしょう。

0
user2580731