Ошибка «Результирующая командная строка для hg.exe too long» в Mercurial - PullRequest
2 голосов
/ 22 декабря 2010

Итак, примерно каждый раз, когда я пытаюсь обновить свои измененные файлы, я получаю эту ужасную ошибку. Затем мне нужно вручную выбрать только некоторые из файлов, определить сообщение фиксации, затем вернуться и выбрать еще несколько файлов, поместить другой текст фиксации и т. Д., И т. Д., Пока я не рассмотрю все измененные файлы.

Есть что-нибудь попроще, черт побери?

Я использую Tortoise HG в Visual Studio 2010 (http://www.newsupaplex.pp.ru/index_eng.html), если это имеет какое-либо значение.

Ответы [ 2 ]

1 голос
/ 27 декабря 2010

HgSccPackage использует клиент командной строки mercurial hg.exe.Существует ограничение на максимальную длину командной строки ~ 2000 символов в .Net Framework API, используемом для запуска внешнего процесса (hg.exe).

И поскольку фиксация должна быть атомарной, HgSccPackage не может завершить работу сэта ошибка.

У вас есть три варианта:

  1. У вас есть возможность проверить все измененные файлы в окне фиксации.Затем HgSccPackage вызовет Mercurial Client для фиксации всех файлов (без передачи каждого аргумента в командной строке).
  2. Если это возможно, вы можете разделить коммит на более мелкие логические части с меньшим количеством файлов.
  3. Если это возможно, верните несколько файлов и зафиксируйте все другие сразу

Было бы намного проще, если бы у клиента Mercurial была возможность передать список файлов в файл (например, список.TXT с именами файлов в каждой строке).Но такой опции нет.

Кстати, HgSccPackage не передает полный путь к файлам.Вместо этого он передает путь к файлу относительно корня хранилища.Итак, довольно странно, что вы достигли предела командной строки.

Сколько файлов вы передаете?Почему вы не можете зафиксировать все файлы?

1 голос
/ 23 декабря 2010

Пакет Mercurial SCC проверяет, не превышает ли полученная командная строка 1700 символов.

Я немного покопался в исходном коде пакета и, очевидно, при вызове команд Mercurial он заканчивается использованием метода Process.Start() на hg.exe с указанным параметром UseShellExecute = false.

Process.Start в документации метода упоминается, что сумма длины аргументов и длины полного пути к процессу не должна превышать 2080, но копать саму .NET Framework мне не удалось найти любое применение этого ограничения. Функция WinAPI CreateProcess (с которой Process.Start фактически завершает вызов) имеет более щедрое ограничение в 32 768 символов.

Так что это может быть ошибка с надстройкой VS.

Что касается меня, когда у меня была похожая проблема, потому что мои проекты были слишком глубоко внутри C:\Documents and Settings\Regent\My Documents\Visual Studio 2010\Projects\ Я просто создал символьную ссылку NTFS и использовал C:\Projects\ впоследствии.

...