Git管道:在提交时导出树而不触及HEAD /索引

时间:2015-05-13 18:16:50

标签: git git-plumbing

我正在编写一个程序,需要同时从同一个存储库中提取不同的提交(例如this question,但同时)。

诸如git checkoutgit archive之类的瓷器命令对索引进行操作,因此每当需要提取提交时,它都需要首先移动HEAD和/或遍历索引。 / p>

有没有一种简单的方法可以将Git树对象转储到文件系统的目录中?

2 个答案:

答案 0 :(得分:0)

以编程方式执行此操作的一种方法是使用git cat-file

以批处理模式(--batch)启动时,您可以将提交ID提供给其标准输入,它会立即将对象转储到标准输出(包括标题以指示对象类型和长度)。因此,您可以通过生成git cat-file进程,将对象(blob和子树)SHA写入其标准输入,将blob写入磁盘以及递归树对象来递归遍历提交的树对象。

请注意,树对象将以二进制格式转储;您可以在this answer中找到格式说明。

答案 1 :(得分:0)

您可以使用git archive导出特定提交的tar存档,并立即将其解压缩到某个目标目录:

git archive <commit> | tar -xf - -C <output-directory>

这也适用于任何树对象,而不是<commit>