【问题标题】:"Resulting command line for hg.exe too long" error in MercurialMercurial 中的“导致 hg.exe 的命令行太长”错误
【发布时间】:2010-12-22 18:22:15
【问题描述】:

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

有什么更简单的吗,该死的?

我在 Visual Studio 2010 (http://www.newsupaplex.pp.ru/index_eng.html) 中使用 Tortoise HG,如果它有什么不同的话。

【问题讨论】:

  • 你使用的是哪个 VS 插件?
  • 你试过用 VisualHg 代替吗?
  • 你在说多少个文件?什么版本的 TortoiseHg?
  • 我相信是乌龟 1.1.61。当我尝试提交时,它们大约有 10-20 个文件需要进行更改。
  • 你的目录结构真的很深吗?我从未见过这个错误。

标签: mercurial tortoisehg


【解决方案1】:

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

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

您有三个选择:

  1. 您可以选择在提交窗口中检查所有更改的文件。然后 HgSccPackage 将调用 mercurial 客户端来提交所有文件(无需在命令行参数中传递每一个文件)。
  2. 如果可能,您可以将提交拆分为文件更少的更小的逻辑部分。
  3. 如果可能,请还原一些文件并一次性提交所有其他文件

如果 mercurial 客户端可以选择在文件中传递文件列表(例如 list.txt 在每行中都有文件名),那会容易得多。但是没有这样的选择。

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

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

【讨论】:

  • @devoured 此问题已在 HgSccPackage v1.7 中修复(需要 mercurial v1.8)。现在文件通过 listfile 模式传递给 mercurial。
【解决方案2】:

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

我已经稍微挖掘了包的源代码,显然在调用 Mercurial 的命令时,它最终会在 hg.exe 上使用 Process.Start() 方法并指定 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\

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-31
    • 2015-04-24
    • 2018-01-13
    相关资源
    最近更新 更多