Mercurialでの大文字と小文字を区別しないファイル名の処理
-
04-07-2019 - |
質問
Vista64ではTortoiseHg 0.5(Mercurial 1.0.2を含む)を使用しています。 Mercurial Book からの私の理解では、Mercurialはケース内のファイル名を処理する必要があります-大文字と小文字を区別しないファイルシステム(NTFSなど)での非区別方法。ただし、Mercurialのインストールでは実際に大文字と小文字が区別されます。
>hg status -A foo
C foo
>hg status -A FOO
? FOO
これは、Mercurialのバグか、MercurialのTortoiseHgビルドのバグか、それとも何か別のものですか? WindowsでMercurialから大文字と小文字を区別しないファイル名の処理を実現するにはどうすればよいですか?
解決
この問題はMercurial 1.1で解決されました! リリースノートから:"ケースフォールディングファイルシステムの表面"。
Windowsでは、Mercurialはコマンドライン引数の大文字と小文字を無視するようになりました。
>hg status -A foo
C foo
>hg status -A FOO
C foo
また、大文字と小文字のみが関係するファイル名の変更は新しいファイルではないことも認識しています:
>ren foo FOO
>hg status -A fOO
C foo
これにより、コマンドラインの入力ミスによる変更を見落とすリスクがなくなりました。
ただし、.hgignoreファイルのコンテンツでは大文字と小文字が区別されることに注意してください。これは、glob構文を使用している場合にのみ問題になります。正規表現構文を使用すると、パターンの先頭に(?i)を挿入して、パターンを区別しないようにすることができます。
他のヒント
hgbookを読み間違えたと思います。セクション7.7の紹介では、OSに存在する3つの異なる大文字と小文字の区別について説明していますが、mercurialがこれらのセマンティクスを反映するとは言いません。
セクション7.7.2の「ケースの競合の検出」では、次のように述べています。
作業中に操作する場合 ディレクトリ、Mercurialは ファイルシステムの命名ポリシー 作業ディレクトリがあります。もし ファイルシステムは大文字小文字を保存しますが、 鈍感、Mercurialは扱います 大文字と小文字のみが異なる名前 同じ。
hg status -A FOO
を実行すると、mercurial内で発生するプロセスは次のとおりです。
- ファイル引数「FOO」に一致するファイルがファイルシステムに存在するかどうかを確認します-この時点では大文字と小文字が区別されないため、「foo」が見つかり、「はい、ファイルがあります」と表示されます;
- ファイルマニフェストにファイル引数「FOO」に一致するエントリがあるかどうかを確認します。ない場合は、ステータスに「?」が表示されます。 hgが追跡していないのはディスク上のファイルだと言っています
mercurialがNTFSのケースを気にしないことをよりよく確認するには、次の手順を試してください。
- hg init
- エコー行> Foo
- hg add Foo
- hg commit -m 'committed Foo'
- Foo not-fooを移動
- not-foo FOOを移動
- hgステータス
また、変更されたのはhgがあなたを無視している場合のみであるため、何も変更されていないというhgが表示されるはずです。
Linuxで同じことをすると、代わりに次のように表示されます。
! Foo
? FOO