通过LibGit2Sharp使用git命令指定选项

时间:2014-03-21 11:48:34

标签: git libgit2 libgit2sharp

是否可以使用LibGit2Sharp复制使用选项的git命令?

例如,我想使用类似(但不限于)的命令:

git fetch --all -p [fetch all remotes and prune any branches which don't exist]
git merge --ff-only origin/master [fast-forward merges only]
git merge IssueXyz master --no-commit --no-ff

使用合并作为示例,在LibGit2Sharp中,我可以找到的用于合并的唯一方法是:

public MergeResult Merge(Commit commit, Signature merger)

不允许指定选项。

但是在方法的实现中,合并被委托给代理:

GitMergeResultHandle mergeResultHandle = Proxy.git_merge(Handle, 
  new GitMergeHeadHandle[] { mergeHeadHandle }, 
  opts

其中“opts”是“GitMergeOpts”的硬编码实例,其中“MergeFlags”看起来可用于指定适当的合并行为,如果它不是硬编码的:

internal struct GitMergeOpts
{
    public uint Version;

    public GitMergeFlags MergeFlags;
    public GitMergeTreeOpts MergeTreeOpts;
    public GitCheckoutOpts CheckoutOpts;
}

所以我真正想要了解的是如何使用库来复制使用选项的更复杂的git命令?

或者这不是这个库的预期用例,在这种情况下,是否有任何关于我如何在C#代码中执行此操作的建议?

1 个答案:

答案 0 :(得分:3)

通常,使用xxxOptions个对象给出可选参数,例如Network.Fetch接受FetchOptions对象,您可以通过设置属性来指定参数。

由于libgit2sharp仍在积极开发中,因此有许多特色需要开发。如果您遇到在libgit2中实现但在libgit2中丢失的功能,您始终可以创建修复它的拉取请求。


关于具体情况:Merge是libgit2sharp的一个相对较新的功能,目前不支持--ff-only行为。但是,您可以模拟行为:

bool isFastForward = repo.Commits.FindCommonAncestor(repo.Head.Tip, commitToMerge)
    == repo.Head.Tip;

然后只有在isFastForwardtrue时合并。