跳转到主要内容

一套用于使用Mercurial在本地对Subversion检出的脚本

项目描述


摘要

这套脚本允许使用Mercurial分布式版本控制系统在本地对由Subversion管理的项目进行操作。

为什么使用Mercurial?您可以进行本地(断开连接)工作,从SVN服务器拉取最新更改,管理私有分支,向项目维护者提交补丁等。当然,您还有快速的本地操作,如“hg log”、“hg annotate”...

提供了三个脚本

  • hgimportsvn初始化一个也是Mercurial仓库的SVN检出。
  • hgpullsvn从SVN仓库拉取最新更改,并相应地更新Mercurial仓库。它可以多次运行。
  • hgpushsvn将您的本地Mercurial提交推送到SVN仓库。

示例

检出Django_ trunk:

$ mkdir django && cd django
  # Make SVN checkout, initialize hg repository with first SVN revision
$ hgimportsvn http://code.djangoproject.com/svn/django/trunk/
$ cd trunk
  # Pull all history from SVN, creating a new hg changeset for each SVN rev
$ hgpullsvn

然后进行您的更改,并使用“hg”命令将它们提交到本地。如果您有提交权限,可以将您的更改推送到SVN仓库:

$ hgpushsvn

如果您想查看将推送到SVN的内容,请使用“-n/--dry-run”标志。这类似于“hg outgoing”命令:

$ hgpushsvn --dry-run

.. _Django: https://django.ac.cn


安装

只需键入easy_install hgsvn。如果您的计算机上没有easy_install,请下载并解压缩源tarball,然后键入python setup.py install。要获取更多选项,请键入python setup.py install --help

注意: hgsvn使用ElementTree库。它默认包含在Python 2.5中,如果您使用的是Python 2.4,则设置脚本应自动为您安装它。但是,如果您收到一些错误消息,您可能需要手动安装它(至少有一个用户报告说需要这样做)。

不稳定(开发)版本

只需运行hg clone http://bitbucket.org/andialbrecht/hgsvn hgsvn,您将获得开发仓库的内容。


功能

优雅的操作

hgpullsvn以块的形式请求SVN日志条目,这样拉取历史记录就不会使远程服务器不堪重负。

hgpullsvn可以在任何时候中断,稍后再次运行:您可以增量地拉取历史记录。

元数据

hgsvn反映了提交时间(使用本地时区)和提交者姓名。提交消息可以包含Unicode字符。如果这些复制和重命名发生在分支内,它们也会被反映出来。

标签

hgpullsvn将每个新的Mercurial更改集标记为一个名为'svn.123'的本地标签,其中123是对应的SVN修订版本的数字。选择本地标签是因为它们不会污染hg日志中的多余条目,并且因为SVN修订版本号仅对特定分支有意义:传播它们没有用处(据我所知)。您可以将此标签手动分配以提供hgvsn脚本的仓库操作,从任何修订版本开始。

命名分支

