- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
在我的示例代码中,我这样做(在 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 中是否有一种方法可以显式等待索引接收到更改?
添加:
最佳答案
LibGit2Sharp repo.Index.Stage()
依靠 libgit2 差异功能来确定工作目录中哪些文件已被修改,哪些文件未修改。
在进行比较时,在比较实际文件内容之前,libgit2 依赖于一些“技巧”来检查文件是否已更改。例如:
那么该文件就认为是未修改的,根本不会打开看内容是否相同。这允许对包含数千个文件的大型存储库进行重大优化。
在您的情况下,您的许多文件具有相同的大小和相同的修改日期/时间,这就是为什么 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/
我需要遍历存储库的提交并为每次提交获取受影响的文件。这是我目前巨大的性能瓶颈。 我有一个 libgit 函数的 C++ 包装器,但这段代码应该足够容易理解。 std::vector Commit::g
我正在使用 libgit2(在 C++ 中)创建一个 git 存储库和一个提交。它工作正常,但是, checkout 会破坏所有本地文件。 但是它们似乎仍然存在于 repo 中。这就是我尝试查看存储库
我是一名优秀的程序员,十分优秀!