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

Posted

技术标签:

【中文标题】为啥两个单独提交的“内容”与 GH API 相同?【英文标题】:Why is the 'content' for two separate commits identical from the GH API?为什么两个单独提交的“内容”与 GH API 相同? 【发布时间】:2016-11-20 15:31:38 【问题描述】:

我有两个提交。 This one 和 this one。我正在使用 Octokit。

我主要对两个提交中与文件 activerecord/lib/active_record/associations.rb 相关的差异感兴趣。

我将这两个提交都放在一个集合中,您可以在此处看到:

[284] pry(main)> commits2.first.sha
=> "c6e01f5b60c4864f0e92149d1e81077519f503d5"
[285] pry(main)> commits2.second.sha
=> "581f12b7b18a6e5205bfabb814f6e9997bf92be8"

请注意,这两个 SHA 都对应于我在上面发布的链接中的 SHA,并且都是唯一的(即彼此不同)。

然而,当我获得每个提交的内容时,特别是与我感兴趣的路径相关的内容时,我得到的两个提交的结果相同。

pry(main)> repo
=> "rails/rails"
pry(main)> path
=> "activerecord/lib/active_record/associations.rb"
c1 = client.contents(repo, path: path, sha: commits2.first.sha)
pry(main)> c1.sha
=> "3729e22e6423348aa9282cd17b49c09793ca3a6f"

然后我对第二次提交做同样的事情,我得到以下信息:

pry(main)> c2 = client.contents(repo, path: path, sha: commits2.second.sha)
pry(main)> c2.sha
=> "3729e22e6423348aa9282cd17b49c09793ca3a6f"

注意 SHA 是相同的。

c1c2 的内容也相同。你可以在下面看到它们:

pry(main)> c1
=> :name=>"associations.rb",
 :path=>"activerecord/lib/active_record/associations.rb",
 :sha=>"3729e22e6423348aa9282cd17b49c09793ca3a6f",
 :size=>94931,
 :url=>
  "https://api.github.com/repos/rails/rails/contents/activerecord/lib/active_record/associations.rb?ref=master",
 :html_url=>
  "https://github.com/rails/rails/blob/master/activerecord/lib/active_record/associations.rb",
 :git_url=>
  "https://api.github.com/repos/rails/rails/git/blobs/3729e22e6423348aa9282cd17b49c09793ca3a6f",
 :download_url=>
  "https://raw.githubusercontent.com/rails/rails/master/activerecord/lib/active_record/associations.rb",
 :type=>"file",
 :content=>
  "cmVxdWlyZSAnYWN0aXZlX3N1cHBvcnQvY29yZV9leHQvZW51bWVyYWJsZScK\ncmVxdWlyZSAnYWN0aXZlX3N1cHBvcnQvY29yZV9leHQvc3RyaW5nL2NvbnZl\ncnNpb25zJwpyZXF1aXJlICdhY3RpdmVfc3VwcG9ydC9jb3JlX2V4dC9tb2R1\nbGUvcmVtb3ZlX21ldGhvZCcKcmVxdWlyZSAnYWN0aXZlX3JlY29yZC9lcnJv\ncnMnCgptb2R1bGUgQWN0aXZlUmVjb3JkCiAgY2xhc3MgQXNzb2NpYXRpb25O\nb3RGb3VuZEVycm9yIDwgQ29uZmlndXJhdGlvbkVycm9yICM6bm9kb2M6CiAg\nICBkZWYgaW5pdGlhbGl6ZShyZWNvcmQgPSBua

为了简洁,我截断了content

为什么会这样?如果您手动查看我在顶部发布的两个链接,然后向下滚动到 associations.rb 代码,您会看到两个都对该文件进行了更改。

那么为什么两个提交的content 是相同的?

好困惑:|

编辑 1

为了回应 Tim 的评论,即提交可能是精心挑选的并且它们确实是相同的,我又做了两次提交(this one 和 this one),但结果似乎是一样的:

[299] pry(main)> commits2.third.html_url
=> "https://github.com/rails/rails/commit/1d2c6ee8f3f7e4b6881f30e6b53582738c2b3ace"
[300] pry(main)> commits2.third.sha
=> "1d2c6ee8f3f7e4b6881f30e6b53582738c2b3ace"
[301] pry(main)> commits2.fourth.html_url
=> "https://github.com/rails/rails/commit/3c01e01ded4e8e87d48e844881c88f6e47cebdf0"
[302] pry(main)> commits2.fourth.sha
=> "3c01e01ded4e8e87d48e844881c88f6e47cebdf0"

pry(main)> c3 = client.contents(repo, path: path, sha: commits2.third.sha)
pry(main)> c3.sha
=> "3729e22e6423348aa9282cd17b49c09793ca3a6f"

pry(main)> c4 = client.contents(repo, path: path, sha: commits2.fourth.sha)
 pry(main)> c4.sha
=> "3729e22e6423348aa9282cd17b49c09793ca3a6f"

【问题讨论】:

我不熟悉 Octokit,但也许你有两个分支指向同一个提交?或者,也许一个提交是精心挑选的,所以你在两个分支上看起来(几乎)相同的内容。 @TimBiegeleisen 看起来它们是相同的,但这就是为什么我最初包含链接以证明它们不是。无论哪种情况,我都只是用另外 2 个提交重新进行了相同的练习来说明这一点。刷新问题即可查看。 这几乎可以肯定是我们对 Oktokit 的理解不足,而不是,例如,Git 碰巧创建了两个具有相同 SHA-1 哈希的提交,这比地球螺旋式进入太阳。 @TimBiegeleisen 我也很确定......因此我在这里:) 我根本不知道 Octokit,也没有在这个级别使用过 GitHub,但是查看developer.github.com/v3/repos/contents 表明这个特定的 GitHub API 不允许任意 SHA-1 哈希。如果是这种情况,大概是 Octokit 完全忽略了您的 sha: 参数。 【参考方案1】:

GitHub API Documentation 建议您必须使用 ref 选项引用所需的提交/分支/标签,而您正在使用 sha

因此正确的代码是这样的:

c1 = client.contents(repo, path: path, ref: commits2.first.sha)
c2 = client.contents(repo, path: path, ref: commits2.second.sha)

【讨论】:

ZOMG 老兄....钱!非常感谢。你是绝对正确的。就是这样。一个简单的修复。非常感谢! 您是否也有机会参与其中? ***.com/questions/38417195/…

以上是关于为啥两个单独提交的“内容”与 GH API 相同?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我在具有不同哈希的两个分支中有相同的提交

Django:使用相同的视图在两个单独的页面上处理相同的表单

为啥我的推送中突然有合并提交?

为啥不同的请求使用google geolocation api返回相同的地理位置

Git:一个项目有两个远程仓库维护单独的提交

我将两个相同的句子与 RIBES NLTK 进行比较并得到一个错误。为啥?