等待提交操作完成

本文关键字:操作 提交 等待 | 更新日期: 2023-09-27 17:59:40

我在将commitingprocess与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)
{ }

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

等待提交操作完成

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

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

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

然后,当实际尝试创建Commit时,会抛出EmptyCommitException,因为代码检测到正在创建的提交在内容方面与其父级相同(请参见引入此行为的Pull Request#668)。

为了绕过这个限制,您可以:

  • 在循环中引入停顿(例如Thread.Sleep()
  • 通过直接在对象数据库中创建提交,在不利用索引的情况下手工进行提交(有关此功能的更多详细信息,请参阅此StackOverflow答案

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