这是命令 reposurgeon,可以使用我们的多个免费在线工作站之一在 OnWorks 免费托管服务提供商中运行,例如 Ubuntu Online、Fedora Online、Windows 在线模拟器或 MAC OS 在线模拟器
程序:
您的姓名
reposurgeon - 储存库的外科手术
概要
再生外科医生 [命令...]
商品描述
在我们看来, 再生外科医生 是为了启用 VCSes(版本控制
系统)不想让您这样做,例如 (a) 编辑过去的评论和元数据,(b)
删除提交,(c) 合并和拆分提交,(d) 删除文件和子树
从回购历史,(e) 合并或嫁接两个或多个回购,以及 (f) 在
二是通过切断父子链接,保留两个子仓库的分支结构。
最初的动机 再生外科医生 是清理存储库创建的工件
转换。 可以预见,当代码需要时,该工具也会有应用程序
出于法律或政策原因从存储库中删除。
保持 再生外科医生 简单灵活,一般不做自己的repository
读写。 相反,它依赖于能够解析和发出命令
由 git-fast-export 创建并由 git-fast-import 读取的流。 这意味着它可以
用于具有快速导出和快速导入实用程序的任何版本控制系统。
git-import 流格式也隐含地定义了一种通用语言primitive
的操作 再生外科医生 说话。
完全支持的系统(那些 再生外科医生 可以读取和写入存储库)
包括 git、hg、bzr、svn、darcs、RCS 和 SRC。 有关完整列表,包含依赖项和
技术说明,类型 比较喜欢 以及 再生外科医生 提示。
写入面向文件的系统 RCS 和 SRC 是通过 rcs-快速导入(1) 并有
一些严重的限制,因为这些系统不能在一个
git-fast-export 流。 有关详细信息和部分内容,请参阅该工具的文档
解决方法。
编写 Subversion 存储库也有一些重要的限制,在
关于使用 Subversion 的部分。
可以使用以下命令读取化石存储库文件 --格式=化石 的选项 读
命令并用 --格式=化石 的选项 写. 忽略模式是
不向任一方向翻译。
CVS 支持只读,不支持写。 对于 CVS, 再生外科医生 必须从内部运行
存储库目录。
有关存储库转换的语用指南,请参阅 数字视频控制系统 移民 如何[1]。
安全 警告
再生外科医生 是一个足够锋利的工具来切割你。 注意不要写一个
存储库处于实际不一致的状态,并将以错误消息终止
而不是在其内部数据结构混乱时继续。 然而,有
你可以用它做很多事情 - 比如将存储的提交时间戳更改为 no
更长时间匹配提交序列 - 完成后可能会造成严重破坏。
谨慎行事并检查您的工作。
另请注意,如果您的 DVCS 执行将提交 ID 加密的常规操作
内容和父链接的哈希值,使用此工具编辑可公开访问的存储库
将是一个坏主意。 所有的外科手术在 再生外科医生 将修改哈希
链,这意味着其他人将无法从回购中提取或推送到回购中。
另请参阅“限制”部分下有关系统特定问题的说明
和保证”。
项目运营
该程序可以以两种模式之一运行,或者作为交互式命令解释器
或以批处理模式执行作为参数给出的命令 再生外科医生 调用
线。 这些模式之间的唯一区别是 (1) 交互模式开始于
打开 'verbose 1' 选项,(2) 在批处理模式下所有错误(包括通常
选择集语法中的可恢复错误)是致命的,并且 (3) 每个命令行参数
以“--”开头的内容已被删除(这尤其意味着 --help 和
--version 将按预期工作)。 此外,在交互模式下,Ctrl-P 和 Ctrl-N 将被
可用于滚动您的命令历史记录和命令关键字的选项卡完成是
可用。
git-fast-import 流由一系列命令组成,这些命令必须在
构建回购的指定顺序; 以免混淆 再生外科医生 命令我们将
将流命令称为 事件 在本文档中。 这些事件是隐含的
从 1 向上编号。 大多数命令需要指定事件序列的选择
这样的数字 再生外科医生 将知道要修改或删除哪些事件。
有关事件类型和语义的所有详细信息,请参阅 git 快速导入(1) 手册页;
本段的其余部分是不耐烦的快速入门。 流中的大多数事件是
提交 描述存储库的修订状态; 这些集团在一个单一的
更改一个或多个评论 文件操作 (文件操作),通常指向 斑点 这
是单个文件的修订状态。 fileop 也可能是删除操作
指示指定的先前存在的文件作为版本的一部分被删除
犯罪; 还有其他一些不太重要的特殊文件类型。
命令 再生外科医生 由命令关键字组成,有时前面是选择
设置,有时后跟空格分隔的参数。 通常可以省略
选择集参数并将其默认为合理的值。
这里有一些激励人心的例子。 这些命令将在之后更详细地解释
选择语法的描述。
:15 编辑 ;; 编辑与标记关联的对象:15
编辑 ;; 编辑所有可编辑对象
29..71 列表;; 列出事件的摘要索引 29..71
236..$ 列表;; 列出从 236 到最后的事件
<#523> 检查 ;; 寻找提交#523; 他们被编号
;; 1-origin 从存储库的开头。
<2317> 检查;; 查找名称为 2317 的标记,提示提交
;; 名为 2317 的分支,或具有旧 ID 的提交
;; 2317.检查发现的内容。 一个简单的数字是
;; 可能是从 Subversion 继承的旧 ID
;; 修订号。
/回归/列表;; 列出所有提交和带有注释的标签或
;; 提交者标头或作者标头包含
;; 字符串“回归”
1..:97 & =T 删除;; 从事件 1 中删除标签以标记 97
[Makefile] 检查 ;; 使用触摸 Makefile 的文件操作检查所有提交
;; 以及文件操作中引用的所有 blob
;; 触摸 Makefile。
:46 小费;; 显示拥有 commit :46 的分支提示。
@dsc(:55) 列表;; 将具有祖先追踪的所有提交显示为 :55
@min([.gitignore]) 删除 .gitignore 删除
;; 删除 repo 中的第一个 .gitignore fileop。
选择 句法
选择集规范语法是一种面向表达式的微型语言。 最多
这种语言的基本术语是位置。 以下种类的原始位置是
支持:
事件编号
纯数字文字被解释为 1-origin 事件序列号。
分数
以冒号开头的数字文字被解释为标记; 查看导入流
用于解释标记语义的格式文档。
标签和分支名称
分支的基本名称(包括 refs/tags 命名空间中的分支)指的是它的
提示提交。 标签的名称等同于它的标记(标签本身的名称,而不是
它所指的提交)。 标记和分支位置用 < > 括起来(角度
括号)以将它们与命令关键字区分开来。
旧 ID
如果名称括号 (< >) 的内容与标签或分支名称不匹配,则
解释器接下来搜索提交的旧 ID。 这在您的时候特别有用
导入了一个 Subversion 转储; 这意味着可以参考它所做的提交
通过它们相应的 Subversion 修订号。
提交编号
名称括号 (< >) 中以 # 开头的数字文字被解释为 1-origin
提交序列号。
$
指最后一个事件。
这些可以通过以下方式分组为集合:
范围
范围是由“..”分隔的两个位置,并且是从
左侧位置并在右侧位置结束(含)。
名单
接受逗号分隔的位置和范围列表,具有明显的含义。
还有一些其他方法可以构造事件集:
可见性集
可见性集是指定一组事件类型的表达式。 它将包括
前导等号,后跟键入字母。 这些是类型字母:
┌──┬────────────────────────────┬───────────────────── ────────┐
│B │ blob │ 大多数默认选择 │
│ │ │ 设置排除斑点; 他们│
│ │ │ 必须被操纵│
│ │ │ 通过他们的提交 │
│ │ │ 都附在。 │
├──┼────────────────────────────┼──────────────────── ──────────┤
│C │ 提交 │ │
├──┼────────────────────────────┼──────────────────── ──────────┤
│D │ all-delete commits │ 这些是工件 │
│ │ │ 由一些较年长的人制作 │
│ │ │ 存储库转换 │
│ │ │ 工具。 │
├──┼────────────────────────────┼──────────────────── ──────────┤
│H │ 头(枝尖)│ │
│ │ 提交 │ │
├──┼────────────────────────────┼──────────────────── ──────────┤
│O │ 孤儿(无父母)│ │
│ │ 提交 │ │
├──┼────────────────────────────┼──────────────────── ──────────┤
│U │ 提交标注为 │ │
│ │ 父母 │ │
├──┼────────────────────────────┼──────────────────── ──────────┤
│Z │ 提交没有文件操作 │ │
├──┼────────────────────────────┼──────────────────── ──────────┤
│M │ 合并(多父)│ │
│ │ 提交 │ │
├──┼────────────────────────────┼──────────────────── ──────────┤
│F │ fork(多子)│ │
│ │ 提交 │ │
├──┼────────────────────────────┼──────────────────── ──────────┤
│L │ 犯下不洁 │ │
│ │ 多行注释 │ │
│ │(无分隔│ │
│ │ 后面的空行 │ │
│ │ 第一) │ │
├──┼────────────────────────────┼──────────────────── ──────────┤
│我 │ 承诺 │ │
│ │ 元数据不能为 │ │
│ │ 解码为UTF-8 │ │
├──┼────────────────────────────┼──────────────────── ──────────┤
│T │ 标签 │ │
├──┼────────────────────────────┼──────────────────── ──────────┤
│R │ 重置 │ │
├──┼────────────────────────────┼──────────────────── ──────────┤
│P │ Passthrough │ 所有事件类型简单 │
│ │ │ 通过, │
│ │ │ 包括评论, │
│ │ │ 进展 命令,和 │
│ │ │ 检查站 命令。 │
├──┼────────────────────────────┼──────────────────── ──────────┤
│N │ Legacy IDs │ 任何匹配 a 的字符串 │
│ │ │ cookie(遗留 ID)│
│ │ │ 格式。 │
└──┴────────────────────────────┴───────────────────── ────────┘
引用
引用名称(用尖括号括起来)解析为单个对象,要么是
提交或标记。
┌────────────────┬──────────────────────────────────┐
│ 类型 │ 解释 │
├──────────────┼──────────────────────────────────┤
│ 标签名称 │ 带有该名称的注释标签 │
├──────────────┼──────────────────────────────────┤
│ 分支名称 │ 分支提示提交 │
├──────────────┼──────────────────────────────────┤
│ 遗留 ID │ 使用遗留 ID 提交 │
├──────────────┼──────────────────────────────────┤
│指定名称 │ 名称等同于由 │ 选择
│ │ 分配 │
└────────────────┴────────────────────────────────┘
请注意,如果带注释的标签和分支具有相同的名称 foo, 会解决
到标签而不是分支提示提交。
日期和行动邮票
尖括号中的日期或行动戳解析为所有匹配的选择集
提交。
┌──────────────────────────────────┬─────────────────── ──────────────────┐
│ 类型 │ 解释 │
├────────────────────────────────┼────────────────── ──────────────────┤
│ RFC3339 时间戳 │ 提交或标记 │
│ │ 时间/日期 │
├────────────────────────────────┼────────────────── ──────────────────┤
│行动戳(时间戳!电子邮件)│ 提交或标记 │
│ │ 时间戳和作者(或 │
│ │ 提交者(如果没有作者)。 │
├────────────────────────────────┼────────────────── ──────────────────┤
│ RFC3339 的 yyyy-mm-dd 部分 │ 所有提交和标签 │
│ 时间戳 │ 日期 │
└──────────────────────────────────┴────────────────── ──────────────────┘
要将匹配细化为单个提交,请使用由 '#' 分隔的 1-origin 索引后缀。
因此 "<2000-02-06T09:35:10Z>" 可以匹配多个提交,但是
"<2000-02-06T09:35:10Z#2>" 只匹配集合中的第二个。
文本搜索
文本搜索表达式是用正斜杠包围的 Python 正则表达式
(要在其中嵌入正斜杠,请使用 Python 字符串转义符,例如 \x2f)。
文本搜索通常与提交和注释的注释字段匹配
标签,或反对他们的作者/提交者姓名,或反对标签的名称; 还有
直通对象的文本。
文本搜索的范围可以用尾随的限定字母改变
削减。 这些如下:
┌────────┬──────────────────────────────────┐
│邮件 │ 解释 │
├────────┼────────────────────────────────────┤
│ 一个 │ 提交中的作者姓名 │
├────────┼────────────────────────────────────┤
│ b │ commit 中的分支名称; 还有│
│ │ 匹配由 │ 引用的 blob
│ │ 提交匹配的分支,│
│ │ 和指向提交的标签│
│ │ 关于修补树枝。 │
├────────┼────────────────────────────────────┤
│ c │ commit 或 tag 的注释文本 │
├────────┼────────────────────────────────────┤
│ r │ 标签中的提交引用或 │
│ │ 重置 │
├────────┼────────────────────────────────────┤
│ p │ 透传文本│
├────────┼────────────────────────────────────┤
│ t │ 标签中的标注器 │
├────────┼────────────────────────────────────┤
│ n │ 标签名称 │
├────────┼────────────────────────────────────┤
│ B │ blob 内容 │
└────────┴──────────────────────────────────┘
多个限定字母可以添加更多搜索范围。
(“b”限定符替换了早期版本中的分支集语法 再生外科医生.)
路径
方括号中的“路径表达式”解析为所有提交和
与匹配给定表达式的路径相关的 blob。 路径表达式本身是
路径文字或用斜杠包围的正则表达式。 之后立马
路径正则表达式的尾随 / 您可以放置任意数量的以下字符
用作标志:'a'、'c'、'D'、“M”、'R'、'C'、'N'。
默认情况下,如果提交的文件操作与提交相关,则路径与提交相关
文件路径 - 修改更改它,删除删除它,重命名和复制它
将其作为源或目标。 当使用 'c' 标志时,含义发生变化:
与提交相关的路径成为结帐中存在的所有路径
那个提交。
当且仅当路径文字恰好是其中之一时,路径文字才匹配提交
与提交相关的路径(不进行前缀或后缀操作)。 特别是一个
如果它对应于所选存储库中的目录,则路径文字将不匹配。
如果正则表达式匹配与提交相关的任何路径,则匹配提交
路径中的任何地方。 如果您希望表达式仅匹配,则可以使用 '^' 或 '$'
在路径的开头或结尾。 当使用 'a' 标志时,路径表达式
选择每个路径都与正则表达式匹配的提交。 这并不总是一个
不带 'a' 标志选择的提交子集,因为它也选择带有
没有相关的路径(例如空提交、删除所有和空树提交)。 如果你
想要避免这些,您可以使用例如'[/regex/] & [/regex/a]'。
标志 'D', "M', 'R', 'C', 'N' 将匹配检查限制为相应的文件操作
类型。 请注意,这意味着“a”匹配更容易(而不是更难)实现。 这些是
与 'c' 一起使用时无 iops。
如果路径或文字匹配 blob 中出现的任何路径
引用该 blob 的修改 fileop。 选择完全匹配的 blob 或
匹配提交,用 =B 或 =C 组成路径表达式。
如果您需要将 '[^/]' 嵌入到您的正则表达式中(例如表达“所有
字符但斜线”),您可以使用 Python 字符串转义,例如 \x2f。
函数调用
表达式语言具有命名的特殊函数。 命名函数的序列
是“@”后跟函数名,后跟括号中的参数。 目前
定义了以下函数:
┌──────┬────────────────────────────────────┐
│姓名 │ 解释 │
├──────┼────────────────────────────────────┤
│min │ 选择的最小成员 │
│ │ 套 │
├──────┼────────────────────────────────────┤
│max │ 一个选择的最大成员 │
│ │ 套 │
├──────┼────────────────────────────────────┤
│amp │ 非空选择集变为 │
│ │ 所有对象,空集是 │
│ │ 返回空│
├──────┼────────────────────────────────────┤
│par │ │ 中提交的所有父母
│ │ 参数集 │
├──────┼────────────────────────────────────┤
│chn │ │ 中提交的所有子项
│ │ 参数集 │
├──────┼────────────────────────────────────┤
│dsc │ 所有提交都来自 │
│ │ 参数集(参数集 │
│ │ 包括) │
├──────┼────────────────────────────────────┤
│anc │ 所有提交给谁的论点 │
│ │ set 是从 (argument │
│ │ 套装包含) │
├──────┼────────────────────────────────────┤
│pre │ 参数集之前的事件; │
│ │ 如果参数设置为空 │
│ │ 包括第一个事件。 │
├──────┼────────────────────────────────────┤
│suc │ 参数集后的事件; │
│ │ 如果参数设置为空 │
│ │ 包括最后一个事件。 │
└──────┴────────────────────────────────────┘
集合表达式可以与运算符结合使用 | 和 &; 这些分别是
联合和交叉。 | 优先级低于交集,但您可以使用
括号 '(' 和 ')' 用于对表达式进行分组,以防出现歧义(这将替换
旧版本语法中使用的大括号)。
任何设置操作后都可以跟“?” 添加集合成员的邻居和参照物。
这扩展了集合以包括集合中所有提交的父项和子项,并且
集合中任何标签和重置的所指对象。 集合中的每个 blob 引用都是
替换为所有引用它的提交。 这 '?' 可以重复以延长
邻域深度。
使用前缀 ~ 设置否定; 它的优先级高于 & 和 | 但低于?
进口 AND 出口
再生外科医生 可以在核心中保存多个存储库状态。 每个人都有一个名字。 在任何给定
时间,可以选择一个进行编辑。 该组中的命令导入存储库、导出
它们,并操纵核心列表和选择。
读 [--格式=化石] [目录|-|<infile]
使用目录名参数,此命令尝试读入
该目录下任何受支持的版本控制系统中的存储库; 没有阅读
参数在当前目录中执行此操作。 如果输出被重定向到一个普通文件,
它将作为快速导入流或 Subversion 转储文件读入。 有一个论据
“-”,此命令从标准文件中读取快速导入流或 Subversion 转储文件
输入(这在使用命令行参数构造的过滤器中很有用)。
如果内容是快速导入流,则提交中的任何“cvs-revision”属性为
被视为指向提交的 CVS 修订 cookie 的换行分隔列表,
并用于参考提升。
如果内容是快速导入流,则采用提交中的任何“legacy-id”属性
成为指向提交的遗留 ID 令牌,用于引用提升。
如果读取位置是 git 存储库并且包含 .git/cvsauthors 文件(例如
被留在原地 混帐 导入 -A) 该文件将被读入,就像它已经被读入一样
给予 作者 读 命令。
如果读取位置是一个目录,并且它的存储库子目录有一个名为
legacy-map,该文件将被读取,就像传递给传统读取命令一样。
如果读取位置是一个文件并且 --格式=化石 被使用,文件是
解释为 Fossil 存储库。
刚刚读入的存储库被添加到加载的存储库列表中并成为
当前,选择手术。 如果它是从一个普通文件和文件名中读取的
以扩展名 .fi 或 .svn 之一结尾,该扩展名将从负载中删除
列表名称。
注意:此命令不采用选择集。
写 [--legacy] [--format=fossil] [--noincremental] [--callout] [>输出文件|-]
将选定的事件转储为代表已编辑存储库的快速导入流; 这
默认选择集是所有事件。 如果有的话,转储到哪里是标准输出
没有参数或参数是“-”,或输出重定向的目标。
或者,如果没有重定向并且参数命名目录,则
存储库重新构建到该目录中,忽略任何选择集; 如果
该目标目录非空,其内容备份到保存目录。
如果写入位置是一个文件并且 --格式=化石 被使用,文件被写入
Fossil 存储库格式。
随着 - 遗产 选项,每个提交的 Legacy-ID 附加到其提交
在写的时候评论。 该选项主要用于调试转换边沿
案例。
如果您指定了一个部分选择集,以便包含一些提交,但它们的
父母不是,输出将包括每个分支的增量转储cookies
选择集之外的原点,就在第一次引用该分支之前
一次提交。 增量转储 cookie 看起来像“refs/heads/foo^0”并且是一个线索
导出流加载器,分支应该粘在预先存在的尖端
同名分支。 这 --无增量 选项会抑制这种行为。
当您指定部分选择集时,包括提交对象会强制
包含它引用的每个 blob 以及引用它的每个标签。
指定部分选择可能会导致某些父标记在
合并与转储中存在的提交不对应。 当这种情况发生并且
- 大喊 选项被指定,写入代码用标注替换合并标记,
父提交的操作戳; 否则父标记将被省略。 进口商
读取带有标注的流转储时将失败; 它旨在由
接枝 命令。
允许指定带有间隙的写入选择集,但不太可能导致
如果由进口商加载,效果会很好。
如果导入器为
首选存储库类型无法消化它们。
注意:要在没有进度表的情况下检查小组提交,请使用 检查.
选择 [重新命名]
选择要操作的命名存储库。 回购的名称通常是基本名称
它是从中加载的目录或文件的,但从标准输入加载的 repos 是
“无名”。 再生外科医生 如果有多个,将添加一个消除歧义的后缀
从同一来源读取。
不带参数,列出当前存储的存储库的名称及其负载
次。 第二列是 '*' 代表当前选择的存储库,'-' 代表其他人。
下降 [重新命名]
从 reposurgeon 的列表中删除一个由参数命名的 repo,释放用于
它的元数据并删除磁盘上的 blob。 没有参数,删除当前选择的
回购。
重命名 重新命名
重命名当前选择的仓库; 需要论证。 如果有就不会做
已经是新名字了。
重建 IN 位置
再生外科医生 可以就地重建更改的存储库。 未跟踪的文件通常会保存
并在签出新存储库的内容时恢复(但请参阅
警告的“保留”命令的文档)。
重建 [目录]
从持有的状态重建存储库 再生外科医生. 这个命令不需要
选择集。
单个参数(如果存在)指定执行操作的目标目录
重建; 如果读取的存储库来自 repo 目录(而不是 git-import
流),它默认为该目录。 如果目标目录是非空的
内容备份到保存目录。 存储库上的文件和目录
保留列表在 repo 重建后从备份目录复制回来。 这
默认保留列表取决于存储库类型,并且可以使用
统计 命令。
If 再生外科医生 有一个非空的遗留映射,它将被写入一个名为
存储库子目录中的 legacy-map 就像通过传统写入命令一样。 (这个
通常是 Subversion 和 CVS 转换的情况。)
保存 [文件...]
将(可能未跟踪的)文件或目录添加到存储库的路径列表中
后从备份目录恢复 重建. 每个参数,如果有的话,是
解释为路径名。 之后显示当前保留列表。
仅当您的版本控制系统缺乏
命令列出版本控制下的文件。 在具有此类命令的系统下(其中
包括 git 和 hg),所有不在存储库点目录下的文件
也不在 reposurgeon 下自动保留临时目录。
不保存 [文件...]
将(可能未跟踪的)文件或目录删除到存储库的路径列表中
后从备份目录恢复 重建. 每个参数,如果有的话,是
解释为路径名。 之后显示当前保留列表。
相关信息 AND 报告
该组中的命令报告有关所选存储库的信息。
这些命令的输出可以单独重定向到命名的输出文件。 在哪里
在语法中指示,您可以使用“>”作为输出文件名的前缀并将其作为
以下论证。 如果您使用“>>”,则打开文件是为了追加而不是写入。
名单 [>输出文件]
这是用于识别要修改的事件的主要命令。 它列出
在由事件序列号和摘要信息的选择集中提交。 这
第一列是原始事件编号,第二列是当地时间的时间戳。 如果
存储库具有旧 ID,它们将显示在第三列中。 领先的
部分评论如下。
邮票 [>输出文件]
显示完整行动图章的替代列表形式,可用作参考
选择。 支持 > 重定向。
类型 [>输出文件]
显示与选择集中的提交关联的分支提示名称。 这些将
不一定与它们的分支字段相同(如果
存储库包含带注释或轻量级标签)。
如果提交位于分支提示,则其提示是其分支名称。 如果只有一个孩子,
它的小费是孩子的小费。 如果它有多个孩子,那么如果有一个孩子
一个匹配的分支名称,它的提示是孩子的提示。 否则这个函数会抛出一个
可恢复的错误。
标签 [>输出文件]
显示标签和重置:三个字段、一个事件编号以及一个类型和一个名称。 分支
与标签关联的提示提交也与类型字段“提交”一起显示。
支持 > 重定向。
统计 [回购名称...] [>输出文件]
报告有关命名存储库的大小统计信息和导入/导出方法信息,
或者没有参数当前选择的存储库。
数 [>输出文件]
报告选择集中的项目计数。 默认设置是
当前选择的回购。 支持 > 重定向。
检查 [>输出文件]
将代表选定事件的快速导入流转储到标准输出。 就像一个
写,除了 (1) 进度表被禁用,以及 (2) 有一个识别
每个事件转储之前的标题。
图形 [>输出文件]
以 DOT 标记语言发出提交图的可视化
graphviz 工具套件。 这可以作为主graphviz渲染程序的输入
点(1),这将产生一个可见的图像。 支持 > 重定向。
您可能会发现这样的脚本很有用:
图 $1 >/tmp/foo$$
贝壳点
当然,您可以替换为您自己喜欢的图像查看器。
尺寸 [>输出文件]
打印每个分支的数据量报告; 接受一个选择集,默认为所有
事件。 这些数字统计了未压缩的 blob、提交和标记注释的大小,以及
其他元数据字符串(每次提交指向它时都会计算一个 blob)。
这些数字不是存储大小的精确度量:它们主要用作
获取有关如何有效分区已成为存储库的信息的方法
大到笨重。
支持 > 重定向。
皮棉 [>输出文件]
查找可能表明存在问题的 DAG 和元数据配置。 目前检查
用于:(1) 中间分支删除,(2) 断开连接的提交,(3) 无父提交,(4)
存在多个根,(5) 提交者和作者 ID 看起来格式不正确
作为 DVCS ID,(6) 多个具有相同分支标签的子链接,从
相同的提交,(7)时间和动作标记冲突。
支持仅发布部分报告的选项; "lint --options" 或 "lint -?"
列出它们。
该命令的选项和输出格式不稳定; 他们可能会改变
请注意,因为添加了更多健全性检查。
外科 营运
这些是 reposurgeon 的其余部分旨在支持的操作。
壁球 [政策...]
在一组选择的事件中合并或删除提交。 默认选择设置为
此命令为空。 对提交以外的事件没有影响,除非 --delete
政策被选中; 请参阅“删除”命令进行讨论。
通常,当一个提交被压缩时,它的文件操作列表(和任何关联的 blob
引用)要么被添加到每个操作列表的开头
提交的子项或附加到每个提交的操作列表
父母。 然后已删除提交的子项将其从其父集中删除并
它的父母添加到他们的父集。
默认是向前挤压,修改子级; 但请参阅政策清单
下面的修饰符以了解如何更改此设置。
警告
很容易弄错一个壁球命令的界限,混淆和
破坏性的结果。 当心认为您可以挤压要合并的选择集
除了最后一个提交到最后一个之外的所有提交; 你实际上要做的是
将它们全部合并到第一次提交 after 选定的集合。
通常,指向组合提交的任何标签也将被推进。 但是看
下面的策略修改器列表以了解如何更改此设置。
在所有操作移动之后,每个更改的文件操作列表都是
简化为最短的标准化形式。 规范化形式检测各种
修改、删除、重命名的组合,简化操作
在不丢失任何信息的情况下尽可能多地排序。
规范化后,文件操作列表可能最终仍包含多个 M
对同一个文件进行操作。 通常,该工具会在发生这种情况时发出警告,但
不尝试解决它。
以下修饰符更改了这些政策:
- 删除
简单地丢弃与删除的提交相关的所有文件操作和标签。
- 合并
丢弃除最后一个之外的所有 M 个操作(和相关的 blob)。
- 推回
将 fileops 附加到父母,而不是附加到孩子。
- 向前推进
为孩子们准备 fileops。 这是默认设置; 它可以在电梯中指定
用于明确意图的脚本。
--标签转发
使用“tagforward”修饰符,已删除提交上的任何标签都会被推送到
第一个孩子而不是被删除。 这是默认设置; 有可能
明确规定。
--标记返回
使用“--tagback”修饰符,已删除提交上的任何标签都会被推回
第一个父级而不是被删除。
- 安静的
禁止有关使用非删除文件操作删除提交的警告消息。
- 抱怨
安静的反面。 可以指定明确性。
在除“--delete”之外的任何这些策略下,删除具有子项的提交
不会撤回该提交所做的更改,因为它们仍将存在于
附加到删除集末尾的版本的 blob。 删除所做的一切
当提交有子项时会丢失有关何时和由谁的元数据信息
这些变化是实际进行的; 删除后,将归因于任何此类更改
到已删除提交的第一个未删除的子项。 预计这
命令将主要用于删除由机械生成的提交
存储库转换器,例如 CVS2SVN.
删除 [政策...]
删除一组选择的事件。 此命令的默认选择集为空。
在一组提交上,这相当于带有 --delete 标志的壁球。 它
无条件删除标签、重置和直通; blob 只能作为
删除指向它们的每个提交的副作用。
分 亲 [孩子]
尝试通过切断两个指定的父子链接来对 repo 进行分区
提交(它们必须相邻)。 不采取一般选择集。 它只是
必须指定父提交,除非在这种情况下它有多个子提交
必须遵循子提交(用逗号分隔)。
如果 repo 被命名为“foo”,你通常会得到两个名为“foo-early”的 repo
和 'foo-late'(早期片段开头的选项和功能事件将
被复制到后期的开头。)。 但是如果提交图会
切割后通过另一条路径保持连接,行为会改变。 在这
情况下,如果父母和孩子在同一个分支“qux”上,则分支段是
重命名为 'qux-early' 和 'qux-late' 但 repo 没有分开。
清除 [小路 | /正则表达式/]...
从回购历史记录的选定部分中删除文件; 默认是整个
历史。 此命令的参数可以是路径或 Python 正则表达式
匹配路径(正则表达式必须用 // 包围来标记)。
涉及匹配文件的所有文件修改 (M) 操作和删除 (D) 操作
选定的事件集与 repo 断开连接并放入删除集。
当工具在选择集中向前移动时,会跟随重命名; 每个触发一个
警告信息。 如果所选文件是复制 (C) 目标,则该副本将被删除并
发出警告信息。 如果所选文件是复制源,则复制目标将是
添加到要删除的路径列表中并发出警告。
执行文件删除后,任何没有剩余文件操作的提交
将被删除,所有指向它们的标签。 提交已删除的文件操作指向
路径集内外都不会被删除,而是被克隆到删除集。
移除集不会被丢弃。 它被组装到一个新的存储库中
添加了后缀“-expunges”的旧版本。 因此,此命令可用于雕刻
按文件路径匹配将存储库分成多个部分。
标签化 [--规范化[--提示删除[--tagify-合并]
搜索空提交并将它们转换为标签。 采用可选的选择集
参数默认为所有提交。 对于选择集中的每个提交,将其转换为
如果没有文件操作,则带有相同消息和作者信息的标签。 默认情况下
不考虑合并提交,即使它们没有文件操作(因此没有树
与他们的第一个父母的差异)。 要更改它,请使用 --tagify-合并 选项。
生成的标签的名称将是“emptycommit-IDENT', 在哪里 IDENT 产生
来自已删除提交的旧 ID,或来自其标记,或来自其在
存储库,如果需要,带有消歧后缀。
随着 --规范化, tagify 更努力地首先检测微不足道的提交
确保选定提交的所有文件操作将在以下情况下产生实际效果
通过快速导入处理。
随着 --提示删除, tagify 还考虑了仅删除所有文件操作的分支提示
成为标记的候选者。 对应的标签获取表单的名称
'提示删除-分店名称' 而不是默认的 'emptycommit-IDENT'.
随着 --tagify-合并, tagify 还标记没有文件操作的合并提交。
完成此操作后,合并链接将移至 yagified 提交的父级。
合并 [-调试}|--变更日志[时间模糊]
扫描具有彼此接近的相同注释的提交运行的选择集
及时(这是一种常见的疤痕组织形式,从较旧的存储库向上转换
面向文件的版本控制系统)。 通过删除除
最后一次提交,按顺序; 来自已删除提交的文件操作被推进到那个
最后一个
可选的第二个参数(如果存在)是以秒为单位的最大时间间隔; 这
默认值为 90 秒。
此命令的默认选择集是 =C,所有提交。 有时你可能
想要限制它,例如避免合并“***空”的无关派系
日志消息 ***" 从 CVS 提升提交。
使用 --debug 选项,显示有关不匹配的消息。
使用 --changelog 选项,任何带有包含字符串 'empty
日志消息'(例如由 CVS 生成)并且只包含一个文件操作
修改以 ChangeLog 结尾的路径被特殊对待。 这样的 ChangeLog 提交是
认为按内容匹配它们之前的任何提交,并且如果
提交者匹配并且提交间隔足够小。 此选项处理一个
自由软件基金会项目使用的约定。
分裂 {在|按} 项目
第一个参数必须是提交位置; 第二个是介词
它指示使用哪种拆分方法。 如果介词是“at”,那么
第三个参数必须是文件操作的整数 1-origin 索引
犯罪。 如果它是 'by',那么第三个参数必须是一个路径名
前缀匹配,路径名匹配首先完成)。
提交被复制并插入到事件序列中的新位置,
紧随其后; 副本成为原件的子代,并且
将其替换为原始子项的父项。 提交元数据重复; 这
然后更改新提交的标记,并添加“bis”作为后缀。
最后,一些文件操作 - 从分割匹配或索引的操作开始
参数 - 从原始提交向前移动到新提交。 法律指标
是 2-n,其中 n 是原始提交中的文件操作数。
加 {D 径 | M 烫发 标记 径 | R 资源 目标 C 资源 目标}
从指定的提交,添加指定的文件操作。
要使 D 操作有效,必须对路径中的路径进行 M 操作
提交的祖先。 要使 M 操作有效,“perm”部分必须是令牌
以 755 或 644 结尾,并且“标记”必须指代提交之前的 blob
地点。 要使 R 或 C 操作有效,必须有 M 操作
提交的祖先中的来源。
去掉 [指数 | 径 | 删除[至 承诺]
从指定的提交中,删除指定的文件操作。 op 必须是 (a) 之一
关键字“删除”,(b) 文件路径,(c) 前面是操作类型集的文件路径(某些
字母 DMRCN 的子集),或 (d) 1-origin 数字索引。 “删除”关键字
选择提交中的所有 D 文件操作; 其他人各选一个。
如果存在“to”子句,则删除的操作将附加到由指定的提交
以下单例选择集。 此选项不能与“删除”结合使用。
请注意,即使删除了 fileop,此命令也不会尝试清除 blob
可能是他们的唯一参考。 此行为可能会在未来版本中更改。
BLOB
在从 :1 开始对其他标记重新编号后,在标记 :2 处创建一个 blob。 数据被取
来自 stdin,这可能是一个 here-doc。 这可以与 add 命令一起使用来打补丁
将合成数据放入存储库。
重新编号
重新编号存储库中的标记,从 :1 到: 在哪里是计数
最后一个标记。 以防万一进口商关心标记顺序或空白
序列。
邮箱输出 [>输出文件]
以 RFC822 格式发出邮件的邮箱文件,表示邮件的内容
存储库元数据。 取一个选择集; 提交以外的集合成员,
带注释的标签和传递被忽略(即,目前,blob 和重置)。
此命令的输出可以选择性地重定向到命名的输出文件。
用“>”前缀文件名并将其作为以下参数。
可能有一个选项 --filter,后跟 = 和 /-封闭的正则表达式。 如果
这是给定的,仅发出名称与其匹配的标头。 在这种情况下
标题的名称包括其尾随冒号。
邮箱输入 [<入档[--改变了 >输出文件]
接受代表邮件内容的 RFC822 格式的邮件邮箱文件
所选提交和带注释的标签中的元数据。 不需要选择集。 如果有
一个参数,它将作为要读取的邮箱文件的名称; 没有争论,
或“-”之一; 从标准输入读取。
用户应该知道修改 Event-Number 或 Event-Mark 字段会改变
来自该消息的更新应用于哪个事件。 这不太可能有好
结果。
如果 Event-Number 和 Event-Mark 字段不存在,则mailbox_in 逻辑将
尝试首先通过 Legacy-ID 匹配提交或标记,然后通过唯一的提交者 ID
和时间戳对。
如果输出被重定向并且出现修饰符“--changed”,则最小的一组
实际进行的修改以可输入的形式写入输出文件
早在。
集场 属性 折扣值
在选定的对象(默认为无)中,将命名字段的每个实例设置为
字符串值。 字符串可以被引用以包含空格,并使用反斜杠
由 Python 字符串转义编解码器解释的转义,例如 \n 和 \t。
尝试设置不存在的属性将被忽略。 属性的有效值为
内部 Python 字段名称; 特别是,对于提交,“comment”和“branch”是
合法的。 有关其他有趣的值,请查阅源代码。
附加 [--rstrip] [>文本]
将文本附加到指定选择集中的提交和标签的注释。 这
text 是命令的第一个标记,可能是带引号的字符串。 C式逃生
字符串中的序列使用 Python 的 string_decode 编解码器进行解释。
如果给出了选项 --rstrip,则注释在新文本出现之前被右剥离
附加。
过滤 [- 贝壳|--正则表达式|- 代替|--德多斯]
通过过滤器在选择集中运行 blob、提交注释或标记注释
在命令行中指定。
在 --dedos 以外的任何模式下,尝试指定一个选择集,包括两者
blob 和非 blob(即提交或标记)会引发错误。 内嵌内容
选择集合包含(仅)BLOB和提交时,会过滤提交
在规范中最早和最新的 blob 所限定的范围内。
过滤 blob 时,如果命令行包含魔法 cookie '%PATHS%',则它是
替换为引用 blob 的所有路径的空格分隔列表。
使用 --shell,该行的其余部分将过滤器指定为 shell 命令。 每个
blob 或注释在标准输入上呈现给过滤器; 内容被替换
无论过滤器向标准输出发出什么。 目前需要 --shell 。
未来将支持其他过滤模式。
使用 --regex,该行的其余部分应该是 Python 正则表达式
写为 /from/to/ 的替换,from 和 to 作为参数传递给
标准 re.sub() 函数,它应用于修改内容。 其实,任何
非空格字符将作为分隔符代替 /; 这使它更容易
在模式中使用 /。 通常只执行第一个这样的替换;
将 'g' 放在斜杠后全局替换,数字文字给出最大值
要执行的替换次数。 其他可用标志限制替换范围
- 'c' 仅用于评论文本,'C' 仅用于提交者姓名,'a' 仅用于作者姓名。
使用--replace,行为类似于--regexp,但不会解释表达式
作为正则表达式。 (这稍微快一点)。
使用--dedos,DOS/Windows 风格的\r\n 行终止符被替换为\n。
转码 编解码器
转码 blob、提交注释和提交者/作者姓名,或标记注释和标记
选择中指定的字符编码设置为 UTF-8 的提交者名称
命令行。
试图指定一个包含 blob 和非 blob 的选择集(即,
提交或标记)引发错误。 当提交中的内联内容被过滤时
选择集包含(仅)blob 并且提交在由
规范中最早和最新的 blob。
encoding 参数必须命名 Python 标准编解码器已知的编解码器之一
图书馆。 特别是,“latin-1”是一个有效的编解码器名称。
此命令中的错误是致命的,因为错误可能会将存储库对象留在
损坏状态。
这个命令的设计背后的理论是存储库可能包含一个
不同的人用于输入提交元数据的混合编码
次。 使用 =I 识别文本中包含非 Unicode 高字节的元数据后,
一个人必须使用上下文来识别哪些特定的编码被用于
特定的事件跨度并编写适当的转码命令来修复它们。
编辑
像mailbox_out一样将事件选择集报告给临时文件,调用编辑器
在它上面,并像mailbox_in一样从结果中更新。 如果不指定编辑器
name 作为第二个参数,它将从 $EDITOR 变量中获取
环境。
通常这个命令会忽略 blob,因为 邮箱输出 做。 但是,如果您指定
由单个 blob 组成的选择集,将直接调用您的编辑器
blob 文件。
时间偏移 抵消 [时区]
将时间偏移应用于所选集中的所有时间/日期戳。 一个偏移参数是
必需的; 它可以采用 [+-]ss、[+-]mm:ss 或 [+-]hh:mm:ss 的形式。 领先的标志是
需要将其与选择表达式区分开来。
您也可以选择以 [+-]hhmm 的形式指定另一个参数,一个时区
字面意思适用。 要应用没有偏移量的时区,请使用偏移量 +0
或 -0。
团结 [ - 修剪] 重新命名...
联合存储库。 命名任意数量的已加载存储库; 他们将联合成
一个联合仓库并从加载列表中删除。 将选择联合回购。
每个 repo 的根(除了最旧的 repo)将作为子级嫁接到
转储中具有先前提交日期的最后一次提交。 最后运行,重复
名称将使用源存储库名称消除歧义(因此,最近的重复项
将优先于旧的)。 所有移植后,标记将重新编号。
新 repo 的名称将是连接的所有部分的名称,由
'+'。 它将没有源目录或首选系统类型。
使用选项 --prune,在每个存在的祖先文件的每个连接 D 操作中
将被添加到根提交之前,然后将使用规则对其进行规范化
用于压缩效果将是只有正确匹配 M、R 和 C 的文件
根中的操作存活下来。
接枝 [ - 修剪] 重新命名
因为当 unite 不能给你足够的控制时。 这个命令可能有两个
表单,由选择集的大小选择。 第一个参数总是
必须是已加载仓库的名称。
如果选择集的大小为 1,则它必须标识当前的单个提交
选择的回购; 在这种情况下,名称 repo 的根将成为指定的子项
犯罪。 如果选择集为空,则命名的 repo 必须包含一个或多个
与当前选择的存储库中的提交匹配的标注。
命名 repo 中的标签和分支以其名称为前缀; 然后它被嫁接
到选定的一个。 命名存储库中的任何其他标注也在
当前选择的上下文。 最后,从负载中删除命名的 repo
名单。
使用选项 --prune,将 deleteall 操作添加到嫁接的根目录中
库。
径 [资源] 重命名 [- 力量}] [目标]
重命名每个选定提交的每个文件操作中的路径。 默认选择集是
所有提交。 第一个参数被解释为要匹配的 Python 正则表达式
反对路径; 第二个可能包含反向引用语法。
通常,如果目标路径已经存在于 fileops 中,或者在
提交的祖先,此命令会引发错误。 随着 - 力量 选项,这些
跳过检查。
路径 [{子|sup}[目录名] [>输出文件]
接受一个选择集。 在没有修饰符的情况下,列出 fileops 触及的所有路径
选择集(默认为整个 repo)。 此报告变体确实
>-重定向。
使用 'sub' 修饰符,取第二个参数,即目录名称并在前面加上
它到每条路径。 使用 'sup' 修饰符,从
每一条路。
合并
创建合并链接。 采用选择集参数,忽略除最低的以外的所有参数
(源)和最高(目标)成员。 从最高成员创建合并链接
(孩子)到最低的(父母)。
取消合并
线性化提交。 采用选择集参数,该参数必须解析为单个
提交,并删除除第一个之外的所有父项。
相当于 父长辈,承诺变基,其中 承诺 是一样的
选择集与 unmerge 和 长辈 是一个集合解析 承诺是第一个
父母(见 父 下面的命令
的主要利益 取消合并 是您不必查找并指定第一个
为自己做父母,节省时间并避免在附近的手术可能会导致错误时发生错误
手动第一个父参数过时。
父 [变基]
更改提交的父列表。 接受一个选择集参数和一个可选的
政策论证。 选择集必须解析为恰好两次提交,最新的
这是要修改的提交,最早的是新的第一个父级。 所有其他
父母链接已清除; 如果需要,您可以使用“合并”命令重新创建它们。
默认情况下,在修改之前计算重新提交的清单; 一种
deleteall 和 fileops 被预先添加,以便清单保持不变,即使
第一个父级已更改。 使用关键字“rebase”作为第三个参数禁止
这种行为 - 没有 deleteall 并且所有后代的树内容都可以
结果修改了。
科 分店名称... {重命名|删除} [ARG]
重命名或删除分支(以及任何相关的重置)。 第一个参数必须是
现有分行名称; 第二个参数必须是动词“重命名”或“删除”之一。
对于“重命名”,第三个参数可以是语法上有效的任何标记
分支名称(但不是现有分支的名称)。 对于“删除”,没有第三个
参数是必需的。
对于任一名称,如果它不包含“/”,则前缀“refs/heads”将被添加。
行李牌 标签名称... {移动|重命名|删除} [参数].
移动、重命名或删除标签。 第一个参数必须是现有的标签名称; 第二
参数必须是动词“移动”、“重命名”或“删除”之一。
对于“移动”,第三个参数必须是单例选择集。 对于“重命名”,
第三个参数可以是任何语法上有效的标记名称(但不是
现有标签的名称)。 对于“删除”,不需要第三个参数。
这个命令的行为很复杂,因为作为标签出现的特征可能是
三件事中的任何一个:(1)真正的标签对象,(2)轻量级标签,实际上是
使用以“refs/tags”开头的公共分支名称提交 - 在这种情况下,标签是
被认为指向序列中的最后一次提交,(3)重置对象。 这些可能
合并发生; 实际上,来自带有注释标签的系统的流导出器
通常将这些中的每一个都表示为一个真正的标签对象 (1),指向的提示提交
一个序列 (2),其中公共分支字段的基名与
标签名称。 生成轻量级标记提交序列 (2) 的导出器可以或
可能不会生成指向其提示提交的重置。
此命令尝试通过最多执行三个操作以自然的方式处理所有组合
对与源名称匹配的任何真实标记、提交序列和重置的操作。 在一个
重命名,全部一起重命名。 在删除中,删除任何匹配的标签或重置;
然后匹配的分支字段被更改以匹配唯一后代的分支
标记的提交,如果有的话。 移动标签时,没有分支字段
更改并发出警告。
尝试删除轻量级标签可能会失败并显示消息“无法确定一个
独特的继任者”。 发生这种情况时,标记处于具有多个子项的提交中
有不同的分支标签。 git的规范有漏洞
快速导入流使其不确定分支标签如何安全
在这种情况下重新分配; 而不是做一些冒险的事情, 再生外科医生 抛出一个
可恢复的错误。
重置 重命名... {移动|重命名|删除} [参数].
移动、重命名或删除重置。 第一个参数必须匹配现有的重置名称;
第二个参数必须是动词“move”、“rename”或“delete”之一。
对于“移动”,第三个参数必须是单例选择集。 对于“重命名”,
第三个参数可以是与语法上有效的重置名称匹配的任何令牌标记
(但不是现有重置的名称)。 对于“删除”,没有第三个参数是
必需的。
对于任一名称,如果它不包含“/”,则前缀“heads/”将被添加。 如果它
不以“refs/”开头,“refs/”在前面。
如果参数是整个引用,则该参数与重置的名称匹配
(refs/heads/FOO 或 refs/tags/FOO 用于某些 FOO 值)或基本名称(例如
FOO),或形式头/FOO 或标签/FOO 的后缀。 不合格的基名是
假定指的是一个头。
重命名重置时,与标记匹配的提交分支字段将与其重命名为
比赛。 删除重置后,匹配的分支字段将更改为匹配分支
关联分支的提示提交的唯一后代(如果有)。
移动重置时,不会更改任何分支字段。
去枝 源分支... [目标分支].
接受一两个参数,必须是源分支和目标分支的名称; 如果
第二个(目标)参数被省略,它默认为 refs/heads/master。 任何尾随
分支名称的一部分被接受为它的同义词; 因此 master 是一样的
参考/负责人/大师。 不采用选择集。
源分支的历史被合并到目标分支的历史中,
成为具有源分支名称的子目录的历史记录。 任何重置
删除源分支。
剥离 [斑点|减少].
减少选定的存储库以使其成为更易于处理的测试用例。 使用这个时
报告错误。
使用修饰符“blob”,将存储库中的每个 blob 替换为一个小的、
自识别存根,保留所有元数据和 DAG 拓扑不变。 这很有用
当您报告错误时,用于将大型存储库减少到测试用例
可管理的大小。
选择集仅对 'blob' 选项有效,默认为所有 blob。
“reduce”模式始终作用于整个存储库。
使用修饰符 'reduce',执行一个拓扑归约,抛出
无趣的提交。 如果提交具有所有文件修改(没有删除或复制
或重命名)并且只有一个祖先和一个后代,那么它可能很无聊。 到
完全无聊,它也不能被任何标签或重置引用。 有趣的
提交并不无聊,或者有一个不无聊的父母或不无聊的孩子。
在没有修饰符的情况下,此命令会去除斑点。
忽略 [重命名]. [翻译]. [默认].
智能处理忽略模式文件。 如果没有存储库,则此命令失败
已选择或未为存储库设置首选写入类型。 它不是
取一个选择集。
如果存在重命名修饰符,此命令将尝试重命名所有忽略模式
文件到任何适合首选类型的文件 - 例如 .gitignore 用于 git,
.hgignore 用于 hg 等。此选项不会导致忽略文件的任何转换
它重命名。
如果存在翻译修饰符,则每个忽略文件的语法翻译为
尝试过。 目前,代码知道的唯一转换是添加一个 '语法:
glob' 标头,如果首选类型是 hg。
如果存在 defaults 修饰符,该命令会尝试添加这些默认值
模式到所有忽略文件。 如果第一次提交没有创建忽略文件,它
将被修改以创建一个包含默认值的。 此命令将出错
更喜欢没有默认忽略模式的类型(特别是 git 和 hg)。 它会
当它知道导入工具已经设置了默认模式时也会出错。
参考 起重
这组命令用于修复格式为的提交中的引用
旧版本控制系统。 一般的工作流程是这样的:首先,查看评论
历史并将所有老式提交引用更改为机器可解析的 cookie。
然后,自动将机器可解析的 cookie 转换为动作标记。 的点
以这种方式划分过程是第一部分很难让机器正确,
而第二部分在人工操作时容易出错。
Subversion cookie 是 [[SVN:ddddd]] 形式的注释子字符串(例如:
[[SVN:2355]] 通过 Subversion 导出器直接读取修订版,从
git-svn 元数据,或匹配嵌入在 blob 数据中的 $Revision$ 标头作为文件名。
CVS cookie 是 [[CVS:filename:revision]] 形式的注释子字符串(例如:
[[CVS:src/README:1.23]] 与 CVS $Id$ 或 $Revision$ 标头匹配的修订版
嵌入到文件名的 blob 数据中。
标记 cookie 的格式为 [[:dddd]],并且只是对指定标记的引用。
当以前的一种形式不方便时,您可能需要手动修补它。
操作戳是 RFC3339 时间戳,后跟一个“!”,后跟作者电子邮件
地址(作者而不是提交者,因为在修补程序时该时间戳不会更改
重播到一个分支)。 它尝试引用不特定于 VCS 的提交。
因此,代替“commit 304a53c2”或“r2355”,“2011-10-25T15:11:09Z![电子邮件保护]".
以下 git 别名允许 git 直接使用动作标记。 将其附加到您的
〜/ .gitconfig; 如果您已经有一个 [alias] 部分,请去掉第一行。
【别名】
# git 戳- 打印 reposurgeon 风格的行动邮票
戳 = 显示 -s --format='%cI!%ce'
# git 提交- 列出匹配的最近提交.
# 还必须在这些参数之后指定要搜索的分支或 --all。
scommit = "!f(){ d=${1%%!*}; a=${1##*!}; arg=\"--until=$d -1\"; if [ $a ! = $1 ]; then arg=\"$arg --committer=$a\"; fi; shift; git rev-list $arg ${1:+\"$@\"}; }; f"
# git 提交- 如上所述,但列出所有匹配的提交。
scommits = "!f(){ d=${1%%!*}; a=${1##*!}; arg=\"--until=$d --after $d\"; if [ $a != $1 ]; then arg=\"$arg --committer=$a\"; fi; shift; git rev-list $arg ${1:+\"$@\"}; }; f"
# git 管理员- 列出匹配的 master 上的最新提交.
smaster = "!f(){ git scommit \"$1\" master --first-parent; }; f"
smasters = "!f(){ git scommits \"$1\" master --first-parent; }; f"
# git shs - 显示 master 上匹配的提交.
shs = "!f(){ stamp=$(git smasters $1); shift; git show ${stamp:?not found} $*; }; f"
# git 日志- 启动 git log 在主人
slog = "!f(){ stamp=$(git smaster $1); shift; git log ${stamp:?not found} $*; }; f"
# git sco - 查看匹配的 master 上的最新提交.
sco = "!f(){ stamp=$(git smaster $1); shift; git checkout ${stamp:?not found} $*; }; f"
在极少数情况下,操作标记不会唯一地指代一次提交。 这是
理论上可能同一作者可能会检查不同分支的修订
在快速导入流中时间戳的一秒分辨率内。 有
对此无能为力; 使用动作图章的工具需要注意
可能性并在发生时发出警告。
为了支持参考提升, 再生外科医生 内部构建一个遗留参考
将旧版本控制系统中的修订标识符与提交相关联的映射。
这个地图的内容来自三个地方: (1) cvs2svn:rev 属性如果
存储库是从 Subversion 转储流中读取的,(2) $Id$ 和 $Revision$ 标头在
存储库文件,以及 (3) 创建的 .git/cvs-revisions 混帐 导入.
提升可能引用的详细顺序是这样的:首先,找到可能的 CVS
和 Subversion 引用 引用 或 =N 可见性集; 然后将它们替换为
等效的cookies; 然后运行 引用 抬 将 cookie 转换为动作标记(使用
旧参考映射中的信息),而无需手动查找。
引用 [名单|编辑|抬] [>输出文件]
使用修饰符“list”,列出可能是 CVS- 的字符串的提交和标记注释
或 Subversion 风格的修订标识符。 当您要更换时,这将很有用
它们具有可自动转换为独立于 VCS 的等效 cookie
行动邮票。 此报告命令支持 >-redirect。 它等价于'=N
列表'。
使用修饰符“编辑”,编辑找到修订 ID 的集合。 这是
相当于“=N 编辑”。
使用修饰符“lift”,尝试解析注释中的 Subversion 和 CVS cookie
使用旧地图转换为行动邮票。 行动邮票是
时间戳/电子邮件/序列号组合唯一标识关联的提交
使用该 blob,如“翻译风格”一节所述。
不保证每一个这样的参考都会得到解决,甚至任何在
一切都会。 通常,来自 Subversion 存储库的历史记录中的所有引用都将
解析,但 CVS 引用不太可能被解析。
宏 AND EXTENSIONS
有时,您需要发出大量非常复杂的手术命令。
类似的表格,并且能够打包该表格很方便,因此您不需要这样做
很多容易出错的打字。 对于那些场合, 再生外科医生 支持简单的形式
宏观扩张。
定义 姓名 身体
定义一个宏。 第一个以空格分隔的标记是名称; 剩下的
line 是正文,除非它是“{”,它开始一个多行宏
以“}”开头的行。
稍后的“do”调用可以调用这个宏。
没有名称或正文的命令“定义”本身会产生一个宏列表。
do 姓名 参数...
展开并执行宏。 第一个以空格分隔的标记是
要调用的宏; 剩余的标记替换宏定义中的 {0}、{1}...(
使用的约定是 Python 格式方法的约定)。 令牌可能包含空格
如果它们是字符串引用的; 字符串引号被剥离。 宏可以调用宏。
如果宏扩展本身不以选择集开头,则无论选择集是什么
在“do”关键字可用于由
扩张。
取消定义 姓名]
取消定义命名的宏。
这里有一个例子来说明你可以如何使用它。 在项目的 CVS 存储库中
使用 GNU ChangeLog 约定,一个非常常见的预转换工件是提交
带有注释“***empty log message***”,它只修改了一个 ChangeLog 条目解释
紧接在它之前的提交。 下列
定义变更日志 <{0}> & /empty log message/ squash --pushback
do changelog 2012-08-14T21:51:35Z
do changelog 2012-08-08T22:52:14Z
do changelog 2012-08-07T04:48:26Z
do changelog 2012-08-08T07:19:09Z
do changelog 2012-07-28T18:40:10Z
相当于更冗长
<2012-08-14T21:51:35Z> & /empty log message/ squash --pushback
<2012-08-08T22:52:14Z> & /empty log message/ squash --pushback
<2012-08-07T04:48:26Z> & /empty log message/ squash --pushback
<2012-08-08T07:19:09Z> & /empty log message/ squash --pushback
<2012-07-28T18:40:10Z> & /empty log message/ squash --pushback
但是您不太可能在输入第一个版本时出现难以察觉的错误。
(还要注意文本正则表达式如何作为防止输入
不引用带有空注释的提交的错误日期。 这是一个真实的世界
来自 groff 的 CVS 到 git 转换的示例。)
当一个宏还不够时,您可以编写和调用自定义 Python 扩展。
EXEC 姓名
从标准输入执行自定义代码(通常是通过 < 重定向的文件)。 用这个
为以后的 eval 调用设置自定义扩展函数。 该代码具有完全访问权限
所有内部数据结构。 定义的函数以后可以访问 评估 调用。
这可以在带有 here-doc 扩展代码的脚本中调用。
评估 函数名
评估当前解释器上下文中的一行代码。 通常这将是一个
调用由前一个 exec 定义的函数。 变量 _知识库 和
_选择 将具有明显的价值。 注意 _选择 将是一个列表
整数,而不是对象。
神器 拆卸
一些命令自动修复与存储库相关的各种工件
订单系统的转换。
作者 [读|写] [文件名] [>文件名]
应用或转储指定选择集的作者地图信息,默认为
所有事件。
来自 CVS 和 Subversion 的提升可能只有存储库主机本地的用户名
提交者和作者 ID。 DVCS 需要电子邮件地址(全网标识符)和
完整的名字。 要提供从一个到另一个的地图,需要一个作者文件
由每行以本地用户 ID 开头,后跟一个“=”(可能是
由空格包围)后跟全名和电子邮件地址,可选
后跟时区偏移字段。 因此:
ferd = Ferd J. Foonly[电子邮件保护]> -0500
一个作者文件可能有以“#”开头的注释行; 这些都被忽略了。
应用作者文件时,提交者和作者元数据中的电子邮件地址
<和@之间匹配的本地ID根据映射替换(这个
处理 git-svn 电梯)。 或者,如果本地 ID 是整个地址,则这是
也被视为匹配(这处理 git-cvsimport 和 cvs2git 所做的事情)
使用“读取”修饰符或不使用修饰符,应用作者映射数据(来自标准
输入或 <-重定向文件)。 如果您正在编辑创建的存储库或转储,可能会很有用
by CVS2GIT 或 git svn 不带 -A 调用。
使用 'write' 修饰符,编写一个可以解释的映射文件 作者
读, 包含每个唯一提交者、作者和标记者的条目(到标准输出
或 <-重定向的映射文件)。 作为建立作者的开始,这可能会有所帮助
文件,但等号右侧的每个部分都需要编辑。
分支化 [路径集]
指定要被视为潜在分支的目录列表(如果
创建副本后没有修改)在分析 Subversion 时
回购。 当 --无分支 使用读取选项。 它默认为
“标准布局”目录集,以及目录中任何无法识别的目录
存储库根。
不带参数,显示当前的分支集。
集合中路径末尾的星号表示“所有直接子目录
这条路径,除非它们是 branchify 集合中另一条(更长)路径的一部分。
请注意,分支集是 reposurgeon 解释器的一个属性,而不是任何
单个存储库,并将在 Subversion 转储文件读取中持续存在。 这可能
如果忘记重新设置会导致意想不到的结果。
分支映射 [/正则表达式/分支/...]
指定用于映射 svn 分支的正则表达式列表
通过分支检测。 如果没有任何表达式匹配应用默认行为,
它将分支映射到最后一个目录的名称,除了主干和“*”
映射到 master 和 root。
不带参数显示当前的正则表达式替换对。 通过“重置”将
清除重置映射。
将每个分支名称与 regex1 匹配,如果匹配,则重写其分支名称
到分支 1。 如果不是,它将尝试 regex2 等等,直到找到匹配的
正则表达式或没有正则表达式。 正则表达式应该在 Python的[2]。
格式。 分支名称可以使用反向引用(参见 Python 中的子函数
文档)。
请注意,正则表达式被附加到 'refs/' 而没有任何需要的
“头/”或“标签/”。 这允许选择正确的分支类型。
虽然上面的语法模板使用斜杠,但任何第一个字符都将用作
分隔符(并且您需要在路径的常见情况下使用不同的分隔符
包含斜线)。
请注意, branchify_map 集是 reposurgeon 解释器的一个属性,而不是
任何单独的存储库,并将在 Subversion 转储文件读取中持续存在。 这可能
如果忘记重新设置会导致意想不到的结果。
考试 树 状态
舱单 [定期 表达] [>输出文件]
采用默认为所有提交的可选选择集参数,以及可选的
Python 正则表达式。 对于选择集中的每个提交,打印映射
该提交树中的所有路径到相应的 blob 标记,镜像哪些文件
将在提交的检出时创建。 如果给出正则表达式,则只有
为匹配的路径打印“路径 - > 标记”行。 此命令支持 > 重定向。
结帐 目录
采用必须解析为单个提交的选择集和第二个参数。
第二个参数被解释为目录名称。 代码树的状态在
该提交在目录下具体化。
差异 [>输出文件]
显示提交之间的差异。 接受一个选择集参数,它必须
解决正好两次提交。 支持输出重定向。
家政
这些由以下内务管理命令支持,没有一个选择
组:
帮助
获取有关解释器命令的帮助。 可选地跟随空格和命令
姓名; 不带参数,列出所有命令。 '? 也调用这个。
壳
执行该行剩余部分中给出的 shell 命令。 '! 也调用这个。
比较喜欢 [回型]
不带参数,描述所有支持的系统的功能。 有论据
(必须是受支持系统的名称)这有两个影响:
首先,如果您阅读的目录中有多个存储库,则 reposurgeon
将阅读首选的(否则它会抱怨它无法在其中进行选择)
他们)。
其次,这将改变 reposurgeon 的首选输出类型。 这意味着
你写一个目录,它会构建一个首选类型的仓库,而不是
它的原始类型(如果有的话)。
如果未明确选择首选类型,则读取存储库(但不是
快速导入流)将隐式设置首选类型为该类型
库。
在旧版本的 reposurgeon 中,此命令更改了所选的类型
存储库,如果有的话。 这种行为与试图解释的相互作用很差
旧 ID 并已被删除。
源类型 [回型]
报告(不带参数)或选择(带一个参数)当前存储库的
源类型。 此类型通常在存储库读取时设置,但可能保持未设置
如果源是流文件。
源类型影响对旧 ID 的解释(出于 =N
可见性设置和“引用”命令)通过控制正则表达式
习惯于认出他们。 如果没有设置首选输出类型,它也可能会改变
从存储库制作的流文件的输出格式。
无论何时读取实时存储库,或当
Subversion 流或 Fossil 转储被解释,但不一定由其他流解释
文件。 产生的流 cvs-快速导出(1) 使用 ——再手术医生 被检测为
简历。 在其他一些情况下,源系统被检测到魔法的存在
内容 blob 中的 $-headers。
仪器仪表
一些命令主要用于调试和回归测试
目的,但在特殊情况下可能有用。
大多数这些命令的输出可以单独重定向到命名输出
文件。 在语法中指示的地方,您可以使用“>”作为输出文件名的前缀并给出
它作为以下参数。
指数 [>输出文件]
显示有关选择集中对象的四列信息:它们的编号、它们的
类型、关联标记(如果没有标记,则为“-”)和因类型而异的汇总字段。 为了
一个分支或标签,它是参考; 对于提交,它是提交分支; 对于一团
它是 blob 中文件的存储库路径。
此命令的默认选择集是 =CTRU,除 blob 之外的所有对象。
解决 [标签文本...]
除了解析选择集表达式并回显结果之外什么都不做
事件编号设置为标准输出。 命令后的行的其余部分是
用作输出的标签。
主要用于回归测试,但可能有助于探索
选择集语言。
分配 [姓名]
计算一个前导选择集并将其分配给一个符号名称。 这是一个错误
分配给已分配的名称或任何现有的分支名称。 作业
可能会被序列突变清除(虽然不是普通的删除); 你会看到一个
发生这种情况时发出警告。
没有选择集和名称,列出所有分配。>
使用它来优化位置和选择计算,否则
重复执行,例如在宏调用中。
取消分配 [姓名]
取消分配一个符号名称。 如果未分配名称,则会引发错误。
名称 [>输出文件]
列出所有已知分支和标签的名称。 告诉你什么是合法的
尖括号和圆括号。
详细 [n]
'verbose 1' 启用进度表和消息,'verbose 0' 禁用它们。 更高
详细级别可用,但仅供开发人员使用。
安静 [on | 折扣]
没有参数,这个命令请求一个安静布尔值的报告; 与
参数 'on' 或 'off' 它被改变。 当安静打开时,随时间变化的报告字段
否则会导致回归测试中的虚假失败被抑制。
打印 输出文本...
除了将其参数行发送到标准输出之外什么都不做。 在回归中很有用
试验。
回音 [数]
'echo 1' 导致每个 再生外科医生 之前要回显到标准输出的命令
它的输出。 这对于构建易于使用的回归测试很有用
用眼球检查。
脚本 文件名 [ARG...]
采用文件名和可选的以下参数。 从文件中读取每一行并
将其作为命令执行。
在脚本执行期间,脚本名称替换字符串 $0 和
可选的以下参数(如果有)替换脚本中的字符串 $1, $2 ... $n
文本。 这是在标记化之前完成的,因此像“foo$1bar”这样的字符串中的 $1 将是
扩大了。 此外,$$ 扩展为当前进程 ID(这可能很有用
对于使用临时文件的脚本)。
在脚本内(并且仅在脚本内) 再生外科医生 接受稍微延长的
语法:首先,以反斜线结尾的行表示命令在
下一行。 这样转义的任意数量的连续行被连接起来,没有
在评估之前结束反斜杠。 其次,一个接受输入的命令
filename 参数可以改为采用 shell 语法中的文字跟随数据
这里-文档。 即:如果文件名被替换为“<
将读取仅由“EOF”组成的终止行的脚本,并将其放置在
临时文件,并将该文件提供给命令并随后删除。 EOF 可能是
替换为任何字符串。 阅读时反斜杠没有特殊含义
这里-文档。
脚本可能有注释。 任何以“#”开头的行都将被忽略。 如果一条线有一个
以一个或多个空格字符开头的尾随位置,后跟“#”,
该尾随部分被忽略。
版本 [版本...]
不带参数,直接显示程序版本和VCS列表
支持的。 带参数,声明主要版本(个位数)或完整版本
(major.minor) 在其中开发了封闭脚本。 程序会出错
如果主要版本发生了变化(这意味着手术语言不是
向后兼容)。
使用版本要求启动提升脚本是一种很好的做法,尤其是
如果您打算将其存档以供日后参考。
提示 [格式...]
将命令提示符格式设置为命令行的值; 使用空命令
行,显示它。 提示格式在每个命令后在 Python 中评估
以下字典替换:
选择
所选存储库的名称,如果当前没有选择,则为 None。
因此,一种有用的格式可能是“rs[%(chosen)s]%%”。
将来可能会添加更多格式项。 默认提示对应于
格式'reposurgeon%%'。 格式行是用 shell quotng of tokens 评估的,所以
可以包含空格。
历史
列出您已进入此会话的命令。
遗产 [读|写[<filename[> 文件名]
应用或列出旧版参考信息。 不采用选择集。 '阅读'
变体从标准输入或 <-重定向的文件名中读取; “写”变体
写入标准输出或 >-redirected 文件名。
遗留参考文件将参考 cookie 映射到(提交者、提交日期、
序列号)对; 这些反过来(应该)唯一地标识一个提交。 格式
是两个空格分隔的字段:cookie 后跟一个动作标记标识
提交。
通常不需要使用此命令。 遗留地图是
通过存储库读取和重建自动保存,存储在
存储库子目录下的文件 legacy-map..
集 [选项]
打开选项标志。 不带参数,列出所有选项
大多数选项都结合特定操作进行了描述
调整。 普遍感兴趣的一个是“compressblob”; 这可以压缩
reposurgeon 用于编辑存储库的内部表示中的 blob 文件。
使用此选项,存储库的读写速度较慢,但编辑
存储库需要更少(有时更少)的磁盘空间。
清除 [选项]
关闭选项标志。 不带参数,列出所有选项
轮廓
启用分析。 配置文件统计信息被转储到作为参数给出的路径。 必须是
初始命令行参数之一,仅收集代码的统计信息
通过“-”执行。
定时
在存储库分析中显示阶段计时的统计信息。 主要有兴趣
开发人员试图加速程序。
出口
退出,报时。 包括在这里是因为,虽然 EOT 也会干净地退出
解释器,此命令报告自启动以来经过的时间。
工作 与 颠覆
reposurgeon 可以读取 Subversion 转储文件或编辑 Subversion 存储库(并且您必须
将其指向存储库,而不是结帐目录)。 reposurgeon分布包括
一个名为“repotool”的脚本,您可以使用它来制作然后增量更新本地
用于编辑或转换目的的远程存储库的镜像。
读 颠覆 储存库
read 命令上的某些可选修饰符会在读取 Subversion 时更改其行为
存储库:
--无分支
抑制分支分析。
--忽略属性
禁止有关丢弃的属性设置的读取时间警告。
--用户忽略
不要从 svn:ignore 属性生成 .gitignore 文件。 相反,只需通过
在历史记录中找到的 .gitignore 文件。
--使用-uuid
如果设置了 --use-uuid 读取选项,则存储库的 UUID 将用作
伪造电子邮件地址时的主机名,一个 git-svn。 否则,地址将是
以 git cvs-import 的方式生成,只需将用户名复制到
地址字段。
这些修饰符可以在 read 动词之后以任何顺序出现在 read 命令行上的任何位置。
它们必须以空格分隔。
以下是用于将 Subversion 存储库中的子目录映射到分支的规则:
1. 在任何给定的时间都有一组符合条件的路径和路径通配符,它们声明
潜在的分支。 参见文档 分支化 关于如何改变这个集合,
它最初由 {trunk, tags/*, branch/* 和 '*'} 组成。
2. 如果存储库没有与路径或路径匹配的目录,则该存储库被认为是“扁平的”
分支集中的通配符。 平面存储库中的所有提交都分配给分支
master,本来是分支结构的东西变成了目录结构。 在这
案例,我们完成了; 所有其他规则都适用于非平面回购。
如果你给选项 --无分支 读取 Subversion 存储库时,分支
分析被跳过,存储库被视为平坦的(左为线性
refs/heads/master 上的提交序列)。 如果您的存储库,这可能很有用
配置非常不寻常,您需要自己进行分支手术。 注意
此选项将禁用混合提交的分区。
3. 如果“trunk”符合条件,它总是成为master分支。
4. 如果 branchify 集合的一个元素以 * 结尾,则它的每个直接子目录都是
被认为是一个潜在的分支。 如果 '*' 在 branchify 集合中(这是真的
默认)除 /trunk、/tags 和 /branches 之外的所有顶级目录也是
被认为是潜在的分支。
5.检查每个潜在的分支,看它在初始之后是否有提交
创建或复制。 如果有这样的提交,它就成为一个分支。 如果没有,它就变成了
标记以保留提交元数据。 (在所有情况下,标签名称或
分支是目录的基本名称。)
6. 顶级目录中的文件被分配给名为“root”的合成分支。
每个仅创建或删除目录的提交(特别是标记的复制提交
和分支,以及仅更改属性的提交)将被转换为标签
以分支命名,包含来自提交的日期/作者/评论元数据。 尽管
这对标签产生了理想的结果,非标签分支(包括主干)也将
以这种方式获取根标签。 这种明显的错误特征已被接受,因此 reposurgeon
永远不会破坏可能有价值的人工生成的元数据; 这取决于
用户手动删除不需要的标签。
Subversion 分支删除变成deletealls,清除当前目录下的文件集
导入流分支。 当分支在其尖端以 deleteall 结束时,deleteall 是
变成了标签。 此规则在中止分支重命名后清除。
偶尔(通常是错误的)一个分支的 Subversion 存储库将包含
涉及多个分支的修订。 这些是通过将它们划分为
多个导入流提交,每个受影响的分支上提交一个。 此类拆分的 Legacy-ID
提交将有一个伪十进制部分 - 例如,如果 Subversion 修订版 2317 触及
三个分支,三个生成的提交将具有 ID 2317.1、2317.2 和 2317.3。
svn:executable 和 svn:special 属性被翻译成权限设置
输入流; svn:executable 变为 100755,svn:special 变为 120000(表示
一个符号链接; blob 内容将是符号链接应解析到的路径)。
由 cvs2svn 生成的任何 cvs2svn:rev 属性都合并到内部映射中
用于参考提升,然后丢弃。
通常,每个目录的 svn:ignore 属性会变成 .gitignore 文件。 实际的 .gitignore
假定 Subversion 目录中的文件是由 git-svn 用户创建的
与原生 Subversion 分开忽略属性并丢弃警告。 到了
允许用户手动将此类文件的内容合并到目标存储库中。 但
这种行为被 --user-ignores 选项反转; 如果打开,.gitignore 文件
通过并丢弃 Subversion svn:ignore 属性。
(无论 --user-ignores 选项的设置如何,在
Subversion 存储库在翻译中总是变成 .gitignores。 假设是
这些日期是从 CVS 到 SVN 提升之前的,应该保留以影响行为
浏览存储库的该部分时。)
svn:mergeinfo 属性被解释。 修订版 A 上的任何 svn:mergeinfo 属性
以修订版 B 结尾的合并源范围产生一个合并链接,使得 B 成为
A的父母
所有其他 Subversion 属性都将被丢弃。 (这可能会在未来的版本中改变。)
最有可能导致语义问题的属性是 svn:eol-style。
然而,由于只更改属性的提交变成了带注释的标签,翻译后的
标签将保留有关设置更改的信息。
Subversion 提交日期的亚秒级分辨率被丢弃; Git想要整数
仅时间戳。
因为快速导入格式不能代表空目录,所以空目录在
Subversion 存储库将在翻译过程中丢失。
通常,Subversion 本地用户名以 git cvs-import 的样式映射; 因此用户
“foo”变成“foo” ",这足以安抚 git 和其他系统
需要电子邮件地址。 使用选项“svn_use_uuid”,用户名被映射到
git-svn 样式,存储库的 UUID 用作电子邮件地址中的假域。 两个都
可以使用 作者 读 命令。
读取 Subversion 流可以将遗留映射写入“遗留”传递
当 repo 写入流文件时。
再生外科医生 努力默默地做正确的事情,但存在 Subversion 边缘情况
它发出警告,因为人类可能需要通过以下方式进行干预和执行修复
手。 以下是它可能发出的不太明显的消息:
用户生成的 .gitignore
此消息意味着 再生外科医生 在 Subversion 中找到了一个 .gitignore 文件
它正在分析的存储库。 这可能是因为有人在使用 git svn
作为一个实时网关,并创建忽略可能会或可能不会与那些
Subversion 忽略属性的生成的 .gitignore 文件将是
翻译成。 您需要做出关于忽略哪组的政策决定
在转换中使用,并可能在读取时设置 --user-ignores 选项以通过
通过用户创建的 .gitignore 文件; 在这种情况下,将不会发出此警告。
无法将非空分支 XXXX 连接到原点
这是一个严重的错误。 再生外科医生 无法从指定的链接中找到链接
分支到主干(主)分支。 提交图将不会完全连接并且
将需要手动修复。
权限信息可能会丢失
文件上的 Subversion 节点更改设置或清除属性,但没有祖先可以
找到了这个文件。 稍后可能会错误地设置可执行文件或符号链接位置
此文件的修订版。 Subversion 用户定义的属性也可能被打乱或
丢失。 通常可以忽略此错误。
属性集
再生外科医生 已检测到用户定义属性的设置,或 Subversion
属性 svn:externals。 这些属性不能在导入流中表达;
用户会收到通知,以防这是转换的阻碍或某些
需要采取纠正措施,但通常可以忽略此错误。 这个警告是
被 --ignore-properties 选项抑制。
仅由文件操作检测到的分支链接
分支链接通常是通过检查 Subversion 目录复制操作推导出来的。 一个
常见用户错误(使用非 Subversion 目录副本创建分支,然后执行
svn add on the竞争)可以打败这个。 尽管 再生外科医生 应该检测和应对
对于大多数这样的副本,您应该检查提交图以检查
分支扎根在正确的地方。
无法标记根提交
Subversion 存储库中最早的提交具有文件操作,而不是
是一个纯粹的目录创建。 这可能意味着您的 Subversion 转储文件是
格式错误,或者您可能试图从增量转储中解除。 与..一起处理
警告。
删除无父母提示删除
此消息可能由 Subversion 分支移动然后重新创建触发
在源名称下。 检查指示的修订版附近以确保重命名
分支连接到主。
中分支全部删除
在分支历史记录的中间发现了 deleteall 操作。 这通常
表示错误地创建了一个 Subversion 标记或分支,后来有人
尝试通过在重新创建之前删除标签/分支目录来撤消错误
复制操作。 仔细检查 deleteall 附近的拓扑,它可能需要
手工黑客。 很有可能 (a) 再生外科医生 翻译将是
不同于其他翻译器(例如 git svn) 产生,并且 (b) 它不会
立即显而易见这是正确的。
找不到副本的分支根
分支分析失败,可能是由于一组文件副本 再生外科医生 思想
它应该解释为一个拙劣的分支创建,但无法推断出历史。
使用 --nobranch 选项。
从集合中不一致地为空
此消息意味着 再生外科医生 未通过内部健全性检查; 这
其内部构建的文件映射所暗示的目录结构与
解析的 Subversion 节点中有什么。 这不应该发生; 看到了就举报
一个错误 再生外科医生.
写作 颠覆 储存库
reposurgeon 支持编写 Subversion 存储库。 由于两者之间的不匹配
Subversion 的本体和 git 导入流的本体,这种支持有一些重要的
限制和错误。
总之,Subversion 存储库历史不会通过 reposurgeon 编辑来回切换。
文件内容更改被保留,但一些元数据不可避免地丢失。 此外,
在 Subversion 中写出 DVCS 历史也会丢失其元数据的重要部分。
详情如下。
编写 Subversion 存储库或转储流会丢弃作者信息,
提交者的姓名,以及提交地址的主机名部分; 只有提交时间戳
并保留提交者电子邮件地址的本地部分,后者成为
颠覆作者字段。 但是,读取 Subversion 存储库并再次写出
将保留作者字段。
导入流时间戳的粒度为 1 秒。 Subversion 的第二部分
提交时间戳将在通过 reposurgeon 的途中丢失。
导入流中不表示空目录。 因此,阅读和写作
Subversion 存储库保留文件内容,但不保留空目录。 它也不是
保证在编辑 Subversion 存储库后,目录的顺序
相对于其他操作的创建和删除将是相同的; 唯一的保证
是在它们中的任何文件之前创建封闭目录。
读取 Subversion 存储库时,reposurgeon 丢弃特殊的目录副本
与分支创建关联的节点。 如果以及当
存储库被写回 Subversion; 相反,每个分支复制节点都来自
original 转换为分支创建加上第一组文件修改
科。
读取 Subversion 存储库时,reposurgeon 也会自动拆分
混合分支提交。 如果存储库被写回,这些不会重新统一。
写入 Subversion 存储库时,所有轻量级标签都变为 Subversion 标签副本
带有空日志注释,以标签基名命名。 提交者名称和时间戳是
从标记指向的提交中复制。 头和标签之间的区别丢失了。
由于前两点,不保证即使修订号也会
在读入然后写出 Subversion 存储库时保持稳定!
Subversion 存储库始终使用标准(主干/标签/分支)布局编写。
因此,经过 reposurgeon 分析的具有非标准形状的存储库将不会
用同样的形状写出来。
在编写 Subversion 存储库时,分支合并被翻译成 svn:mergeinfo
以最简单的方式设置属性 - 作为翻译的 svn:mergeinfo 属性
合并提交列出合并源修订。
Subversion 有一个“流”的概念; 也就是说,命名的历史段对应于
添加路径时创建的文件或目录,添加路径时克隆
复制,并在删除路径时删除。 导入时不保留此信息
流或 reposurgeon 使用的内部表示。 因此,编辑后,
Subversion 历史的流边界可以任意改变。
忽略 模式
再生外科医生 识别受支持的 VCS 如何表示文件忽略(CVS .cvsignore 文件
潜伏在较旧的 Subversion 存储库中未翻译,Subversion 忽略属性,
.gitignore/.hgignore/.bzrignore 文件在其他系统中)并移动忽略声明之间
这些容器在 repo 输入和输出上。 如果忽略模式,这就足够了
是确切的文件名。
然而,当忽略模式是 Unix glob 模式时,翻译可能并不完美
或正则表达式。 这个兼容性表描述了哪些模式将被转换;
“plain”表示没有 glob 或 regexp 语法或否定的普通文件名。
RCS 没有忽略文件或模式,因此不包括在表中。
┌────────────────┬──────────────────┬──────────────┬──── ──────────────────┬──────────────────────┬──────────────── ────────┬────────────────┬────────────┐
│ │ 在 CVS │ 在 svn │ 在 混帐 │ 在 hg │ 在 BZR │ 在 达克斯 │ 在 型钢 │
├──────────────┼─────────────────┼──────────────┼──── ────────────────┼──────────────────────┼──────────────── ────────┼────────────────┼────────────┤
│ 至 │ 全部 │ 全部 │ 全部 │ 全部 │ 普通 │ 全部 │
│ CVS │ │ │ 除外 │ │ 除外 │ │ │
├──────────────┼─────────────────┼──────────────┼──── ────────────────┼──────────────────────┼──────────────── ────────┼────────────────┼────────────┤
│ 至 │ !.PP │ 全部 │ 全部 │ 全部 │ 全部 │ 除外 │ 普通 │ 全部 │
│ svn │ │ │ !-前缀│ │ RE:- 和 │ │ │
├──────────────┼─────────────────┼──────────────┼──── ────────────────┼──────────────────────┼──────────────── ────────┼────────────────┼────────────┤
│ 至 │ 全部 │ 全部 │ 全部 │ 全部 │ 除外 │ 普通 │ 全部 │
│ 混帐 │ │ │ │ 除了 │ RE:-前缀 │ │ │
├──────────────┼─────────────────┼──────────────┼──── ────────────────┼──────────────────────┼──────────────── ────────┼────────────────┼────────────┤
│ 至 │ 全部 │ 全部 │ 所有除外 │ 所有 │ 所有除外 │ 普通 │ 所有 │
│ hg │ 除了 │ │ !-前缀 │ │ RE:- 和 │ │ │
├──────────────┼─────────────────┼──────────────┼──── ────────────────┼──────────────────────┼──────────────── ────────┼────────────────┼────────────┤
│ 至 │ 全部 │ 全部 │ 全部 │ 全部 │ 普通 │ 全部 │
│ BZR │ │ │ │ │ │ │
├──────────────┼─────────────────┼──────────────┼──── ────────────────┼──────────────────────┼──────────────── ────────┼────────────────┼────────────┤
│ 至 │平原│平原│平原│平原│平原│所有│所有│
│ 达克斯 │ │ │ │ │ │ │
├──────────────┼─────────────────┼──────────────┼──── ────────────────┼──────────────────────┼──────────────── ────────┼────────────────┼────────────┤
│ 至 │ 全部 │ 全部 │ 所有除外 │ 所有 │ 所有除外 │ 普通 │ 所有 │
│ 型钢 │ 除了 │ │ !-前缀 │ │ RE:- 和 │ │ │
└──────────────┴──────────────────┴──────────────┴──── ────────────────┴──────────────────────┴────────────── ────────┴────────────────┴────────────┘
表的 hg 行和列描述了与 hg 的 glob 语法的兼容性,而不是
比其默认的正则表达式语法。 从任何写入 hg 存储库时
另一种, 再生外科医生 在输出 .hgignore 前面加上“syntax: glob”行。
翻译 风格
转换 CVS 或 SVN 存储库后,检查并删除头部的 $-cookies
文件的修订版本。 完整的 Subversion 集是 $Date:, $Revision:, $Author:,
$HeadURL 和 $Id:。 CVS 使用 $Author:, $Date:, $Header:, $Id:, $Log:, $Revision:, 也
(很少)$Locker:、$Name:、$RCSfile:、$Source: 和 $State:。
当您需要指定提交时,请使用 action-stamp 格式 引用 抬
当它可以解析注释中的 SVN 或 CVS 引用时生成。 最好是你
而不去 变化 在 Free Introduction 格式,即使是像省略“Z”或改变“T”这样的微不足道的方式
或者 '!' 或者 ':'。 使行动邮票统一和机器可解析将有好处
对未来存储库浏览工具的影响。
有时,在转换存储库时,您可能需要插入解释性注释 - 对于
例如,如果元数据出现乱码或丢失,您需要指出这一事实。 它是
如果对此有高度统一的语法,则对存储库浏览工具很有帮助
不太可能出现在存储库评论中。 我们建议将翻译注释放在 [[
]]。 这具有在视觉上类似于 [ ] 传统上用于
文本中的编辑评论。
在存储库的根提交的注释中包含一个很好的做法
记下转换工作的日期和归属,并解释这些约定。 例子:
[[这个存储库由 Eric S. Raymond 于 2011-10-24 从 Subversion 转换为 git
<[电子邮件保护]>. 在这里和其他地方,转换注释都包含在双正方形中
括号。 cvs2svn 生成的垃圾提交已被删除,提交引用已被删除
映射成一个统一的独立于 VCS 的语法,一些注释被编辑成
摘要加续表。]]
在转换点包含生成的标签也是一种很好的做法。 例如
邮箱输入 --create <
标签名称:git-conversion
标记此存储库从 Subversion 转换为 git 的位置。
EOF
高级课程 示例
定义 lastchange {
@max(=B & [/ChangeLog/] & /{0}/B)? 列表
}
列出引用包含指定字符串的 ChangeLog 文件的最后一次提交。 (这
诀窍是什么? 扩展由最后一个符合条件的 ChangeLog 组成的单例集
blob 到其引用提交集,以及 名单只注意到提交。)
流 句法 EXTENSIONS
“reposurgeon”中的事件流解析器支持一些扩展语法。 出口商设计
与“reposurgeon”一起工作可能有一个 --reposurgeon 选项,可以发射
扩展语法; 值得注意的是,这是真的 cvs-快速导出(1). 这剩下的
部分描述了这些语法扩展。 他们设置的属性(通常)被保留
并在写入流文件时重新输出。
快速导入流中注释行开头的标记“#reposurgeon”
reposurgeon 剩余部分是由“reposurgeon”解释的扩展命令。
实现了一个这样的扩展命令: #源类型,其行为与
再生外科医生源类型 命令。 名为“frobozz”的版本控制系统的导出器
例如,可以说
#reposurgeon 源类型 frobozz
在提交中,“#legacy-id”形式的神奇注释声明了来自
流文件的源版本控制系统。
还接受了用于设置每次提交属性的 bzr 语法。 在解析提交时
语法,以标记“property”开头的行必须以
以空格分隔的属性名称标记。 如果它后面跟着一个换行符,它就会被采用
将该布尔值属性设置为 true。 否则它必须后跟一个数字
指定数据长度、空格、后面的数据(可能包含换行符)和一个
终止换行符。 例如:
提交 refs/heads/master
标记:1
提交者 Eric S. Raymond[电子邮件保护]> 1289147634 -0500
数据16
示例提交。
属性遗留 ID 2 r1
M 644 内嵌自述文件
与其他扩展不同,bzr 属性仅在流输出中保留,如果
首选类型是 bzr,因为 bzr 以外的任何进口商都会被它们扼杀。
不相容 语言 变化
在 3.0 之前的版本中,一般命令语法将命令动词放在首位,然后是
选择集(如果有)然后是修改器(VSO)。 它已更改为可选的选择集
首先,然后是命令动词,然后是修饰语 (SVO)。 更改使解析更简单,允许
取消了一些噪音关键字,并在某些方面概括了成功的设计模式
其他 Unix 工具——尤其是 口渴(1)。
在 3.0 之前的版本中,路径表达式只匹配提交,不匹配提交和
关联的 blob 也是如此。 “a”和“c”标志的名称不同。
In 再生外科医生 3.0之前的版本,delete命令有squash的语义; 还,
策略标志不需要“--”前缀。 “--delete”标志被命名
“泯”。
In 再生外科医生 3.0 之前的版本,读取和写入可选地采用文件参数而不是
而不是需要重定向(并且 write 命令从未写入目录)。 这是
更改以允许这些命令具有修饰符。 这些修饰符取代了
几个不再存在的全局选项。
In 再生外科医生 在 3.0 之前的版本中, unite 命令中的最早因素始终保持其
标签和分支名称不变。 解决名称冲突的新规则,优先考虑
到最新的因素,当联合两个存储库结束时会产生更自然的行为
结尾; 第二个(以后)的主分支保留了它的名字。
In 再生外科医生 3.0 之前的版本,tagify 命令预期策略为尾随
改变其行为的论据。 新语法使用类似命名的选项,带前导
破折号,可以出现在 tagify 命令之后的任何地方
在 2.9 之前的版本中。 “authors”、“legacy”、“list”和“mailbox_{in|out}”的语法
是不同的(“遗产”是“化石”)。 他们采用了简单的文件名参数,而不是
使用重定向 < 和 >。
限制 AND 担保
保证:在使用提交哈希的 DVC 中,编辑 再生外科医生 永远不会改变
提交对象的散列,除非 (a) 您编辑提交,或 (b) 它是
在 VCS 中编辑提交,在子对象的哈希输入中包含父哈希
(git 和 hg 都这样做)。
保证: 再生外科医生 只需要与内存大小成正比的主内存
存储库的元数据历史,而不是其整个内容历史。 (例外:数据来自
内联内容保存在内存中。)
保证:在最坏的情况下, 再生外科医生 制作自己的副本中的每个内容 blob
存储库的历史,因此使用大约等于大小的中间磁盘空间
存储库的内容历史记录。 但是,当要编辑的存储库出现时
作为流文件, 再生外科医生 不需要或只需要很少的额外磁盘空间
代表它; 内容 blob 的内部表示是一个 (seek-offset, length) 对
指向流文件。
保证: 再生外科医生 从不修改它读取的存储库的内容,也不删除
任何存储库。 手术的结果总是在一个新的存储库中表达。
保证:快速导入流中不属于命令的任何行 再生外科医生
解析和理解将通过不变。 目前集势
众所周知,直通包括 进展, 选项及 检查站 命令作为
以及 # 领导的评论。
保证:全部 再生外科医生 操作要么保留它们不是的所有存储库状态
当他们不能这样做时,明确告知要修改或警告您。
保证: 再生外科医生 处理 bzr 提交属性扩展,正确传递
通过包括嵌入换行符在内的属性项。 (这些属性也
可在邮箱格式中编辑。)
限制:因为 再生外科医生 依赖其他程序来生成和解释
快速导入命令流,它会受到这些程序中的错误的影响。
局限性:bzr 对它的工作单元是否是存储库深感困惑
或者可能是从仓库克隆或从头创建的浮动分支,以及
有朝一日可能会也可能不会被合并到一个回购协议中。 它的出口商只适用于
分支,但其进口商创建回购。 因此,重建操作将产生一个
与您期望的不同的子目录结构。 在下面查找您的内容
子目录“主干”。
限制:在 git 下,签名标签是逐字导入的。 但是,任何操作
修改标签目标上游的任何提交都会使其无效。
限制:Stock git(至少从 1.7.3.2 版本开始)会因属性扩展而窒息
命令。 因此, 再生外科医生 使用 git 类型重建 repo 时省略它们。
限制:虽然 Subversion 读取端支持良好,但写入端
支持更像是一个草图或概念验证,而不是一个强大的实现; 它只是
适用于非常简单的情况,不往返。 它可能会在未来的版本中改进。
局限性: 再生外科医生 在破坏文件名大小写的文件系统下可能会出现错误行为,
或名义上保留大小写但将仅因大小写不同而不同的名称映射到相同的
文件系统节点(默认情况下 Mac OS X 的行为与此类似)。 如果任意两个就会出现问题
回购中的路径仅因情况而异。 为避免在 Mac 上出现问题,请在
专门启用区分大小写的 HFS+ 文件系统。
保证:随着版本控制系统添加对快速导入格式的支持,它们的
存储库将变得可编辑 再生外科医生.
参赛要件
再生外科医生 依赖于与其支持的 VCS 相关联的导入器和导出器。
混帐
核心 git 支持导出和导入。
BZR
需要 bzr 加上 bzr-fast-import 插件。
hg
需要核心 hg、hg-fastimport 插件和第三方 hg-fast-export.py
脚本。
svn
Stock Subversion 命令支持导出和导入。
达克斯
Stock darcs 命令支持导出和导入。
CVS
需要 cvs-fast-export。 请注意,CVS 升降机的质量可能很差,随着
需要严格手工操作的单独升降机。 这是由于固有的问题
CVS 的面向文件的模型。
RCS
需要 cvs-fast-export(是的,这不是一个错字;cvs-fast-export 处理 RCS
也收藏)。 CVS 的警告适用。
规范化 规则
预计会这样 再生外科医生 将通过更多删除策略进行扩展。 政策
作者可能需要更多地了解提交的文件操作序列如何减少到
删除提交的操作后的正常形式被添加到它之前。
回想一下,每个提交都有一个文件操作列表,每个都有 M(修改)、D(删除)、R
(重命名)、C(复制)或“deleteall”(删除所有文件)。 只有 M 个操作有关联
斑点。 通常,在一次提交的操作中,每个单独的文件只有一个 M 操作
名单。
要了解归约过程的工作原理,了解以下情况就足够了
列表中的所有操作都在处理同一个文件。 操作子列表
引用不同的文件互不影响,可以考虑减少
作为单独的操作。 此外,“deleteall”充当所有内容的 D 并取消所有
列表中它之前的操作。
归约过程从一开始就遍历列表寻找相邻对
它可以组合的操作。 下表描述了所有可能的情况,除了
削减之一。
┌────────────────────────────┬────────────────────── ──────────────┐
│ M + D → D │ │
│ │ 如果文件被修改 │
│ │ 然后删除,结果│
│ │ 好像已经是│
│ │ 删除。 如果 M 是 │
│ │ 只对文件进行修改, │
│ │ 它也被删除了。 │
├──────────────────────────┼────────────────────── ──────────────┤
│M a + R ab → R ab + M b │ │
│ │ 这样做的目的 │
│ │转型就是推│
│ │ 重命名为 │
│ │ 列表开头, │
│ │ 他们可能在哪里 │
│ │ 与另一个 R 或 │ 相邻
│ │ C 他们可以组成 │
││同。 如果 M 是 │
│ │ 只对 │ 进行修改操作
│ │这个文件,重命名为│
│ │ 掉了。 │
├──────────────────────────┼────────────────────── ──────────────┤
│ M a + C ab │ │
│ │ 不减。 │
├──────────────────────────┼────────────────────── ──────────────┤
│ M b + R ab → 无 │ │
│ │ 应该是不可能的,而且 │
│ │ 可能表示仓库│
│ │腐败。 │
├──────────────────────────┼────────────────────── ──────────────┤
│ M b + C ab → 无 │ │
│ │ 副本撤销 │
│ │ 修改。 │
├──────────────────────────┼────────────────────── ──────────────┤
│ D + M → M │ │
│ │ 如果一个文件被删除了 │
│ │ 修改,结果是│
│ │ 好像删除│
│ │ 没有发生│
│ │(因为M操作│
│ │ 存储整个文件,而不是 │
│ │ 三角洲)。 │
├──────────────────────────┼────────────────────── ──────────────┤
│ D + {D|R|C} │ │
│ │ 这些情况应该是 │
│ │ 不可能而且会 │
│ │ 建议仓库│
│ │ 已损坏。 │
├──────────────────────────┼────────────────────── ──────────────┤
│ R ab + D a │ │
│ │ 不应该发生,并且 │
│ │ 是另一种情况 │
│ │ 会建议存储库 │
│ │腐败。 │
├──────────────────────────┼────────────────────── ──────────────┤
│ R ab + D b → D a │ │
│ │ 删除删除了 │
│ │ 刚刚重命名的文件。 │
├──────────────────────────┼────────────────────── ──────────────┤
│ {R|C} + M │ │
│ │ 不减。 │
├──────────────────────────┼────────────────────── ──────────────┤
│ R ab + R bc → R ac │ │
│ │ b 项必须匹配 │
│ │对于这些操作要│
│ │ 有道理当他们 │
│ │ 分居│
│ │ 提交; 如果他们不这样做,│
│ │ 表示仓库│
│ │腐败。 │
├──────────────────────────┼────────────────────── ──────────────┤
│ R ab + C bc │ │
│ │ 不减。 │
├──────────────────────────┼────────────────────── ──────────────┤
│ C ab + D a → R a b │ │
│ │ 复制后删除 │
│ │ 的来源是 │
│ │ 重命名。 │
├──────────────────────────┼────────────────────── ──────────────┤
│ C ab + D b → 没有 │ │
│ │ 此删除操作撤销 │
│ │ 复制。 │
├──────────────────────────┼────────────────────── ──────────────┤
│ Cab + R ac │ │
│ │ 不减。 │
├──────────────────────────┼────────────────────── ──────────────┤
│ C ab + R bc → C ac │ │
│ │ 复制后重命名 │
│ 目标的 │ 减少到 │
│ │ 单本 │
├──────────────────────────┼────────────────────── ──────────────┤
│ C+C │ │
│ │ 不减。 │
└────────────────────────────┴────────────────────── ──────────────┘
CRASH 恢复
只有在以下情况下,本节才会变得相关 再生外科医生 或者它下面的东西
在写出存储库的过程中,软件和硬件堆栈崩溃,在
特别是如果重建的目标目录是您的当前目录。
该工具有两个相互矛盾的目标。 一方面,我们从不想冒险重蹈覆辙
一个预先存在的回购。 另一方面,我们希望能够在一个目录中运行这个工具
使用回购并在适当的位置修改它。
我们通过玩一个三目录蒙特游戏来解决这个困境。
1. 首先,我们在新创建的暂存目录中构建 repo。 如果你的目标
目录名为 /path/to/foo,暂存目录将是一个名为
/path/to/foo-stageNNNN,其中 NNNN 是派生自的 cookie 再生外科医生的进程 ID。
2. 然后我们创建一个空的备份目录。 这个目录将被命名为 /path/to/foo.~N~,
其中 N 递增,以免与任何现有备份目录冲突。
再生外科医生 在任何情况下,永远不会删除备份目录。
到目前为止,所有操作都是安全的; 到目前为止可能发生的最坏情况,如果
过程被中断的原因是暂存和备份目录被抛在后面。
3. 临界区开始。 我们首先将目标目录中的所有内容移动到
备份目录。
4. 然后我们将暂存目录中的所有内容移动到目标。
5. 我们通过从备份中恢复目标目录中未跟踪的文件来完成
目录。 临界区到此结束。
在临界区期间,所有可以忽略的信号都被忽略。
ERROR 退货政策
致命错误返回 1,否则返回 0。 在批处理模式下,所有错误都是致命的。
使用 onworks.net 服务在线使用 reposurgeon