我在使用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)
{ }
但是第一次它不起作用,第二次主动等待不是最好的策略
答案 0 :(得分:2)
方法repo.Index.Stage(filePath)
在工作目录和索引之间执行差异,以便检测是否应该将传递的filePath
添加到索引中或从索引中删除。如果未检测到任何更改,则不会修改索引。
然而,如果在相同的秒内修改文件而不改变其大小,则在libgit2中实际实现diffing算法的方式可能不会注意到内容更改。一些工作已经开始支持基于纳秒的时间戳检查(参见 this libgit2 commit )。
因此,当代码在紧密循环中执行时,对Stage()
的第二次调用将不修改索引,因为它在相同的秒内运行而不修改文件的大小。
然后,当实际尝试创建Commit
时,会抛出EmptyCommitException
,因为代码检测到正在创建的提交与其父级的内容相同(请参阅 {{ 3}} 引入了这种行为)。
要解决此限制,您可以:
Thread.Sleep()
)考虑到您的场景不需要任何用户交互,我建议使用第二种解决方案。