gpt4 book ai didi

git - 如果我在 Libgit2Sharp 中执行 Index.Stage() 然后执行 Commit(),是否存在竞争条件?

转载 作者:太空狗 更新时间:2023-10-29 14:33:08 24 4
gpt4 key购买 nike

在我的示例代码中,我这样做(在 Windows 上):

var repo = new Repository(command.RepoFolder);
for (int i = 0; i < 100; i++)
{
string file = command.RepoFolder + "\\text.txt";
File.WriteAllText(file, string.Format("File number {0}, written at {1}", i, DateTime.Now));

repo.Index.Stage("text.txt");
repo.Commit(string.Format("Written version {0}", i), new Signature("me through code", "email@email.com", DateTimeOffset.Now));
}

如果我使用调试器单步执行此序列,则通过循环运行的每个循环都会创建一个新提交,其中包含 text.txt 文件中的预期检查和适当的提交消息。但是,如果我在不阻止它的情况下运行它,我会得到 100 次提交,以及预期的提交消息,但只有一些提交在其中有真正的文件更改。它们通常是这种形式:

- File number 54, written at 8/30/2013 10:27:38 AM
+ File number 88, written at 8/30/2013 10:27:39 AM

所以看起来好像 repo.Index.Stage() 是异步发生的,并且提交是在注意到文件系统更改之前完成的。这是预期的吗?这是“活泼的 git”行为吗? Libgit2Sharp 中是否有一种方法可以显式等待索引接收到更改?

添加:

  1. 如果我对文件进行追加而不是用不同的行重写,一切正常
  2. 如果我在命令行上使用 git.exe 做同样的事情,我看不到这样的行为

最佳答案

LibGit2Sharp repo.Index.Stage() 依靠 libgit2 差异功能来确定工作目录中哪些文件已被修改,哪些文件未修改。

在进行比较时,在比较实际文件内容之前,libgit2 依赖于一些“技巧”来检查文件是否已更改。例如:

  • 如果文件在索引和工作目录中的大小相同
  • 如果文件修改日期/时间相同(Windows 上时间精度为秒)
  • 如果其他属性(文件所有者、模式...)相同

那么该文件就认为是未修改的,根本不会打开看内容是否相同。这允许对包含数千个文件的大型存储库进行重大优化。

在您的情况下,您的许多文件具有相同的大小和相同的修改日期/时间,这就是为什么 repo.Index.Stage() 不会选取这些文件的原因。


一个可能的(脏)解决方法是在您的修改之间添加一个 Thread.Sleep(TimeSpan.FromSeconds(1));


处理相同问题的错误报告有 recently been opened在 LibGit2Sharp bugtracker 上。如果您有关于此主题的真实示例或要发表的意见,请随时发表意见!

关于git - 如果我在 Libgit2Sharp 中执行 Index.Stage() 然后执行 Commit(),是否存在竞争条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18569869/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com