Дождитесь окончания коммит-операции

У меня проблема с синхронизацией процесса коммитинга с 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)

Учитывая ваш сценарий, который не требует взаимодействия с пользователем, я бы порекомендовал второе решение.

Другие вопросы по тегам