嗨!
有没有一种方法可以在不先克隆的情况下获取存储在git捆绑包中的所有提交列表?
获取头很容易,但是我找不到一种方法来从中获取完整的日志。
嗨!
有没有一种方法可以在不先克隆的情况下获取存储在git捆绑包中的所有提交列表?
获取头很容易,但是我找不到一种方法来从中获取完整的日志。
如果不编写一些专门的软件来遍历捆绑包中包含的数据包,那么是不可能完成的。如果捆绑包是使用负引用创建的,那么它可能会包含无法仅使用捆绑包中的对象解析的增量(嵌入在捆绑包中的包可以很薄)。
克隆捆绑包(至少要进行裸克隆)将拆分出引用并索引包,从而生成标准git命令可以处理的格式,因此这是最简单的(就集成工作量而言)读取它的方法。
在将其合并之前,“预览”捆绑包的一件事情是将其添加为远程存储库,然后您可以从中提取并访问跟踪引用。因此,可以执行以下操作:
git remote add bundle /path/to/bundle
git remote update bundle
gitk master...bundle/master
之类的命令比较捆绑包中的分支与本地存储库中的分支,然后使用git pull bundle master
将其合并。
完成后,只需使用git remote rm bundle
进行清理即可。
git reset --hard HEAD
,如果自动合并成功,则使用 git reset --hard HEAD@{1}
)。 - araqnid如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
git clone -ns /path/to/mine /path/to/temp
可以创建最便宜的临时克隆,最多几百KB,但是除非您理解s
选项,否则它绝对是一个临时克隆。无论如何,创建该克隆,按照araqnid所说将捆绑包获取到其中,你就完成了。我不喜欢araqnid提到的裸克隆,因为我经常想要玩弄并破坏需要检出的东西。 - jthill