TortoiseHg 管理器 (仓库验证)
TortoiseHgManager,一个用于 TortoiseHg 的版本库验证工具。
关于 TortoiseHg
TortoiseHg 是一个 Windows shell 扩展程序和一系列用于 Mercurial 分布式版本控制系统的应用程序。
引言
本技巧介绍了一个名为 TortoiseHgManager
的版本库工具,它是为 TortoiseHg
创建的,用于一键验证所有版本库。我假设您已具备 TortoiseHg
和 Mercurial
的基本知识。
背景
Mercurial
版本库的内容存储为名为 ".hg" 的子文件夹。此文件夹包含多个文件,这些文件保存每个跟踪文件的状态和历史记录。此文件夹的完整性对于版本库正常工作至关重要。版本库文件夹中的文件可能会因硬件或软件错误而损坏。人们可能仍然可以提交到损坏的版本库,但获取更早的版本可能不再有效。
版本库验证
Mercurial
和 TortoiseHg
确实提供了一个验证功能来验证版本库的完整性。可以从 TortoiseHg
Workbench 中的 Repository --> Verify 访问验证功能。
此功能一次只能用于一个版本库。但是,要验证所有版本库非常麻烦,因为没有任何功能可以一键完成此操作。
关于 TortoiseHgManager
创建 TortoiseHgManager
是为了自动验证在 TortoiseHg
版本库注册表中注册的所有 Mercurial
版本库。此工具将对所有版本库执行版本库验证并报告其状态。验证失败的版本库数量显示在状态栏中,如下所示
从版本库注册表加载版本库
TortoiseHg
版本库注册表存储在以下位置:"%APPDATA%\TortoiseHg\thg-reporegistry.xml"。TortoiseHgManager
从此文件检索版本库信息。
验证版本库
Mercurial
验证功能用于验证每个版本库,如 TortoiseHg
Workbench 中所示。 命令如下所示
Command: hg --repository <Repository Path> verify --verbose
Mercurial
命令使用 Process
类执行。
Process p = new Process();
p.StartInfo.FileName = "\"C:\\Program Files\\TortoiseHg\\hg.exe\"";
p.StartInfo.Arguments = "--repository \"" +
repositoryPath + "\" verify --verbose"; ;
p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardError = true;
p.StartInfo.UseShellExecute = false;
p.StartInfo.WorkingDirectory = Path.GetDirectoryName(repositoryPath);
p.StartInfo.CreateNoWindow = true;
p.Start();
多线程支持
为避免冻结主窗口,我们采用后台工作程序来管理每个版本库的验证过程。为了加快速度,我们在后台工作程序中使用 Parallel.For
来运行多个验证过程。Parallel.For
的每次迭代都会生成一个线程。
Parallel.For(0, dgRepo.Rows.Count, taskOption, rowIndex =>
{
if (UserAborted) return;
DataGridViewRow ptrRow = dgRepo.Rows[rowIndex];
if (VerifyRepository(Repositories[ptrRow.Index], ref errorMessage))
UpdateStatus(ptrRow, "OK", true);
else
UpdateStatus(ptrRow, "ERROR", false);
});
使用 N 个线程验证 N 个版本库听起来不切实际。当一次运行的线程过多时,它甚至会运行得更慢。为了优化性能,我们通过在 ParallelOption
中设置 MaxDegreeofParallelism
属性来限制 Parallel.For
中的线程。此选项可从应用程序主窗体左上方的 track bar 设置,最大线程数限制为 8。
新功能
推送和拉取更改(2.0 及更高版本)
添加了新功能,可从具有别名“default
”的多个版本库推送或拉取更改。
这对于在本地计算机和远程服务器或外部存储上的多个版本库之间进行同步非常方便。
修复版本库(2.1.0 及更高版本)
添加了新功能,可在版本库验证期间修复状态为“ERROR
”的损坏版本库。
如果版本库因任何原因损坏,此功能可以帮助重新创建变更集,而不会丢失先前变更集的历史记录。
但是,修复损坏版本库的代价是将新的 ID 分配给新的变更集。
历史
- 版本 2.1.0
- 修复了“修复版本库”失败时的无限循环
- 修复了“修复版本库”未触发的问题
- 2.0.0版本
- 新功能:修复损坏的版本库(警告:此功能将创建一个新的变更集 ID)
- 新功能:从默认版本库拉取更改
- 新功能:将更改推送到默认版本库
- 新功能:添加了版本库过滤器
- 1.0.0 版本 - 初始版本