Mercurial: фиксировать файлы длиной более 255 символов (Windows)?
Я пытаюсь перенести иерархию папок в репозиторий Mercurial, который содержит файлы, длина абсолютной длины которых превышает 255 символов (максимальная длина пути к Windows).
Для этих файлов я получаю сообщение об ошибке
Система не может найти указанный путь
Мы используем TortoiseHG и плагин Eclipse для Mercurial, оба не работают.
Кто-нибудь нашел решение для этого?
(Я не хочу менять местоположение репозитория на своем HD)
Ответы
Ответ 1
Существует расширение, которое направлено на решение этой точной проблемы. Это: https://www.mercurial-scm.org/wiki/Win32LongFileNamesExtension
Он использует имена \\?\style для прозрачной обработки длинных файлов.
Я автор, дайте мне знать, если это сработает для вас.
Ответ 2
Я только что установил расширение Aaron Cohen, поскольку он предложил.
И он отлично работает с моим TortoiseHG 2.6.1! Спасибо, Аарон!
Хотя, я хотел бы добавить подробное руководство здесь, потому что я не могу найти его...
(По крайней мере, здесь, что я сделал на моем Win7 x64 - я не уверен, что это самый короткий путь)
- Обратите внимание на требуемую версию Python
- Я загрузил "Mercurial-2.4.2 (64-bit py2.7)"
- Убедитесь, что вы загружаете совместимую версию.
- Я использовал ссылку Windows Installer (2.7.3) Windows X86-64 "
3. Установить Python
- Я установил его на "D:\Python27"
- Требуется 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 или выполните то же самое с помощью другого метода
- Конечно, вы должны адаптировать пути к вашим потребностям.
- Перезагрузите свой кли после этого, чтобы убедиться, что env. переменная теперь правильно установлена
8. Загрузить win32lfn
9. Сделайте межсетевые тесты win32lfn
cd /D D:\Python27
python d:\Python27\Lib\site-packages\win32lfn\tests\testwin32lfn.py
10. Создайте резервную копию своего репозитория.
- Для меня все шло просто, но вы никогда не знаете....
11. Добавьте win32lfn в hgrc
[extensions]
win32lfn = d:\Python27\Lib\site-packages\win32lfn\src\win32lfn.py
- вы можете найти "hgrc" в своей ".hg" папке, внутри вашего репозитория
12. Проверьте это!
Ответ 3
См. https://www.mercurial-scm.org/wiki/Win32LongFileNamesExtension (Аарон указал на него через список рассылки mercurial-devel).
Другим обходным решением без изменения пути к репо может быть создание второго пути к нему с помощью точек соединения каталога. Это может сработать, потому что репарация выполняется на очень низком уровне драйвером файловой системы (или, скорее, с установленным фильтром), поэтому к этому времени известен полный (Unicode) путь, а расширение до 260 символов должно работать нормально. Попробуйте. Вы можете использовать инструмент mklink
в Windows Vista или 7 и junction.exe
из Sysinternals в Windows 2000 или новее. Для mklink
убедитесь, что вы создали точку соединения. Я не уверен, что механизм reparsing работает одинаково для символических ссылок каталога (хотя я слабо помню, что он должен).
Если у вас нет версии Unicode доступной программы, ограничение составляет 260 символов (включая часть буквы диска). Нет ничего, чтобы обойти это.
Тем не менее, все функции ANSI реализованы с помощью их юникодской копии, и поэтому вам может повезти, предоставив полный путь, добавленный с помощью \\?\
. Это может сработать, но, скорее всего, не будет, потому что сама программа не учитывала ничего выше MAX_PATH
(= 260). Попросите автора составить версию Unicode и использовать префикс, о котором я упоминал. Это устранит проблему.
Это предел подсистемы Win32. Абсолютный предел длины пути составляет приблизительно 32 767 символов. Примерно потому, что диспетчер объектов Windows может расширять его (символические ссылки в пространстве имен объектов и т.п.).
Ответ 4
Быстрое и грязное решение - отобразить сетевой диск.
Для пути c:\some long path\project folder
Карта\\localhost\c $\ некоторый длинный путь\для управления Z:\
cd z:\project folder
hg push
Мы используем это успешно в качестве промежуточного решения, прежде чем переходить на более короткие пути.
Меркуриальные плагины выше выглядят хорошо, но, к сожалению, существует множество не-меркуриальных ошибок, связанных с дорожкой более 255 символов. Например, сбой VS2010 на ровно 259 символов - это настоящая пробка!
http://support.microsoft.com/kb/2516078
Ответ 5
Система Windows 10 с клиентом Mercurial 4.4.1
Расширение Aaron Cohen будет работать, мне нужно сделать небольшую небольшую настройку
на основе комментария от 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 _
to:
from mercurial import util, cmdutil
from mercurial.cext import osutil
from mercurial.i18n import _