我可以通过 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。

所以,假设我在两个变量 ab 中都有两个提交的两个 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 在两次提交之间获取一个文件的差异数据吗?的主要内容,如果未能解决你的问题,请参考以下文章

sh 在两次提交之间导出diff文件

如何撤消两次提交之间的更改?

获取远程服务器上两次提交之间的所有提交?

为啥两个单独提交的“内容”与 GH API 相同?

Git 导出某两次提交之间的差异文件

如何计算 Git 中两次提交之间更改的行数?