2015-10-07 2 views
1

Я использую Libgit2sharp, и я хочу решить конфликт. В классе «Конфликт» у меня есть 3 свойства IndexEntry (Ancestor, Ours, theirs) Каждое из них имеет свойство «Путь», указывающее на тот же файл.Конфликт Libgit2sharp получает содержимое их/наших/базовых файлов

Я хочу Ланч инструмент TortoiseGitMerge и я хочу, чтобы создать базу/Ours/их/файлы ...

Как я могу это сделать?

Заранее благодарен!

ответ

2

Вы можете получить ConflictCollection от Index:

var conflicts = repository.Index.Conflicts; 

Тогда получите конфликт для конкретного файла:

var conflict = conflicts["Foo.cs"]; 

Тогда вы можете получить IndexEntry для каждой стороны конфликта:

var ancestor = conflict.Ancestor; 
var ours = conflict.Ours; 
var theirs = conflict.Theirs; 

С указателем, лет и может получить объекты:

var ancestorBlob = (ancestor != null) ? repository.Lookup(ancestor.Id) : null; 
var ourBlob = (ours != null) ? repository.Lookup(ours.Id) : null; 
var theirBlob = (theirs != null) ? repository.Lookup(theirs.Id) : null; 

И вы можете получить поток для содержимого каждой стороны:

var ancestorStream = (ancestor != null) ? ancestorBlob.GetContentStream(new FilteringOptions(ancestor.Name)); 
var ourStream = (ours != null) ? ourBlob.GetContentStream(new FilteringOptions(ours.Name)); 
var theirStream = (theirs != null) ? theirBlob.GetContentStream(new FilteringOptions(theirs.Name)); 

Затем вы можете написать каждый файл - помните, что конфликт может иметь три разные пути, если файл был переименован с каждой стороны, и вы должны проверить Conflict.Name для каждого. Например, для записи одной из сторон на диск:

using (var ancestorOutputStream = File.Create(ancestor.Name + ".orig")) 
{ 
    ancestorStream.CopyTo(ancestorOutputStream); 
} 
+0

Большое спасибо! Решена моя проблема! – Sergiu

+0

Единственное различие заключалось в том, что я использовал foreach для обработки конфликтов, а затем для каждого конфликта я получил имя файла из Ours.Path конфликта, потому что этот путь одинаковый во всех свойствах (Ours, их, Base) – Sergiu

+0

@ Sergiu Это не гарантировано - если один из файлов был переименован, пути могут быть разными. –