这些脚本鼓励使用命名分支。所有使用hgpullsvn进行的更新都在从SVN URL的最后一个组件命名的分支上执行(例如,如果SVN URL是svn://server/myproj/branches/feature-ZZZ,则hgpullsvn将创建并使用名为'feature-ZZZ'的分支)。

因此,您可以使用自己的命名分支进行本地开发。当您想从SVN仓库获取最新历史记录时,只需使用hgpullsvn即可更新到原始(纯净)分支,同时保留您本地的作业(然后您可以根据需要自行合并)。

这也意味着hg di -r pristine-branch-name将立即为您提供针对纯净分支的补丁,您可以将此补丁提交给项目维护者。

(注意:在涉及多个功能或错误修复的非平凡设置中,您将为每项独立的工作克隆纯净仓库,这仍然会为您快速生成补丁带来命名分支的好处)。

命名分支映射和历史树

可以通过选项--branch=覆盖默认hg-branch命名。

从svn-to-hg分支映射的历史保存到.map文件.hgsvn/branches.map中,字符串对的内容:svn-root-path=hg-branch-name。它可以手动编辑,也可以通过选项--branch-add=添加新对,通过选项-mapbranch=控制更新此文件。

hgpull\pushsvn自动识别当前的hg-branch和svn-branches,并使用此映射来拉\推历史树。现在默认停止在合并点上,要启用此操作,请使用选项:--merge-branch=(push\pull | try<push\pull> | skip ...

当提供映射时,hgpullsvn可以自动打开命名分支作为svn-branch镜像。

hgpushsvn:新svn-branch的开始与当前hg的同步,现在可以执行以下操作:将svn+hg更新到期望分支的基础修订版标签,从那里切换到适当的svn-branch名称,将hg更新到期望分支的某个修订版,运行hgpullsvn -l --branch-add==,使当前hg-branch推送到新的svn。hgpushsvn需要具有期望分支的svn-synched基础,以及有效的分支映射,以便知道将其推送到哪里。

检测父仓库

如果SVN URL是通过从另一个SVN URL复制创建的(这是分支创建的标准方法),则hgimportsvn试图找到与父SVN URL对应的hgsvn仓库。然后通过克隆此仓库在SVN分支创建之前的修订版来创建新仓库。

换句话说,假设您从myworkdir/操作。在myworkdir/trunk中,您已经有一个从svn://server/myproj/trunk同步的hgsvn仓库。然后您运行hgimport svn://server/myproj/branches/new-feature。它会发现'new-feature'分支是通过在rev. 1138处从'trunk'复制创建的。因此,它将通过从'trunk'仓库克隆rev. 1138之前的修订版(例如rev. 1135,由本地标签'svn.1135'标识)来创建'new-feature' hg仓库。

这意味着您将有一个包含两个命名分支的hgsvn仓库:'trunk'包含rev. 1138之前的所有trunk更改集,'new-feature'包含SVN分支中的所有更改集(因此,在rev. 1138之后)。这样,您可以轻松跟踪分支如何从trunk分叉,但也可以进行合并等操作。


局限性

SVN externals故意忽略,不会添加到您的Mercurial仓库中。


历史

hgsvn 0.6.0

  • py3.8支持
  • tox测试

hgsvn 0.5.2!py3简化修复!推送hgsvn 0.5.0!设置更新,win8 powershell修复

hgsvn 0.5.0

  • svnhead书签 - 提供带有书签"svnhead"的最高同步修订版,以及每个分支的最高同步修订版作为"svnhead/<hg_branch_name>"!在hgclient的错误消息中提供py3.4兼容性

hgsvn 0.4.0

  • 提供py3.4兼容性,并由hgsvnpush成功测试

hgsvn 0.3.16!svn:locale:url - 现在解码svn url,可以进行本地化!

  • hgpushsvn --auto-start-branch现在会在svnrepo中创建分支(如果已映射!),hgpush - "通过修订版",修复了一些其他错误!pull - 修复了-l选项的-loose同步修订版
  • setuptools 20迁移
  • 开始Python3.4兼容性

hgsvn 0.3.15!hgpush - 改进分支映射检测,svn复制/添加路径,混合源wc的合并证明,清理wc以避免混合来源,修复了崩溃svn 1.9的提交信息

hgsvn 0.3.13

  • hgpullsvn --noversioned_change=<skip|abort(default)> - 允许在尝试删除未版本化文件时忽略。!修复上述情况中未版本化和缺失文件的崩溃

hgsvn 0.3.12!hgpush - 在具有多个头的当前分支场景中测试了匿名分支。选项-l现在使用当前hg-rev作为在多个匿名分支之间选择或丢弃头部的方向点

hgsvn 0.3.11!hgpush - David Johansen的问题 #107:hgsvn在文件在移动目录中接受删除时失败,已修复

hgsvn 0.3.10

  • hgpush - 现在可以自动检测已启动的svn-branch,该分支尚未同步,并尝试与hg-branch同步。现在只需使用'map'的svn-revision的'svn tag'即可开始同步新的hg-branch。

hgsvn 0.3.9!push - hg v3.4修复了log --follow选项的bug

hgsvn 0.3.8

! hgpush - 现在的-l选项可以忽略WC更改,如果svn状态=未更改

hgsvn 0.3.7

! hgpush - 修复了匿名分支混淆,现在它们不会在trypush和skip模式下干扰,首先推送到的是第一个分支

  • hgpush --autoimport - 现在可以自动在未同步的空svn repo上启动推送
  • pull : merge - 现在在hg合并时自动提示!测试修复unittests

hgsvn 0.3.6

! hgpush - 修复了损坏的hg删除检测

hgsvn 0.3.5

! hglib - 修复处理包含国家字符的文件时的 hg 操作

hgsvn 0.3.4

! svn - 修复确定替换和删除 svn 状态的关键问题!hgpullsvn -l - 现在通常切换到 hg 分支以清理状态

hgsvn 0.3.0

  • hglib - 迁移到这个库以调用 hg 命令。它必须提供更快的执行速度,因为 hgserver 只启动一次并且为所有脚本会话准备好了。hgsvn 0.2.6

! hgpullsvn 修复了由于更新合并更改而 svn 不干净时开始的松散 svn 更改。现在更新后进行更严格的 svn 状态检查

  • hgpullsvn 使用 -f 和 -l 选项,如果 svn 状态是干净的,就不会因 hg 脏状态而中断

hgsvn 0.2.5

! hgpullsvn 现在处理 svn 状态树冲突时注意,忽略一个会导致丢失文件添加/删除更改

hgsvn 0.2.4

! hgpullsvn 从 hg-control 中删除文件尝试“hg forget”,如果“hg remove”不能删除它们!hgpushsvn - 在解决错误报告“运行 'svn cleanup'”后调用 snv 清理

  • hgpushsvn - 现在可以启动没有 syn-revs 但具有已同步分支起始修订和分支映射定义的分支

hgsvn 0.2.3

! hgpushsvn 问题89 - 由最后一个 svn.rev 在最后推送后的“Nothing to do”标记的修订! --svn-accept 默认为 “working”,这有助于解决合并和切换 svn 的冲突

hgsvn 0.2.2

  • --svn-accept 默认为 "working"}

! 评估同步起始点的策略:现在如果没有定义标记修订,它将尝试找到当前 svn 分支中要推送的最后同步修订;如果定义了 --hg-follow,则它尝试将 svn 切换到当前 hg 分支,并找到最后同步的修订;如果定义了标记修订,则它将 svn 切换到它,并从当前 hg 修订开始推送/拉取

hgsvn 0.2.1

  • hgpullsvn --hg-follow - 选项已从 --hg-branch 重命名。
  • hgpushsvn --hg-follow - 在干净的作业目录中,此选项强制 svn 切换到当前 hg-branch 的最后同步修订
  • hgpullsvn "--subrepo=<[break]|skip>" - 如果 'skip' - 拉取时跳过子存储库中发生的更改

hgsvn 0.2.0

改进

  • 添加拉取/推送合并修订的支持,以及推送/拉取相关分支的自动化 --merge-branches = (push/pull | trypush/trypull | skip | break) - 定义如何处理合并点:push/pull - 同步相关分支 skip - 将它们作为普通修订处理 break - 在它们处停止 trypush/trypull - 如果可以,同步分支,否则像 skip 一样处理

    合并分支自动化基于分支映射到 .。此映射累积在 .hgsvn/branches.map 文件中,并且可以手动编辑。通过此选项控制累积:--mapbranch=<[n][o][a]> - 设置 branches.map 更新模式:允许添加、覆盖映射到单个 --branch-add='=' - 添加/覆盖映射

  • hgpullsvn --hg-branch - 拉取可以切换 svn 到当前 hg 分支并从最后同步点拉取。相比之下,标准行为需要从当前 svn 修订拉取

  • hgpushsvn --svnignore-use - 将节点添加到 .hgsvn/.svnignore - 从推送/拉取过程中忽略的文件列表。通常应该有 .hgtags
  •           ``--svn-accept=<X>`` - allow override default ``svn merge --accept`` option
    
  • --terminal-width=x - 声明使用的最大日志行长度

  • --debug - 此选项现在自动设置 --terminal-width=250

hgsvn 0.1.9

改进

  • 改进了处理文件名中包含 @ 符号的文件的处理(问题52)。

  • hgimportsvn --branch=myname 将 SVN 存储库导入到除 'default' 之外名为 myname 的 Mercurial 分支(由 Matthias Benkmann 补丁)。

  • hgpullsvn --svn-retry 重新尝试检索易出问题的连接的信息(由 Stefanus Du Toit 补丁)。

  • 当运行 hgpushsvn 时限制内部 SVN 更新到最后推送的修订(由 ankon 的问题79)。

  • 改进了空目录的同步(由 ankon 的问题77,由 billmichell 报告)。

  • hgpushsvn --keep-author 在向 SVN 提交时保留 hg 日志中给出的作者(由 wwwjfy)。

  • Mercurial 1.7 兼容性(由 easye 的问题91)。

hgsvn 0.1.8

改进

  • 使用 hgimportsvn --local-only 将本地 SVN 检出转换为由 hgsvn 控制的 Mercurial 仓库。设置此标志时无需网络访问(即飞行模式)。此时,Mercurial 的历史记录从 SVN 检出的当前版本开始。由 Matt Fowles 修改。

  • 在将更改推送到 SVN 之前,可以使用 -e/--edit 命令行标志编辑提交消息。问题 #29,由 eliterr 修改。

  • 现在可以使用 hgsvn 与 mq 扩展一起使用。当运行这些命令时,如果应用了 mq 补丁,hgpushsvnhgpullsvn 将会报错退出。问题 #43,由 sterin 修改。

错误修复

  • 修复了在 Windows 上向 SVN 推送新修订版本时删除临时文件的问题。问题 8 由 Daniel Dabrowski 报告。

  • 修改了 'hg log' 命令行参数,这些参数干扰了 .hgrc 文件中的默认选项。问题 12 由 Simon Percivall 报告,初始补丁由 Joel Rosdahl 提供,问题 16 由 Wladimir Palant 报告。

  • hgpushsvn 现在与 Python 2.4 兼容。

  • 如果 SVN 提交包含空提交注释,hgpullsvn 会失败。现在正确处理了空提交消息。

  • 无法导入修订版本 0 的 SVN 仓库。现在可以使用 hgimportsvn 导入空的 SVN 仓库。问题 #13 由 tiktuk 报告。

  • 当从版本控制中删除非空目录时,hgpushsvn 失败。问题 #15 由 Keith Yang 报告。

  • 在 Windows 系统上正确编码提交消息。问题 #19 由 Chunlin Yao 报告并修改。

  • 在将更改推送到 SVN 仓库时,更改模式时修改 svn:executable 属性。问题 #24 由 sterin 报告。

  • 改进了 SVN 消息的解析。问题 #27 和 #14 由 x63 提供补丁。

  • hgpushsvn 删除了工作目录中的未提交更改。问题 #32 由 foxcub 报告。

  • hgpullsvn 在 dry-run 模式下显示了最新检索到的修订版本。问题 #35 由 Dmitriy Morozov 报告。

  • 现在正确创建新子目录。问题 #46 由 Matt Fowles 报告。

  • IanH 进行了多项修复:问题 #64、#94 和 #95。

hgsvn 0.1.7

改进

  • hgpushsvn 已完全集成到本版本。此命令将本地 Mercurial 提交推送到 SVN 仓库。

  • hgpullsvnhgpushsvn 添加了 -n/--dry-run 标志,以列出传入和传出的更改,而不将它们提交到本地或远程仓库。

  • 向所有命令行脚本添加了详细程度。默认详细程度限制了 hgpullsvnhgpushsvn 的输出,仅显示与用户有特定相关性的消息。使用 -v/--verbose 标志将显示附加消息。--debug 标志启用调试消息的输出,包括 shell 命令。

错误修复

  • 由于基于路径认证的 SVN 仓库的日志文件,hgpullsvnhgimportsvn 失败并出现 XML 解析错误。现在静默忽略受限制的路径(问题 5,由 Andreas Sliwka 报告)。

  • 更新了前一个版本中引入的基于 Mercurial 的锁文件机制,以与 Mercurial >= 1.2.0 一起使用。异常类在 Mercurial 1.2.0 中移动(问题 4)。

  • hgpullsvnhgpushsvn 现在可以从工作副本中的任何子目录调用。这两个脚本现在都会注意将其工作目录更改为工作副本的根目录(问题 3)。

  • 当目标目录已经是由 hgsvn 控制的 Mercurial 仓库时,hgimportsvn 将退出并显示错误消息。

  • 在运行 SVN 更新时检测冲突。为了避免在拉取新的 SVN 修订版本时出现冲突,hgpullsvn 在实际从 SVN 拉取新修订版本之前会检查 hg 仓库是否有未提交的更改(问题 6,由 Robert 报告并提供了初始补丁)。

hgsvn 0.1.6

改进

  • 在提交消息前添加前缀 [svn r123](其中 123 是相应的 SVN 修订版本号),而不是仅仅 [svn]。同时,修剪原始提交消息中的前导空格,以避免消息以回车符开头时出现空白更改集摘要。

  • 在工作副本的顶部引入 .hgsvn 私有目录。这允许我们在公共位置存储各种东西,而不会污染基本目录。

  • 引入一个锁文件(命名为 .hgsvn/lock),以禁止在同一个仓库上并行运行两个 hgpullsvn 实例。锁定机制来自 mercurial 的 mercurial.lock。如果 mercurial 包不可用,则使用模拟锁。初始补丁由 Ori Peleg 提供。

  • 为 hgimportsvn 添加了 --no-hgignore 选项,用于源 SVN 仓库已包含版本化 .hgignore 文件的情况。补丁由 Ori Peleg 提供。

  • 现在可以使用 py2exe 将 hgsvn 打包为独立的可执行文件。补丁由 Paul Moore 提供。

  • 当 hg 或 svn 无法执行(例如未安装)时,提供更详细的错误信息。补丁由 Joonas Paalasmaa 提供。

错误修复

  • 当提交消息非常长(> 16000 个字符)时,通过临时文件而不是命令行提供给 Mercurial,这在某些平台上可能会失败。相应的提交消息由 svnmerge 生成。由 Ralf Schmitt 报告。

  • 以连字符开头的文件名被视为 hg 和 SVN 的命令行选项。报告和补丁由 Mirko Friedenhagen 提供。

  • 如果最后映射到多个 SVN 版本的 hg 更改集,则再次尝试使用 hgpullsvn 更新失败。

  • 替换的目录可以添加和删除文件,但这些文件在 SVN 日志中没有提及;我们必须自己检测这些文件。

  • 对(hg 提交,hg 标签)序列的原子性检查更健壮。由 Florent Guillaume 报告。

  • 修复在 Windows 上比较本地文件系统路径时的一个错误。我们现在在比较之前在两个路径上都调用 os.path.normcase。由 Pavol Murin 报告。

hgsvn 0.1.5

改进

  • 在初始导入时,解析 svn:ignore 属性,并根据需要将建议添加到 .hgignore 文件中。默认情况下,这些建议是注释的,因为它们基于 svn:ignore 属性的最新版本,如果盲目启用,可能会使我们错过一些文件。

错误修复

  • 对 Mercurial 0.9.5 的关键修复,该版本对命名分支要求更严格。此错误导致从自动检测的父仓库克隆时 hgimportsvn 失败。
  • 在决定私有 SVN 文件夹(.svn_svn)的名称时尊重 SVN_ASP_DOT_NET_HACK 环境变量。感谢 Anton Daneika 的报告和原始补丁。

打包

  • 更改 setuptools 选项以解决 Fedora 和其他 Linux 发行版下的 bdist_rpm 错误。补丁由 Tim Wegener 提供。

hgsvn 0.1.4

改进

  • 通过引入 -p (--svn-peg) 选项来指定 SVN "peg 版本",以能够拉取已删除(已删除)的 SVN 分支。此选项必须与 hgimportsvn 和 hgpullsvn 一起使用。补丁由 Cameron Hutchison 提供。

错误修复

  • 允许复制非 ASCII 命名的目录(由 Andre Klitzing 报告)。
  • 使 rmtree 在 Windows 上更可靠。感谢 Mark(mwatts42)发现这两个错误及其解决方案。
  • 修复了在 SVN 仓库中存在指向目录的符号链接的问题。补丁由 Cameron Hutchison 提供。
  • 当提交消息包含控制字符时,svn log 可以输出无效的 XML。由 Tim Wegener 报告。

其他

  • 许可协议升级到 GNU GPL v3(或更高版本)。

hgsvn 0.1.3

改进

  • hgpullsvn 中使用 svn log 命令时提高性能(由 Mads Kiilerich 和 Daniel Berlin 建议)。
  • svn info 返回成功返回码时,提供了更不神秘的错误信息。
  • 添加了两个简单的 man 页面。

错误修复

  • Windows 兼容性修复由 Bill Baxter 提供。
  • 在处理整个仓库时,hgimportsvn 失败。
  • 修复了空提交消息时的崩溃问题(也由 Neil Martinsen-Burrell 和 Walter Landry 报告)。
  • 正确处理文件和目录的重命名(由 Bill Baxter 报告)。
  • SVN 允许在提交时在工作副本中混合版本,从而从已删除的文件中复制,但 Mercurial 不接受它(由 Neil Martinsen-Burrell 报告)。

hgsvn 0.1.2

改进

  • 自动生成 .hgignore 文件。它不仅可以使 hg status 等命令的输出更整洁,还能提高速度。
  • hgpullsvn 在面对错误和用户中断时更为健壮。
  • 尽量与 Windows 兼容,不使用命令模块。
  • 移除对 pysvn 库的依赖;我们使用 SVN 命令的 XML 输出选项。

错误修复

  • 修复了父存储库检测中的错误。
  • 检测到 SVN 分支被另一个分支的内容覆盖的恶劣情况(以 Nose trunk 和 0.10-dev 分支为例)。我们无法正确处理这种情况,因此会通过显式消息失败。
  • 在基本存储库 URL 上执行 svn info 不一定成功,请使用特定的项目 URL(由 Larry Hastings 报告)。

hgsvn 0.1.1

错误修复

  • pysvn 并不真正忽略 externals,因此使用命令行执行 svn update(否则我们将得到过时 URL 的失败)。
  • .svn 目录并不总是被忽略。
  • 在大存储库中,一次性添加超过 32765 个文件会失败,因为命令行上的参数太多。
  • 在慢速 SVN 服务器上,分块日志获取算法最终请求了 0 个日志条目。

hgsvn 0.1

初始发布。

项目详情


下载文件

下载适用于您的平台的文件。如果您不确定选择哪一个,请了解更多关于 安装包 的信息。

源代码发行版

hgsvn-0.6.0.tar.gz (103.6 kB 查看哈希值)

上传时间 源代码

构建发行版

hgsvn-0.6.0-py3.8.egg (268.1 kB 查看哈希值)

上传时间 源代码

hgsvn-0.6.0-py2.7.egg (269.6 kB 查看哈希值)

上传时间 源代码