Git
English ▾ 主题 ▾ 最新版本 ▾ git-fast-export 最后更新于 2.45.0

名称

git-fast-export - Git 数据导出器

概要

git fast-export [<options>] | git fast-import

描述

此程序以适合通过管道传输到 git fast-import 的格式转储给定的修订版本。

您可以将其用作人类可读的 bundle 替换(参见 git-bundle[1]),或用作可在馈送到 git fast-import 之前进行编辑的格式,以进行历史重写(git filter-repo 等工具依赖此功能)。

选项

--progress=<n>

每 <n> 个对象插入 progress 语句,以便在导入过程中由 git fast-import 显示。

--signed-tags=(verbatim|warn|warn-strip|strip|abort)

指定如何处理签名标签。由于导出后任何转换都可能更改标签名称(在排除修订版本时也可能发生),因此签名将不匹配。

当要求 abort(这是默认值)时,此程序在遇到签名标签时将终止。使用 strip,标签将静默地取消签名,使用 warn-strip,它们将取消签名但会显示警告,使用 verbatim,它们将静默导出,使用 warn,它们将导出,但您会看到警告。

--tag-of-filtered-object=(abort|drop|rewrite)

指定如何处理其标记对象被过滤掉的标签。由于要导出的修订版本和文件可以通过路径限制,因此标记的对象可能会被完全过滤掉。

当要求 abort(这是默认值)时,此程序在遇到此类标签时将终止。使用 drop,它将从输出中省略此类标签。使用 rewrite,如果标记的对象是提交,它将重写标签以标记祖先提交(通过父级重写;参见 git-rev-list[1])。

-M
-C

执行移动和/或复制检测,如 git-diff[1] 手册页中所述,并使用它在输出转储中生成重命名和复制命令。

请注意,此命令的早期版本在您提供这些选项时不会报错并产生不正确的结果。

--export-marks=<file>

完成后将内部标记表转储到 <file>。标记按行写入,格式为 :markid SHA-1。仅转储修订版本的标记;忽略 Blob 的标记。后端可以使用此文件在导入完成后验证导入,或在增量运行之间保存标记表。由于 <file> 仅在完成时打开和截断,因此相同的路径也可以安全地提供给 --import-marks。如果没有任何新对象被标记/导出,则不会写入该文件。

--import-marks=<file>

在处理任何输入之前,加载 <file> 中指定的标记。输入文件必须存在,必须可读,并且必须使用与 --export-marks 生成的相同的格式。

--mark-tags

除了使用标记 ID 对 Blob 和提交进行标记外,还要对标签进行标记。这在结合使用 --export-marks--import-marks 时非常有用,对于嵌套标签的导出也很有用(且必要)。它不会损害其他情况,并且将是默认设置,但许多 fast-import 前端尚未准备好接受带有标记标识符的标签。

任何已经标记的提交(或标签)都不会再次导出。如果后端使用类似的 --import-marks 文件,则可以通过在运行之间保持标记相同来实现存储库的增量双向导出。

--fake-missing-tagger

一些旧的存储库有缺少标记者的标签。fast-import 协议对此非常严格,不允许这种情况。因此,伪造一个标记者以能够 fast-import 输出。

--use-done-feature

feature done 语句开始流,并以 done 命令结束。

--no-data

跳过 Blob 对象的输出,而是通过其原始 SHA-1 哈希引用 Blob。这在重写存储库的目录结构或历史记录而不触及单个文件内容时很有用。请注意,生成的流只能由已经包含必要对象的存储库使用。

--full-tree

此选项将导致 fast-export 为每个提交发出 "deleteall" 指令,后跟提交中所有文件的完整列表(而不是仅列出与提交的第一个父级不同的文件)。

--anonymize

匿名化存储库的内容,同时保留历史记录和存储树的形状。请参阅下面的 匿名化 部分。

--anonymize-map=<from>[:<to>]

在匿名化输出中将标记 <from> 转换为 <to>。如果省略 <to>,则将 <from> 映射到自身(即,不要对其进行匿名化)。请参阅下面的 匿名化 部分。

--reference-excluded-parents

默认情况下,运行诸如 git fast-export master~5..master 之类的命令将不包括提交 master~5,并且将使 master~4 不再具有 master~5 作为父级(尽管旧的 master~4 和新的 master~4 将具有所有相同的文件)。使用 --reference-excluded-parents 代替,使流通过其 sha1sum 引用排除的历史范围内的提交。请注意,生成的流只能由已经包含必要父提交的存储库使用。

--show-original-ids

