Mercurial中的“hg.exe生成的命令行太长”错误

时间:2010-12-22 18:22:15

标签: mercurial tortoisehg

所以,基本上每当我尝试对我更改的文件进行更新时,我都会遇到这个可怕的错误。然后,我必须手动选择一些文件,定义提交消息,然后返回并选择更多文件,放置其他提交文本等,直到我覆盖所有更改的文件。

有什么比这更简单了吗?

我在Visual Studio 2010中使用Tortoise HG(http://www.newsupaplex.pp.ru/index_eng.html),如果它有任何区别。

2 个答案:

答案 0 :(得分:1)

Mercurial SCC Package检查生成的命令行是否不超过1,700个字符。

我已经挖掘了一下包的源代码,显然在调用Mercurial的命令时,最终会在Process.Start()上使用hg.exe方法指定UseShellExecute = false选项。

Process.Start method's documentation提到参数长度和进程完整路径长度的总和不应超过2080但是挖掘.NET Framework本身我无法找到任何强制执行的限制。 WinAPI CreateProcess函数(Process.Start有效地结束调用)具有32,768个字符的更大限制。

所以它可能是VS插件的错误。

至于我,当我遇到类似的问题,因为我的项目在C:\Documents and Settings\Regent\My Documents\Visual Studio 2010\Projects\内部太深了,我刚刚创建了一个NTFS symbolic link并在之后使用了C:\Projects\

答案 1 :(得分:1)

HgSccPackage使用mercurial命令行客户端hg.exe。 用于运行外部进程(.gg.exe)的.Net框架API中的最大命令行长度限制为~2000个字符。

由于提交必须是原子的,因此HgSccPackage无法完成该错误的操作。

您有三种选择:

  1. 您可以选择在提交窗口中检查所有已更改的文件。然后HgSccPackage将调用mercurial客户端来提交所有文件(不在命令行参数中传递每个文件)。
  2. 如果可能,您可以使用较少的文件将提交拆分为较小的逻辑部分。
  3. 如果可能,请还原一些文件并立即提交所有其他文件
  4. 如果mercurial客户端可以选择在文件中传递文件列表(例如list.txt,每行包含文件名),那将会容易得多。但是没有这样的选择。

    顺便说一句,HgSccPackage没有传递文件的完整路径。相反,它传递相对于存储库根目录的文件路径。所以,这很奇怪,你达到命令行限制。

    你要提交多少文件? 为什么不能提交所有文件?