相当于 git-archive 直接到磁盘,没有任何 tar 处理
Equivalent of git-archive direct to disk, without any tar processing
我正在分析修订历史,使用 git-archive
获取特定修订的文件(请参阅 )。
该方法有效,但我正在尝试针对具有许多修订的项目进行优化。许多处理被浪费在归档(通过 tar)和返回到另一个目录中的文件(再次通过 tar)。
我正在寻找一种不涉及 tar
的方法来执行此操作,例如 git cp $revision $dest/
。以下是我目前探索的内容:
我可以对文件副本使用 git reset $revision --hard
方法,但它会导致分析无效的并行化,除非我创建 repo 的多个副本(每个 thread/process).
有一个 Java project using JGit called Doris 可以通过低级操作完成此操作,但是当存在奇怪的文件(例如,指向其他存储库的链接)时它会中断。随着git的发展,有很多特殊情况,所以我不想在低级别做这个。
我知道 Python 有一个 git API,但它的 archive feature 也使用 tar。出于与上述相同的原因,我不想在太低的级别对此进行编码。
使用:
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-ignore
和 export-subst
指令。
在 JGit 中,ArchiveCommand
实现了 git archive
的功能,并且还提供了几种开箱即用的存档文件格式。但是,ArchiveCommand
可以使用自定义存档格式进行扩展。
自定义格式需要实现Format
接口并注册到ArchiveCommand::registerFormat
。尽管相应的API似乎是为单个输出文件设计的,但应该可以将内容输出到一个目录。
我正在分析修订历史,使用 git-archive
获取特定修订的文件(请参阅 )。
该方法有效,但我正在尝试针对具有许多修订的项目进行优化。许多处理被浪费在归档(通过 tar)和返回到另一个目录中的文件(再次通过 tar)。
我正在寻找一种不涉及 tar
的方法来执行此操作,例如 git cp $revision $dest/
。以下是我目前探索的内容:
我可以对文件副本使用
git reset $revision --hard
方法,但它会导致分析无效的并行化,除非我创建 repo 的多个副本(每个 thread/process).有一个 Java project using JGit called Doris 可以通过低级操作完成此操作,但是当存在奇怪的文件(例如,指向其他存储库的链接)时它会中断。随着git的发展,有很多特殊情况,所以我不想在低级别做这个。
我知道 Python 有一个 git API,但它的 archive feature 也使用 tar。出于与上述相同的原因,我不想在太低的级别对此进行编码。
使用:
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-ignore
和 export-subst
指令。
在 JGit 中,ArchiveCommand
实现了 git archive
的功能,并且还提供了几种开箱即用的存档文件格式。但是,ArchiveCommand
可以使用自定义存档格式进行扩展。
自定义格式需要实现Format
接口并注册到ArchiveCommand::registerFormat
。尽管相应的API似乎是为单个输出文件设计的,但应该可以将内容输出到一个目录。