我正在编写一个程序,该程序需要同时从同一个存储库中提取不同的提交(就像在这个问题中一样,但同时)。
瓷器命令(例如git checkout
和git archive
)对索引进行操作,因此任何时候需要提取提交时,都需要先移动 HEAD 和/或通过索引。
有没有一种简单的方法可以将 Git 树对象转储到文件系统上的目录中?
我正在编写一个程序,该程序需要同时从同一个存储库中提取不同的提交(就像在这个问题中一样,但同时)。
瓷器命令(例如git checkout
和git archive
)对索引进行操作,因此任何时候需要提取提交时,都需要先移动 HEAD 和/或通过索引。
有没有一种简单的方法可以将 Git 树对象转储到文件系统上的目录中?
以编程方式执行此操作的一种方法是使用git cat-file
.
当以批处理模式 ( --batch
) 启动时,您可以将提交 ID 提供给其标准输入,它会立即将对象转储到标准输出(包括指示对象类型和长度的标头)。git cat-file
因此,您可以通过生成一个进程、将对象(blob 和子树)SHA 写入其标准输入、将 blob 写入磁盘以及递归树对象来递归地遍历提交的树对象。
请注意,树对象将以二进制格式转储;您可以在此答案中找到格式说明。
您可以使用git archive
导出tar
特定提交的存档,并立即将其解压缩到某个目标目录:
git archive <commit> | tar -xf - -C <output-directory>
这也适用于任何树对象,而不是<commit>
.