Git捆绑包中的提交记录

11

嗨!

有没有一种方法可以在不先克隆的情况下获取存储在git捆绑包中的所有提交列表?

获取头很容易,但是我找不到一种方法来从中获取完整的日志。


在我将捆绑包合并到存储库之前,我想检查捆绑包的状态(与存储库相比)。无论它的头部是否已经存在于存储库中或者反过来。 - mat
也许在这种情况下,将bundle作为远程添加会更容易? - araqnid
谢谢你的提示。我会研究一下,并尝试找出必要的命令。 - mat
2
对于像这样的与git相关的实验,请在克隆时使用可以轻松删除的克隆,它们很便宜。git clone -ns /path/to/mine /path/to/temp 可以创建最便宜的临时克隆,最多几百KB,但是除非您理解s选项,否则它绝对是一个临时克隆。无论如何,创建该克隆,按照araqnid所说将捆绑包获取到其中,你就完成了。我不喜欢araqnid提到的裸克隆,因为我经常想要玩弄并破坏需要检出的东西。 - jthill
2个回答

8

如果不编写一些专门的软件来遍历捆绑包中包含的数据包,那么是不可能完成的。如果捆绑包是使用负引用创建的,那么它可能会包含无法仅使用捆绑包中的对象解析的增量(嵌入在捆绑包中的包可以很薄)。

克隆捆绑包(至少要进行裸克隆)将拆分出引用并索引包,从而生成标准git命令可以处理的格式,因此这是最简单的(就集成工作量而言)读取它的方法。

在将其合并之前,“预览”捆绑包的一件事情是将其添加为远程存储库,然后您可以从中提取并访问跟踪引用。因此,可以执行以下操作:

git remote add bundle /path/to/bundle
git remote update bundle

现在,您可以使用gitk master...bundle/master之类的命令比较捆绑包中的分支与本地存储库中的分支,然后使用git pull bundle master将其合并。

完成后,只需使用git remote rm bundle进行清理即可。


你知道是否有一种方法可以模拟合并(例如,说出在不实际调用命令的情况下会发生什么)。合并和拉取没有--dry-run选项。 - mat
他们不这样做,也没有那样的事。你可以执行合并操作,然后通过重置到之前的位置来中止(如果出现冲突,则使用 git reset --hard HEAD,如果自动合并成功,则使用 git reset --hard HEAD@{1})。 - araqnid

1

araqnid答案中建议的那样,从捆绑包中获取仍然是最简单的解决方案。

其他任何方法(即不克隆/不从捆绑包中获取)都需要解码git bundle格式。
自Git 2.25.1(2020年2月)以来,由于捆绑包格式的技术细节已被记录,因此这样做略微容易。

查看提交7378ec9(2020年2月7日)由Masaya Suzuki (draftcode)提交。
(由Junio C Hamano -- gitster --合并于提交e99c325,2020年2月12日)
查看讨论

doc: 描述 Git 打包格式

Signed-off-by: Masaya Suzuki

打包格式未被记录。使用 ABNF 描述格式并解释每个部分的含义。

(ABNF: 增强巴克斯-诺尔范式,一种基于巴克斯-诺尔范式(BNF)的元语言,但由其自己的语法和推导规则组成)

请参考文档/技术/捆绑格式.txt了解更多:

bundle    = signature *prerequisite *reference LF pack
signature = "# v2 git bundle" LF

prerequisite = "-" obj-id SP comment LF
comment      = *CHAR
reference    = obj-id SP refname LF

pack         = ... ; packfile

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接