为提交和 Blob 添加一个额外的指令到输出中,original-oid <SHA1SUM>。虽然此类指令可能会被诸如 git-fast-import 之类的导入程序忽略,但它可能对中间过滤器有用(例如,用于重写引用旧提交的提交消息,或按 ID 剥离 Blob)。

--reencode=(yes|no|abort)

指定如何处理提交对象中的 encoding 标头。当要求 abort(这是默认值)时,此程序在遇到此类提交对象时将终止。使用 yes,提交消息将重新编码为 UTF-8。使用 no,将保留原始编码。

--refspec

将指定的 refspec 应用于每个导出的 ref。可以指定多个 refspec。

[<git-rev-list-args>…​]

一系列参数,可以被 git rev-parsegit rev-list 接受,用于指定要导出的特定对象和引用。例如,master~10..master 会导致导出当前 master 引用以及自其第 10 个祖先提交以来添加的所有对象,以及(除非指定 --reference-excluded-parents 选项)master~9 和 master~10 共有的所有文件。

示例

$ git fast-export --all | (cd /empty/repository && git fast-import)

这将导出整个存储库并将其导入到现有的空存储库中。除了重新编码不在 UTF-8 中的提交外,它将是一对一的镜像。

$ git fast-export master~5..master |
	sed "s|refs/heads/master|refs/heads/other|" |
	git fast-import

这会从 master~5..master 创建一个名为 other 的新分支(即,如果 master 具有线性历史记录,它将获取最后 5 次提交)。

请注意,这假设该修订版本范围引用的 Blob 和提交消息都不包含字符串 refs/heads/master

匿名化

如果给出 --anonymize 选项,Git 将尝试从存储库中删除所有识别信息,同时保留原始树和历史模式的足够信息以重现一些错误。目标是,在私有存储库中发现的 Git 错误将在匿名化存储库中持续存在,并且后者可以与 Git 开发人员共享以帮助解决错误。

使用此选项,Git 将替换输出中的所有 refname、路径、Blob 内容、提交和标签消息、名称以及电子邮件地址,替换为匿名数据。同一字符串的两个实例将被等效地替换(例如,具有相同作者的两个提交将在输出中具有相同的匿名作者,但与原始作者字符串没有相似之处)。提交、分支和标签之间的关系将保留,提交时间戳也将保留(但提交消息和 refname 与原始消息没有相似之处)。树的相对构成将保留(例如,如果您有一个包含 10 个文件和 3 个树的根树,那么输出也是如此),但它们的名称和文件内容将被替换。

如果您认为发现了 Git 错误,您可以先导出整个存储库的匿名化流

$ git fast-export --anonymize --all >anon-stream

然后确认该错误在从该流创建的存储库中仍然存在(许多错误不会,因为它们确实依赖于确切的存储库内容)。

$ git init anon-repo
$ cd anon-repo
$ git fast-import <../anon-stream
$ ... test your bug ...

如果匿名存储库显示了该错误,则可能值得与常规错误报告一起共享anon-stream。请注意,匿名流压缩效果非常好,因此建议对其进行gzip压缩。如果您想检查流以确保其中不包含任何私人数据,则可以在发送之前直接浏览它。您可能还想尝试

$ perl -pe 's/\d+/X/g' <anon-stream | sort -u | less

它显示所有唯一的行(将数字转换为“X”,以将“用户 0”、“用户 1”等折叠为“用户 X”)。这会产生更小的输出,并且通常很容易快速确认流中没有私人数据。

重现某些错误可能需要引用特定的提交或路径,这在重命名和路径匿名化后会变得具有挑战性。您可以要求保留特定令牌的原样或将其映射到新值。例如,如果您有一个使用git rev-list sensitive -- secret.c重现的错误,则可以运行

$ git fast-export --anonymize --all \
      --anonymize-map=sensitive:foo \
      --anonymize-map=secret.c:bar.c \
      >stream

导入流后,您可以在匿名存储库中运行git rev-list foo -- bar.c

请注意,路径和 refname 在斜杠边界处被分割成标记。上面的命令会将subdir/secret.c匿名化为类似path123/bar.c的内容;然后,您可以在匿名存储库中搜索bar.c以确定最终的文件名。

为了使引用最终文件名更简单,您可以映射每个路径组件;因此,如果您还将subdir匿名化为publicdir,则最终文件名将为publicdir/bar.c

限制

由于git fast-import无法标记树,因此您将无法完全导出linux.git存储库,因为它包含一个引用树而不是提交的标记。

另请参阅

GIT

git[1] 套件的一部分

scroll-to-top