5

Vista64でTortoiseHg0.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から大文字と小文字を区別しないファイル名処理を実現するにはどうすればよいですか?

4

2 に答える 2

10

この問題は 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 構文を使用している場合にのみ問題になります。regexp 構文を使用すると、パターンの先頭に (?i) を配置して、それらを非依存にすることができます。

于 2009-02-09T20:16:30.540 に答える
7

hgbook を読み間違えたようです。セクション 7.7 のイントロは、OS に存在する 3 つの異なるタイプの大文字と小文字の区別を説明しているだけであり、mercurial がそれらのセマンティクスを反映するとは言っていません。

セクション 7.7.2 'Detecting case conflicts' の後半で、次のように述べています。

作業ディレクトリで動作している場合、Mercurial は作業ディレクトリがあるファイルシステムの命名ポリシーに従います。ファイルシステムが大文字と小文字を区別しない場合、Mercurial は大文字と小文字のみが異なる名前を同じものとして扱います。

hg status -A FOOMercurial 内で行われているプロセスを実行すると、次のようになります。

  1. ファイル引数「FOO」に一致するファイルがファイル システムに存在するかどうかを確認します。この時点では大文字と小文字が区別されないため、「foo」が検出され、「はい、ファイルがあります」と表示されます。
  2. ファイル引数「FOO」に一致するエントリがファイル マニフェストに存在するかどうかを確認します。存在しないため、ステータスに「?」が表示されます。hgが追跡していないディスク上のファイルだと言っています

NTFS で mercurial が大文字と小文字を区別しないことを確認するには、次の手順を試してください。

  1. hg初期化
  2. エコーライン > フー
  3. hg add Foo
  4. hg commit -m 'コミットされた Foo'
  5. move Foo not-foo
  6. 移動 not-foo FOO
  7. ステータス

変更されたのは hg が無視しているケースのみであるため、何も変更されていないことを示す hg が表示されるはずです。

Linuxで同じことをすると、代わりに次のように表示されます。

! Foo
? FOO
于 2008-10-29T05:16:14.040 に答える