2013-10-31 46 views
2

我使用TeamCity和Github自動化語義版本控制,並試圖找到一種對直接影響主分支的提交進行計數的方法。如何使用GitHub API(octokit)來篩選立即影響主分支的提交?

可能最好從Git-Extensions這個帶註釋的截圖解釋。我想在箭頭自動計算的版本號:

git-extensions screenshot

我使用Ruby和octokit查詢GitHub的API作爲我的生成過程的一部分。主要和次要版本號是手工加時提交或合併有資格作爲一個主要/次要版本,所以僞代碼基本上是:

  1. 找到提交相應major.minor.0
  2. 計數每次提交因爲major.minor.0改變了主分支
  3. 設置狀態的補丁版本commits.count

我遇到的問題是,如果我只是算提交掌握,每次提交請求被接受,提交計數增加n + 1,其中n是向分支提交的數量。這會起作用,但它...不雅。是的,我瞭解當您接受拉取請求時,您將有效接受該分支的全部歷史記錄,作爲「主」歷史記錄的一部分,但對於版本控制而言並不重要。

有沒有人知道我可以通過GitHub API過濾提交,以確定提交是否直接影響在它創建的位置,還是有一些原因,這實際上是不可能的?

謝謝!

+1

這是一個很好的問題。不知道最好的方法是什麼,也可能是某些情況下不可能做到的。例如,如果您在問題中提交的提交圖表中沒有任何分支引用,但是您不知道在哪裏放置版本箭頭,因爲您不知道在主引擎上進行了哪些提交。 而且這種情況可能經常發生,因爲在某人將分支合併到主人之後 - 他們可能會刪除它。所以你只剩下一個帶有單個分支的複雜圖形(= master)。 –

+1

所以,最後,問題是git分支只不過是指向單個提交的指針。你不知道哪些分支指向過去的某個提交。你只能告訴某個提交是否可以從某個分支(= commit)進行訪問。 –

回答

0

我做了類似的事情。實際上,你可以讓每一個拉請求的提交沙遞歸,使用以下的想法:

var filter = new PullRequestRequest() { State = ItemState.Closed }; //for my example, I filtered the pull-requests that are closed 
var prs =await client.Repository.PullRequest.GetAllForRepository(Owner,Name,filter); 
foreach(var pr in prs){ 
var prs2 = await client.Repository.PullRequest.Commits (Owner, Name, pr.Number); 
} 

之後,您將獲得PRS2啥屬性,並將其存儲到列表中。 然後你得到所有的回購提交。

var commits = await client.Repository.Commit.GetAll (Owner, Name); 

最後,你會比較列表與沙的距離拉的請求內提交,並從其中包含回購所有提交的名單中排除。這樣,只會留下不在拉請求範圍內的提交。或者,您可以檢查這些提交是否爲合併提交(合併另一個提交者的拉取請求的提交)並將其排除。