Дождитесь окончания коммит-операции
У меня проблема с синхронизацией процесса коммитинга с 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)
{ }
Но 1-е не работает, а 2-е активное ожидание не лучшая стратегия
1 ответ
Метод repo.Index.Stage(filePath)
выполняет различие между рабочим каталогом и индексом, чтобы определить, переданы ли filePath
предполагается добавить или удалить из индекса. Когда никаких изменений не обнаружено, индекс не изменяется.
Однако то, как алгоритм реализации на самом деле реализован в libgit2, может не заметить изменения содержимого, если файл изменяется в течение той же секунды без изменения его размера. Некоторая работа была начата для поддержки временной метки на основе наносекунды (см. Этот коммит libgit2).
Таким образом, когда код выполняется в тесном цикле, второй вызов Stage()
не будет изменять индекс, потому что он работал в течение той же секунды без изменения размера файла.
Затем, когда на самом деле пытается создать Commit
, EmptyCommitException
генерируется, когда код обнаруживает, что создаваемый коммит будет идентичным по содержанию своему родителю (см. Запрос на извлечение #668, который ввел это поведение).
Чтобы обойти этот лимит, вы можете:
- Ввести паузу (например,
Thread.Sleep()
в твоей петле - Создавайте свои коммиты вручную, не используя индекс, напрямую создавая их в базе данных объектов (подробнее об этой функции см. В этом ответе Stackru)
Учитывая ваш сценарий, который не требует взаимодействия с пользователем, я бы порекомендовал второе решение.