2015-11-02 52 views

回答

1

首先是一些基本知識:

git的日誌topic..master

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

git的日誌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); 

現在你的問題:

git的日誌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容易一旦我們擁有祖先路徑,就可以過濾具有多個父代的提交。獲取祖先路徑需要一些編碼;-)

,因爲這是從commitList通過.Parents屬性返回在上面第一個例子包含DAG(向無環圖)的ICommitLog,我們需要走的圖形,並得到「所有通過深度優先搜索的簡單路徑」找到所有非週期性路徑一旦你擁有的所有simple路徑列表只是過濾它通過承諾有>=2父母

注意:我已經在這樣做了很少有C#項目,甚至簡單的項目,比如計算與特定提交相關的拉取請求,都會使用這個深度優先的祖先。我傾向於遠離Linq來執行此操作,因爲我有huge提交列表(僅在我搜索的子DAG內的開始到結束節點之間的100k +節點),並且由於堆棧大小而避免遞歸方法,但您的用例可能會/會有所不同。如果您在這一點上遇到困難,請在算法/代碼問題中發佈另一個問題。

相關問題