【问题标题】:Cherrypick to branch without checkout using libgit2Cherrypick 无需使用 libgit2 结帐即可分支
【发布时间】:2019-11-25 17:13:10
【问题描述】:

我尝试编写一个工具来挑选提交到目标分支,而不切换到该分支。这是我的原型的要点:

https://gist.github.com/kastiglione/ac72e5df6b267f936c2c2b9f048069b9

该工具调用git_cherrypick_commit,它会创建一个内存索引。我想写一棵树并从内存索引中提交,使用目标分支的内容——而不是工作目录的内容。换句话说,使用内存内容创建树,而不是磁盘。这在理论上可能吗?如果cherrypick有冲突,该工具将中止而不是将冲突写入文件。

编辑:上面的代码在调用git_index_write 时失败,带有:

git_index_write failed: failed to write index: The index is in-memory only

【问题讨论】:

    标签: libgit2


    【解决方案1】:

    听起来可行,但遗憾的是似乎有一个陷阱……

    首先,您返回的索引是“提交的工作副本状态是什么样的”(主要是)。在“normal-git land”中,只有一个索引,即.git/index 的文件。 libgit2 并不完全要求这样做,所以git_cherrypick_commit 会返回一个索引,因此您可以选择如何处理它的内容。

    因此,如果您 git_index_write (and friends),将写入“签出”该索引所需的所有对象。目前还不清楚你要挑选的索引是否被支持,所以 YMMV。

    最后一步是简单地原子更新目标分支以指向新的cherrypicked提交,但现在很明显,您实际上并没有方便的cherrypicked提交OID,因为索引只为您提供了一个树……不过我可能会遗漏一些东西 ?。

    【讨论】:

    • 感谢您的回复。我已经用运行示例代码时遇到的当前错误更新了我的问题:“无法写入索引:索引仅在内存中”。所以问题的一部分是 API 当前不允许在任何地方写入索引。我想写信给.git/index以外的地方。但第二件事是我似乎需要一种方法来编写树,使用 alt 索引,但不使用工作目录内容,而是使用 git 内容。
    • 您查看过git_index_write_tree_to 报告的内容吗?它应该将所需的对象写入您想要的存储库(实际上,作为悬空对象,因为还没有指向它们的引用)。
    • git_index_write_tree_to 没有出错,但结果是目标分支被快进了,而不是樱桃选择。
    • 我意识到为什么它看起来像是快进,我使用了相同的提交者签名,而不是像 git cherry-pick 那样使用当前作者和时间创建一个新的签名。看来我的一个基本案例正在奏效。
    • 酷,很高兴听到它忠实地工作?。感谢您的文档 PR,非常欢迎!
    猜你喜欢
    • 2010-12-08
    • 2011-01-18
    • 2019-06-13
    • 2016-05-07
    • 2011-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多