如何使用lib2git和C#正确结账

时间:2014-01-20 08:38:30

标签: c# libgit2sharp

更新2:[帖子末尾的更新1)

我终于设法结帐了 这是好消息;)。

坏消息是:单次提交需要2分36秒。如果我是这个节目的用户,我就不会等那么久......

“git”一如既往的Repository实例,包含repo ...接下来我的结帐电话:

git.Checkout(bss.getCommit(), CheckoutModifiers.Force, (path, completed, total) =>
        { // Update progressbar
            progressBar1.Maximum = total;
            progressBar1.Value = completed;
        }, null);

如果您需要完整的来源(99%未注释),请询问,我会将当前版本放在网上....感谢您的回答:)

此致,

Florian Reisinger





原帖:

标题说明了一切;) 工作原理: 我有一个来自回购提交的提交[]步骤 我想在“i”位置查看提交 git == Lib2Git Repo

git.Checkout(steps[i]);

由于没有发生任何事情,我停止了该计划。我确实输出了提交的数量,从30减少到1 .... 我真的需要帮助......

PS:我知道有一个重载

Checkout(Commit,CheckoutModifiers,CheckoutNotificationOptions, LibGit2Sharp.Handlers.CheckoutProgressHandler)

最后一件事是代表。所以问题,我想,可以被描述为“如何使用委托,虽然我不确定,这将有助于解决从30提交到1提交的问题....

编辑:

更长的源代码。我想用C#和libgit实现bisect GUI .... 代码1)获取提交[]步骤

List<BisectStep> bss = new List<BisectStep>();
        ICommitLog commits = git.Branches["master"].Commits;
        foreach (Commit c in commits)
        {
            bss.Add(new BisectStep(c));
        }
        steps = bss.ToArray();

用同样的方法然后是Bisect的东西。我用Commit做了一个BisectStep类,用一个表示特定值的int ....

// Test oldest (Has to be GOOD)
        int i = steps.Length;
        int r = BisectStep.Result.SKIP;
        try
        {
            while (r == BisectStep.Result.SKIP || r == BisectStep.Result.NOTSET)
            {
                i--;
                r = doStep(steps[i]);
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
        LastKnownWorking = i;
        if (r != BisectStep.Result.GOOD)
        {
            MessageBox.Show("Problem can't be bisected!", "Out of range");
            return;
        }
        r = BisectStep.Result.SKIP;
        i = -1;
        // Test latest (Has to be BAD)
        try
        {
            while (r == BisectStep.Result.SKIP || r == BisectStep.Result.NOTSET)
            {
                i++;
                r = doStep(steps[i]);
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
        FirstKnownNotWorking = i;
        //Test rest

最后但并非最不重要的是doStep方法

 private int doStep(BisectStep bss)
    {
        git.Checkout(bss.getCommit(), CheckoutModifiers.Force, null, null);
        // Checkout
        System.Diagnostics.Process p = new System.Diagnostics.Process();
        p.StartInfo = new System.Diagnostics.ProcessStartInfo(System.IO.Path.Combine(new string[] { tb_ondisk.Text, "instdir", "program", "soffice.exe" }));
         if (System.IO.File.Exists(p.StartInfo.FileName))
            p.Start();
        else
            return BisectStep.Result.SKIP;
        GBS form = new GBS();
        DialogResult dr = form.ShowDialog();
        int result = int.MaxValue;
        while (!p.HasExited)
            MessageBox.Show("Please close LibreOffice to continue!", "Close LibreOffice", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
        switch (dr)
        {
            case (DialogResult.Yes):
                result = BisectStep.Result.GOOD;
                break;
            case (DialogResult.No):
                result = BisectStep.Result.BAD;
                break;
            case (DialogResult.Ignore):
                result = BisectStep.Result.SKIP;
                break;
        }
        bss.setResult(result);
        return result;
    }

“GBS”是一个包含3个按钮(好,坏,跳过)的Win-Form

希望这个编辑有点帮助;)

1 个答案:

答案 0 :(得分:3)

两种版本的Checkout方法都会执行结帐操作。 Checkout方法的第二种风格(与代理人)将另外报告进度。您可以在Checkout测试https://github.com/libgit2/libgit2sharp/blob/vNext/LibGit2Sharp.Tests/CheckoutFixture.cs#L391中看到(一个简单的)示例。

注意:您是否会向我们提供更多背景信息,我很乐意更新此信息,以便更好地回答您的问题。