13

ファイルを含む Mercurial リポジトリにフォルダ階層をコミットしようとしましたが、絶対パスの長さが 255 文字 (Windows の最大パス長) を超えています。

これらのファイルについて、次のエラーメッセージが表示されます

指定されたパスが見つかりません

TortoiseHG と Mercurial 用の Eclipse プラグインを使用していますが、どちらも機能しません。

誰かがこれに対する解決策を見つけましたか? (HD 上のリポジトリの場所を変更したくありません)

4

5 に答える 5

19

この正確な問題を解決することを目的とした拡張機能が存在します。それは: https://www.mercurial-scm.org/wiki/Win32LongFileNamesExtension

\\?\ スタイル名を使用して、長いファイルを透過的に処理します。

私は著者です、それがあなたのために働くかどうか私に知らせてください。

于 2012-05-29T04:01:06.630 に答える
7

彼が提案したように、 Aaron Cohenの拡張機能をインストールしました。そして、それは私の TortoiseHG 2.6.1 で完全に動作します! ありがとう、アーロン!

ただし、詳細なガイドが見つからないため、ここに詳細なガイドを追加したいと思います...

(少なくともこれが私がWin7 x64で行ったことです-これが可能な最短の方法であるかどうかはわかりません)

1. Mercurial-py をダウンロード

  • 必要な Python バージョンに注意してください
  • 「Mercurial-2.4.2 (64-bit py2.7)」をダウンロードしました

2. Python をダウンロード

  • 互換性のあるバージョンをダウンロードしていることを確認してください。
  • 「Windows X86-64 MSI インストーラー (2.7.3)」リンクを使用しました

3. Python をインストールする

  • 「D:\Python27」にインストールしました

4. pywin32 をダウンロードします

  • Win32LongFileNamesExtension で必要です。
  • pywin32 のファイル名にある Python のバージョン番号に注意してください。
  • 「pywin32-218.win32-py2.7.exe」を使用しました

5. pywin32 をインストールします

  • インストーラーが正しい Python インストールを検出したことを確認する
  • 私の場合、「d:\Python27\Lib\site-packages\pywin32_system32\」にインストールされています

6. Mercurial をインストールする

  • インストーラーが正しい Python インストールを検出したことを確認する
  • 私の場合、「d:\Python27\Lib\site-packages\mercurial\」にインストールされています

7. PYTHONPATH 環境変数の設定

setx PYTHONPATH d:\Python27\Lib\site-packages\win32lfn\src;d:\Python27\Lib\site-packages\mercurial\
  • この cli コマンドを使用するか、他の方法を使用して同じことを行います
  • もちろん、必要に応じてパスを調整する必要があります
  • この後、cli を再起動して、env. 変数が正しく設定されるようになりました

8. win32lfn をダウンロード

9. 肛門内の win32lfn テストを行う

cd /D D:\Python27
python d:\Python27\Lib\site-packages\win32lfn\tests\testwin32lfn.py

10. リポジトリのバックアップを作成します。

  • 私にとっては、すべてがうまくいきましたが、あなたは決して知りません....

11. hgrc に win32lfn を追加

[extensions]
win32lfn = d:\Python27\Lib\site-packages\win32lfn\src\win32lfn.py
  • リポジトリ内の「.hg」フォルダーに「hgrc」があります

12. テストしてみよう!

于 2013-01-12T04:14:08.280 に答える
2

手っ取り早い解決策は、ネットワークドライブをマッピングすることです。

パスc:\ some long path\projectフォルダーの場合

\\ localhost \ c $ \ some long path \をドライブZ:\にマップします

cd z:\project folder
hg push

より短いパスに移行する前に、これを暫定的な解決策としてうまく使用しています。

上記のMercurialプラグインは見栄えがしますが、残念ながら、255文字を超えるパスに関連する非Mercurialバグが多数あります。たとえば、正確に259文字でのVS2010の失敗は、本当のコーカーです。

http://support.microsoft.com/kb/2516078

于 2013-01-14T11:14:51.540 に答える
2

https://www.mercurial-scm.org/wiki/Win32LongFileNamesExtensionを参照してください(Aaron が mercurial-devel メーリング リストで指摘しました)。

リポジトリへのパスを変更しない別の回避策は、ディレクトリ ジャンクション ポイントを使用してリポジトリへの 2 つ目のパスを作成することです。再解析はファイル システム ドライバー (または、インストールされているフィルター) によって非常に低いレベルで行われるため、その時点で完全な (Unicode) パスがわかっているため、260 文字を超える拡張は正常に機能するはずです。試してみる。このツールmklinkは Windows Vista または 7 で使用でき、 junction.exeWindows 2000 以降では Sysinternals から使用できます。mklink必ず接合点を作成してください。再解析メカニズムがディレクトリのシンボリックリンクに対して同じように機能するかどうかはわかりません(そうすべきであることをかすかに覚えていますが)。


使用可能なプログラムの Unicode バージョンがない場合、制限は 260 文字 (ドライブ文字部分を含む) です。それを回避するものは何もありません。

ただし、すべての ANSI 関数は対応する Unicode を使用して実装されているため、先頭に\\?\. これは機能するかもしれませんが、プログラム自体がMAX_PATH(= 260) を超えて何も考慮していないため、機能しない可能性があります。作成者に Unicode バージョンをコンパイルしてもらい、私が言及した接頭辞を使用してください。これで問題は解決します。

これは Win32 サブシステムの制限です。絶対パスの長さの制限は、約 32,767 文字です。おおよそ、Windowsのオブジェクトマネージャが展開する可能性があるためです(オブジェクトの名前空間内のシンボリックリンクなど)。

于 2012-05-25T13:19:25.513 に答える