等待提交操作完成
本文关键字:操作 提交 等待 | 更新日期: 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答案)
考虑到您的场景不需要任何用户交互,我推荐第二种解决方案。