2013-10-31 45 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); 

最后,你会比较列表与沙的距离拉的请求内提交,并从其中包含回购所有提交的名单中排除。这样,只会留下不在拉请求范围内的提交。或者,您可以检查这些提交是否为合并提交(合并另一个提交者的拉取请求的提交)并将其排除。