首页 > 解决方案 > 在分支上获取最后几个修订版 SHA

问题描述

我正在尝试在不检查任何代码的情况下获取少数最新版本的 SHA。

我知道如果你有一个带有 git log 的本地副本,你可以得到这个列表

git log --pretty=format:"%H" --first-parent origin/master | head -10

并且您只能使用 git ls-remote 获得最新版本

git ls-remote git@github.com:foo/foo.git master

但我需要获得最近 10 次修订的列表,而不仅仅是最后一次。

任何人都可以帮忙吗?

标签: gitgithub

解决方案


我基本上需要获得通过某些测试的最新代码修订版——不幸的是,没有办法直接从测试中获得最新的成功修订版。我只能逐个查看该列表并检查该修订是否通过,直到找到一个通过为止。

您正在寻找的工具是git-bisect. 它进行二进制搜索以查找哪个提交破坏了测试。你给它的任何测试。这比一个一个地浏览要高效得多。

克隆存储库,然后...

$ git bisect start
$ git bisect bad           # the current version is bad
$ git bisect good v1.2.3   # v1.2.3 was good

然后它将检查这两者之间的提交。git bisect bad您可以运行测试并用or告诉它是好是坏git bisect good。然后它将在其二进制搜索中继续进行下一次提交。最终,它将失败缩小到一个提交。这通常需要log(n)尝试。因此,如果有 100 个提交要搜索,它将在大约 10 次尝试中找到它。

您可以使用 自动化该过程git bisect run <command>。它将command在每次提交时运行并使用退出状态来确定它是好是坏。

顺便说一句,这就是为什么避免提交导致测试失败的重要原因。


一般来说,Git 不喜欢通过遥控器进行操作。它不是为此而构建的。最简单的做法是克隆存储库并使用git log. 大多数存储库都非常小。如果不是,那将导致各种问题,您应该考虑git-lfs解决这个问题。

您可以进行浅层克隆并使用git clone --depth=10. 这将为您节省一些时间,但除非存储库很大,否则它可能不值得。


如果它在 Github 上,您可以使用Github V3 API 请求分支的提示,然后使用parents链接向后走。例如...

$ curl https://api.github.com/repos/evalEmpire/perl5i/branches/master
{
  "name": "master",
  "commit": {
    "sha": "aa1124b89f38eed793e2b9f2d2b2ba5d80a27a20",
    ...
    "parents": [
      {
        "sha": "d100dd2a118c425c730c17e395371e2cd84b43a3",
        "url": "https://api.github.com/repos/evalEmpire/perl5i/commits/d100dd2a118c425c730c17e395371e2cd84b43a3",
        "html_url": "https://github.com/evalEmpire/perl5i/commit/d100dd2a118c425c730c17e395371e2cd84b43a3"
      }
    ]
  },
  ...

有新的Github API v4 GraphQL API,它允许您制作查询。有了它,您可以想象在一个查询中获得所有 10 次提交,但我没有这方面的经验。


推荐阅读