使用 libgit2 Cherrypick 无需结帐即可分支

Cherrypick to branch without checkout using libgit2

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

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

听起来好像可行,但遗憾的是它看起来有问题……

首先,你得到的索引是"what working copy state that commit looks like"(大部分)。在 "normal-git land" 中,只有一个索引,即 .git/index 中的文件。 libgit2 并不完全需要,所以 git_cherrypick_commit 给你一个索引,所以你可以选择如何处理它的内容。

因此,如果您 git_index_write (and friends),将写入 "checkout" 该索引所需的所有对象。不清楚你要 cherrypick 的索引是否支持,所以 YMMV.

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