相当于 git-archive 直接到磁盘,没有任何 tar 处理

Equivalent of git-archive direct to disk, without any tar processing

我正在分析修订历史,使用 git-archive 获取特定修订的文件(请参阅 )。

该方法有效,但我正在尝试针对具有许多修订的项目进行优化。许多处理被浪费在归档(通过 tar)和返回到另一个目录中的文件(再次通过 tar)。

我正在寻找一种不涉及 tar 的方法来执行此操作,例如 git cp $revision $dest/。以下是我目前探索的内容:

使用:

mkdir <path> &&
GIT_INDEX_FILE=<path>/.git git --work-tree=<path> checkout <revision> -- . &&
rm <path>/.git

git checkout步骤会覆盖索引,所以为了使并行化很好,我们可以将索引文件指向目标。有一个文件名非常安全:.git!

(这就像 git worktree add 的轻量级版本,它也避免将新提取的树记录为活动工作树。)

编辑以添加旁注(我希望 OP 知道这一点,但供将来参考):请注意,git archive 应用了某些 .gitattributes 过滤器,但此技术将不适用。特别是,git checkout 不会服从 export-ignoreexport-subst 指令。

在 JGit 中,ArchiveCommand 实现了 git archive 的功能,并且还提供了几种开箱即用的存档文件格式。但是,ArchiveCommand 可以使用自定义存档格式进行扩展。

自定义格式需要实现Format接口并注册到ArchiveCommand::registerFormat。尽管相应的API似乎是为单个输出文件设计的,但应该可以将内容输出到一个目录。