2015-11-02 12 views

ответ

1

Первые некоторые основы:

журнал мерзавец topic..master

var filter = new CommitFilter { 
    SortBy = CommitSortStrategies.Time, 
    Since = master, 
    Until = topic, 
}; 
var commitList = repo.Commits.QueryBy (filter); 

журнал мерзавец topic..master --merges

var filter = new CommitFilter { 
    SortBy = CommitSortStrategies.Time, 
    Since = master, 
    Until = topic, 
}; 
var commitList = repo.Commits.QueryBy (filter); 
var mergeList = commitList.Where (p => p.Parents.Count() >= 2); 

Теперь на ваш вопрос:

мерзавец журнала topic..master --ancestry-путь --merges

родословная траекторией =

 When given a range of commits to display (e.g. commit1..commit2 or 
     commit2 ^commit1), only display commits that exist directly on the 
     ancestry chain between the commit1 and commit2, i.e. commits that 
     are both descendants of commit1, and ancestors of commit2. 

-merges легко когда у нас есть путь родословной, поскольку мы можем фильтровать коммиты с более чем одним родителем. Получение пути родословная требует кодирования ;-)

С момента ICommitLog, который возвращается из commitList в первом примере выше содержит DAG (ориентированный ациклический граф) через .Parents собственности, мы должны идти граф и получить «все простые пути»через глубину первого поиск, чтобы найти все не-циклические пути Если у вас есть список всех simple путей просто фильтровать, с помощью которого фиксаций >=2 родителей

Примечания:.. Я делал это в несколько проектов на C# и даже простые, такие как вычисление запроса pull, связанного с конкретным фиксатором, используют эту предысторию с глубиной. Я стараюсь держаться подальше от Linq, чтобы сделать это, поскольку у меня есть huge commit списки (100k + узлы между начальным и конечным узлами только в под-DAG, которые я ищу), а также избежать рекурсивных методов из-за размера стека, но ваш прецедент может/будет отличаться. Если вы застряли в этот момент, отправьте еще один вопрос с проблемой вашего алгоритма/кода.