【问题标题】:Commits in a git bundle在 git 包中提交
【发布时间】:2013-01-22 14:30:47
【问题描述】:

喂!

有没有办法在不先克隆的情况下获取存储在 git 包中的所有提交的列表?

获取头部信息很容易,但我找不到获取完整日志的方法。

【问题讨论】:

  • 在将捆绑包合并到存储库之前,我想检查捆绑包的位置(与存储库相比)。它的头部是否已经存在于回购中或相反。
  • 也许在这种情况下将捆绑包添加为遥控器会更容易?
  • 感谢您的提示。我会仔细研究它,并尝试找出必要的命令
  • 对于像这样与 git 相关的实验,把它做成一个克隆,你可以 rm -rf 完成后,它们很便宜。 git clone -ns /path/to/mine /path/to/temp 制作了最便宜的临时克隆,最多几百 KB,但它绝对是临时克隆,除非您了解 s 选项。无论如何,做那个,像araqnid说的那样把包裹拿进去,你就是金子。我不喜欢为此提到的裸克隆 araqnid,我经常想四处逛逛并破坏需要结帐的东西。

标签: git git-bundle


【解决方案1】:

如果不编写一些专门的软件来浏览捆绑包中的包,这是不可能的。如果捆绑包是使用负引用创建的,则它可能包含仅使用捆绑包中的对象无法解析的增量(捆绑包中嵌入的包可能很薄)。

克隆包(至少是裸克隆)将拆分引用并索引包,生成标准 git 命令可以使用的格式,因此这是最简单的读取方式(就集成工作而言)它。

您可以在合并之前“预览”捆绑包的一件事是简单地将其添加为远程存储库,然后您可以从中获取并访问跟踪参考。所以像:

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

现在您可以通过gitk master...bundle/master 等来比较捆绑包中的分支与您的本地存储库,最后通过git pull bundle master 将其合并。

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

【讨论】:

  • 你知道是否有某种方法可以模拟合并(例如,在不实际调用命令的情况下说出会发生什么)。 merge 和 pull 没有 --dry-run 选项。
  • 他们没有,也没有。您可以进行合并,然后通过重置到之前的位置来中止(git reset --hard HEAD 如果您仍然存在冲突,git reset --hard HEAD@{1} 如果自动合并成功)
【解决方案2】:

按照araqnidanswer 中的建议,从捆绑包中获取仍然是最简单的解决方案。

其他任何事情(意味着不从捆绑中克隆/获取)都将涉及解码git bundle 格式。
使用 Git 2.25.1(2020 年 2 月)更容易做到这一点,因为捆绑格式的技术细节已经记录在案。

参见Masaya Suzuki (draftcode)commit 7378ec9(2020 年 2 月 7 日)。
(由 Junio C Hamano -- gitster -- 合并于 commit e99c325,2020 年 2 月 12 日)
See discussion

doc: 描述 Git 包格式

签字人:铃木雅也

捆绑格式没有记录。用 ABNF 描述格式并解释每个部分的含义。

ABNF: Augmented Backus–Naur form,一个基于Backus–Naur form(BNF)的metalanguage,但包含自己的语法和派生规则)

更多信息请见Documentation/technical/bundle-format.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

【讨论】:

    猜你喜欢
    • 2013-12-20
    • 2012-12-06
    • 2019-03-09
    • 1970-01-01
    • 2022-10-20
    • 2021-04-13
    • 2019-04-06
    • 2018-02-28
    • 1970-01-01
    相关资源
    最近更新 更多