我可以通过 GH API 在两次提交之间获取一个文件的差异数据吗?
Posted
技术标签:
【中文标题】我可以通过 GH API 在两次提交之间获取一个文件的差异数据吗?【英文标题】:Can I get the diff data for one file between two commits via the GH API? 【发布时间】:2016-11-19 21:48:22 【问题描述】:我知道如何通过 API 获取文件的提交,以及 SHA 和所有这些好东西。
但是,假设我只想要一个文件在 1 次提交中的差异或同一文件在两次提交中的差异。
例如,在this commit 中,假设我只想要activerecord/lib/active_record/associations.rb
中的, :counter_sql
。
如何通过 API 获取差异数据?
我正在使用 Octokit.rb。
编辑 1
这似乎是可能的per this blog post,但我只是不确定如何使用 Octokit 来做到这一点。
编辑 2
所以,我正在一点一点地弄清楚。
要获取两次提交之间的差异数据,我可以比较 two commits like this。
所以,假设我在两个变量 a
和 b
中都有两个提交的两个 SHA,我会这样做:
client = Octokit::Client.new(access_token: ENV["MY_ACCESS_TOKEN"])
comparison = client.compare("rails/rails", a, b, path: "activerecord/lib/active_record/associations.rb")
这个问题是这会导致两个提交之间存在差异,其中包括对许多其他文件的更改以及很多我不想要的信息。
我想要的只是这两个提交中这个特定文件的差异。
我还没想好怎么做。
想法?
【问题讨论】:
【参考方案1】:不,不可能。
您可以使用比较 API 来获取两个提交之间的差异,这将包括所有文件,而不仅仅是您感兴趣的文件,正如您所观察到的。所以你需要做一些过滤。
另一种方法可能是在提交 X 和提交 Y 时获取文件的内容,然后计算这两个文件版本之间的差异(通常没有用于差异的 GitHub API)。您可以使用 Contents API 来获取文件的原始版本。
https://developer.github.com/v3/repos/contents/#get-contents
【讨论】:
无论如何我接受它,我似乎都必须对其进行过滤,因为要获得我想要的文件,我必须对其进行过滤(根据提交)。或者您是否建议我可以获取特定文件的所有提交,并在同一提交上区分该文件的两个版本? @marcamillion 我同意 Ivan Zuzak 的观点,要在两次提交之间获取单个文件的差异,您最好使用 GH Contents API 并在应用程序中生成差异。 @marcamillion 您可以在特定提交时获取文件的版本。因此,如果您想在两次提交(X 和 Y)之间获取特定文件的差异,您需要获取提交 X(API 请求 1)时的文件版本,然后获取提交 Y(API 请求 2)时的版本),然后在本地区分这两个版本。这里不需要过滤,你只需要最后做差异。如果您比较建议的两种方法,一种是您需要过滤一些不需要的数据,另一种是您需要计算最终的差异。过滤比计算差异更容易 @IvanZuzak 我喜欢你的头在哪里,我发现了一个可以为我计算差异的 gem - github.com/samg/diffy 所以我倾向于同意你的建议,但不同意与您的结论(过滤更容易)。所以我想我的后续问题是,我如何在提交 X 中实际获取文件的版本?我尝试做client.commits(repo, ref: commits2.first.sha, path: path)
并且仍然返回整个提交,而不是我想要的文件的特定版本。我还在commits()
方法中尝试了sha:
,但没有骰子。
@IvanZuzak 其实没关系,我忘了我在另一个 SO 问题中解决了这个问题,只需使用 contents
就像这样:c1 = client.contents(repo, path: path, ref: commits2.first.sha)
。以上是关于我可以通过 GH API 在两次提交之间获取一个文件的差异数据吗?的主要内容,如果未能解决你的问题,请参考以下文章