1

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

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

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

与往常一样,“git”是存储库的一个实例,包含存储库......接下来我的结帐电话:

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

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

你的,

弗洛里安·赖辛格





原帖:

标题说明了一切 ;) 什么是有效的:我有一个Commit[] 步骤,其中充满了来自 repo 的提交我想在 "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) 获取 Commit[] 步骤

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 和一个表示特定值的 int 创建了一个 BisectStep 类......

// 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

希望这个编辑只是一点点帮助;)

4

1 回答 1

4

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

注意:您能否为我们提供更多背景信息,我很乐意更新此内容以更好地回答您的问题。

于 2014-01-21T14:48:24.947 回答