Mercurial: фиксировать файлы с длиной пути более 255 символов (Windows)?

Я пытаюсь зафиксировать иерархию папок в репозитории Out Mercurial, который содержит файлы, абсолютная длина пути которых превышает 255 символов (Windows max. длина пути.)

для этих файлов я получаю сообщение об ошибке, говорящее

система не может найти указанный путь

мы используем TortoiseHg и плагин Eclipse для Mercurial, оба не работают.

кто-нибудь нашел решение для этого? (Я не хочу менять расположение репозитория на моем HD)

5 ответов


существует расширение, которое направлено на решение этой точной задачи. Это:https://www.mercurial-scm.org/wiki/Win32LongFileNamesExtension

Он использует \\?\ имена стилей для прозрачной обработки длинных файлов.

Я автор, дайте мне знать, если это работает для вас.


Я только что установил Аарон Коэн, а он предложил. И он отлично работает с моим TortoiseHG 2.6.1 ! Спасибо, Аарон!

хотя, я хотел бы добавить подробное руководство здесь, потому что я не могу найти...

(по крайней мере, вот что я сделал на моем Win7 x64 - я не уверен, что это самый короткий путь)

1. скачать Mercurial-py

  • обратите внимание на версию Python требуется
  • я загрузил " Mercurial-2.4.2 (64-бит py2.7)"

2. Скачать Python

  • убедитесь, что вы загружаете совместимую версию.
  • я использовал "установщик Windows X86-64 MSI (2.7.3)" link

3. Установить Python

  • я установил его на "D:\Python27"

4. скачать pywin32

  • это требуется Win32LongFileNamesExtension.
  • обратите внимание на номер версии Python в имени файла pywin32.
  • я использовал "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. Сделайте тесты interanal win32lfn

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

10. Создавать резервная копия вашего репозитория.

  • для меня все прошло просто fune, но вы никогда не знаете....

11. Добавить win32lfn в hgrc

[extensions]
win32lfn = d:\Python27\Lib\site-packages\win32lfn\src\win32lfn.py
  • вы можете найти "hgrc" в ".папка НД", в вашем хранилище

12. Проверьте это!


быстрое и грязное решение-сопоставить сетевой диск.

для пути c:\some длинный путь\папка проекта

Map \ \ localhost\c$\некоторый длинный путь\ для привода Z:\

cd z:\project folder
hg push

мы успешно используем это в качестве промежуточного решения перед переходом на более короткие пути.

Плагины mercurial выше выглядят хорошо, но, к сожалению, есть многочисленные ошибки, не связанные с mercurial пути более 255 символов. Например, сбой VS2010 ровно 259 символов-настоящий пробковый!

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


см.https://www.mercurial-scm.org/wiki/Win32LongFileNamesExtension (Аарон указал на него через список рассылки mercurial-devel).

еще один обходной путь без изменения пути к РЕПО можно создать второй путь к нему с помощью точки соединения каталогов. Это может сработать, потому что повторная обработка выполняется на очень низком уровне драйвером файловой системы (или, скорее, некоторым установленным фильтром), поэтому полный путь (Unicode) известен к тому времени и расширение до 260 символов должно работать нормально. Попробуй. Вы можете использовать инструмент mklink в Windows Vista или 7 и junction.exe из Sysinternals в Windows 2000 или более поздней версии. Для mklink убедитесь, что создана точка соединения. Я не уверен, что механизм репарации работает одинаково для символических ссылок каталога (хотя я слабо помню, что это должны).


если у вас нет доступной версии программы Unicode, ограничение составляет 260 символов (включая часть буквы диска). Нет ничего, чтобы обойти это.

однако все функции ANSI реализованы с помощью их аналога Unicode, и поэтому вам может повезти, предоставив полный путь, добавленный \?\. Это мая работа, но, скорее всего, не будет, потому что сама программа не рассматривала ничего за пределами MAX_PATH (= 260). Попросите автора скомпилировать версию Unicode и использовать упомянутый префикс. Это исправит проблему.

Это предел подсистемы Win32. Абсолютный предел длины пути составляет приблизительно 32 767 символов. Примерно потому, что диспетчер объектов Windows может развернуть его (символические ссылки в пространстве имен объектов и подобных).


система Windows 10 под управлением клиента mercurial 4.4.1

расширение Аарона Коэна будет работать, мне нужно было сделать небольшую небольшую настройку

на основе комментария mhaecki по этому потоку: https://bitbucket.org/remleduff/win32lfn/issues/13/not-compatible-with-version-431

в win32lfn.py файл я изменил:

from mercurial import util, osutil,cmdutil
from mercurial.i18n import _

в:

from mercurial import util, cmdutil
from mercurial.cext import osutil
from mercurial.i18n import _