使用 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,因为索引只提供你是一棵树……不过我可能会遗漏一些东西。
我尝试编写一个工具来将提交挑选到目标分支上,而无需切换到该分支。这是我的原型的要点:
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,因为索引只提供你是一棵树……不过我可能会遗漏一些东西。