#c# #git #merge #libgit2sharp
#c# #git #объединить #libgit2sharp
Вопрос:
У нас есть инструмент разработки, который хранит различные текстовые данные в репозитории Git.
Для большинства файлов, которые мы используем, способ, которым LibGit2Sharp обрабатывает слияние файлов, является приемлемым. В принципе, когда изменения достаточно просты, слияние выполняется автоматически. В противном случае мы получаем список конфликтов, которые мы используем для управления, вызывая ручной редактор слияния (по умолчанию KDiff3).
Но у нас есть некоторые конкретные файлы, которые иногда повреждаются автоматической обработкой. Например, если у нас есть файл со 100 строками, в ветке A строка 50 перемещается на 5-ю позицию, а в ветке B эта же строка 50 перемещается в строку 95. В этом случае автоматическое слияние удалит строку 50 и добавит ее как в позиции 5, так и в позиции 95. И в нашем приложении это неприемлемо: здесь мы должны спросить пользователя, какая позиция допустима (когда мы не можем определить это автоматически).
Итак, каким было бы наилучшее решение для выполнения конкретной обработки для файлов такого типа, либо путем принудительного использования какого-либо ручного инструмента слияния, либо выполнения какой-либо конкретной автоматической обработки?
Вот выдержка из кода, который обрабатывает Git merge с помощью LibGit2Sharp:
CheckoutNotifyFlags flags = CheckoutNotifyFlags.Dirty |
CheckoutNotifyFlags.Conflict |
CheckoutNotifyFlags.Updated;
MergeOptions mo = new MergeOptions() {
CheckoutNotifyFlags = flags,
OnCheckoutNotify = CheckNotifyHandler,
FileConflictStrategy = CheckoutFileConflictStrategy.Diff3,
OnCheckoutProgress = CheckoutProgressHandler,
CommitOnSuccess = true,
};
var mergeResult = Repository.Merge(commonBranch, Signature, mo);
bool NoConflict = Repository.Index.Conflicts.Count() == 0;
if (!NoConflict)
{
if (!CheckMergeConfig()) return false;
var conflicts = Repository.Index.Conflicts;
var indexParConflict = conflicts.FirstOrDefault(conf => IsIndexParConflict(conf));
if (ProcessIndexParConflict(indexParConflict))
{
foreach (var conflict in conflicts)
{
if (!ProcessConflict(conflict))
{
Reset(); // Reset all changes
return false;
}
}
}
}
Мы уже написали метод, который, предоставляя 3 входных файла, использованных для слияния, сообщает, является ли результирующий файл допустимым или нет.
Если лучшего способа сделать это нет, мы могли бы проанализировать результирующие файлы в конце операции слияния и дать пользователю возможность изменить его, прежде чем мы зафиксируем результаты слияния. Но это увеличило бы общую сложность и, похоже, не очень чистый способ сделать это.
Спасибо за любой вклад в эту тему.