等到提交操作完成

时间:2014-04-23 11:23:43

标签: c# .net git libgit2sharp

我在使用LibGit2Sharp同步提交过程时遇到问题。 我有一个例程,可以更改一个文件并在Git中提交。该例程可能会快速连续进行。还有问题,当最后一次提交正在运行时,下一个提交例程就会运行并因EmptyCommitException而崩溃。

这是一个简单的例子:

         for (int i = 0; i < 100; i++)
        {
            using (StreamWriter sw = new StreamWriter(@"...\Test3.txt", false))
            {
                sw.WriteLine(Guid.NewGuid().ToString());
            }
            repo2.Index.Stage(@"...\Test3.txt");
            repo2.Commit("new"); //2nd call crashes with EmptyCommitException
        }

有没有办法等待完成最后一次提交?

我试图使用它:

while (repo2.Info.CurrentOperation != CurrentOperation.None)
{ }

但是第一次它不起作用,第二次主动等待不是最好的策略

1 个答案:

答案 0 :(得分:2)

方法repo.Index.Stage(filePath)在工作目录和索引之间执行差异,以便检测是否应该将传递的filePath添加到索引中或从索引中删除。如果未检测到任何更改,则不会修改索引。

然而,如果在相同的秒内修改文件而不改变其大小,则在libgit2中实际实现diffing算法的方式可能不会注意到内容更改。一些工作已经开始支持基于纳秒的时间戳检查(参见 this libgit2 commit )。

因此,当代码在紧密循环中执行时,对Stage()的第二次调用将修改索引,因为它在相同的秒内运行而不修改文件的大小。

然后,当实际尝试创建Commit时,会抛出EmptyCommitException,因为代码检测到正在创建的提交与其父级的内容相同(请参阅 {{ 3}} 引入了这种行为)。

要解决此限制,您可以:

  • 在循环中引入暂停(例如Thread.Sleep()
  • 通过直接在对象数据库中创建索引而不利用索引来手工制作提交(有关此功能的详细信息,请参阅 Pull Request #668

考虑到您的场景不需要任何用户交互,我建议使用第二种解决方案。