【问题标题】:libgit2: How to merge and commit after fetch?libgit2:获取后如何合并和提交?
【发布时间】:2017-09-26 13:18:41
【问题描述】:

我已经设法从远程获取,并且我正在运行下面的代码以将更改暂存到本地 master 分支中。

    git_annotated_commit * fetchhead_commit;

    git_annotated_commit_lookup(&fetchhead_commit,
        repo,
        oid
    );                      

    git_merge(repo,&fetchhead_commit,1,NULL,NULL);

所以现在如果我使用 git 命令行工具提交,我会得到一个自动合并提交注释,之后我可以看到日志与远程日志相同。我正在尝试使用 libgit 获得相同的结果,但到目前为止,我在尝试创建合并的提交时所做的努力导致远程历史记录丢失。

我应该如何“正确”提交合并的更改以保留远程的历史记录?

编辑:通过快进可以更进一步,但如果有本地提交,这些在传入合并后仍然会丢失。本地更改不会丢失,而是在合并后暂存,必须再次提交。

你可以在这里看到我的代码:https://github.com/fintechneo/libgit2/blob/master/jsbuild/jslib.c

合并发生在 fetchead_foreach_cb 函数中,该函数再次从 jsgitpull 调用

如果有人想知道 emscripten 的内容是什么,这个 hack 确实可以在网络浏览器中使用。

【问题讨论】:

  • 你是如何创建提交的?到目前为止,您尝试过什么?
  • 我通过快进(使用 git_reference_set_target )走得更远。但是,如果我有本地更改,这些提交就会丢失,并且本地更改的文件将被暂存并且必须再次提交。见github.com/fintechneo/libgit2/blob/master/jsbuild/jslib.c中的fetchead_foreach_cb函数
  • 好的,但是在你合并之后,你是如何创建提交的?你打电话给git_commit_create
  • 拉取的典型工作流程是获取然后调用git_merge_analysis 来决定您是否需要快进或合并/变基。如果您决定需要合并,则必须调用 git_merge 来设置工作目录和索引,解决冲突,然后提交。
  • 好的,假设没有冲突,但是本地有提交应该与传入的更改合并。该提交应该是什么样的?我尝试了类似 jsgitcommit 函数中的提交,但随后丢失了远程历史记录,或者如果在两者之间进行快进丢失了本地历史记录。在原始示例中合并后从终端使用 git commit 可以正常工作,所以我的问题仍然是如何使用 libgit2 编写类似的 git commit?

标签: c libgit2


【解决方案1】:

使用git_commit_create 创建合并提交。合并提交应该有两个父级。一个是当前的 HEAD 提交。第二个是您在git_merge 中合并的同一个带注释的提交(例如提取头)。

【讨论】:

  • 谢谢!我的错误是我在使用 git_commit 时将 git_annotated_commit 类型作为父级传递。我将此添加到您的答案中。随意重写它,但现在对我有用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-22
  • 2013-09-29
  • 2012-02-21
相关资源
最近更新 更多