Подтвердить что ты не робот

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

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

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

1. Загрузить Mercurial-py

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

2. Загрузить Python

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

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 или выполните то же самое с помощью другого метода
  • Конечно, вы должны адаптировать пути к вашим потребностям.
  • Перезагрузите свой кли после этого, чтобы убедиться, что env. переменная теперь правильно установлена ​​

8. Загрузить win32lfn

  • Проверьте наличие доступных загрузок на странице репозитория проекта
  • Если все еще нет, просто клонируйте репозиторий из https://bitbucket.org/remleduff/win32lfn в "d:\Python27\Lib\site-packages\win32lfn\"
  • Теперь "win32lfn.pyc" должен находиться в "d:\Python27\Lib\site-packages\win32lfn\src \"

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 _