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
- проверьте наличие доступных загрузок на страница репозитория проекта
- если по-прежнему ничего нет, просто клонируйте репозиторий из https://bitbucket.org/remleduff/win32lfn к "d:\Python27\Lib\site-packages\win32lfn\"
- теперь "win32lfn.pyc " должен быть в "d:\Python27\Lib\site-packages\win32lfn\src\"
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 символов-настоящий пробковый!
см.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 _