在分支上获取最新的几个修订版SHA

时间:2018-07-02 20:36:02

标签: git github

我正在尝试获取一些最新的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个修订的列表,而不仅仅是最近一个。

有人可以帮忙吗?

2 个答案:

答案 0 :(得分:2)

  

我基本上需要获得通过某些测试的最新代码修订版-不幸的是,无法直接从测试中获取最新的成功修订版。我只能一一列出下来,检查该修订是否通过,直到找到一个通过。

您要寻找的工具是git-bisect。它执行binary search来查找哪个提交违反了测试。您提供的任何测试。这比一个接一个地进行要高效得多。

克隆存储库,然后...

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

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

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

顺便说一句,这就是为什么避免进行未通过测试的提交很重要的原因。


通常,Git不喜欢通过遥控器进行操作。它不是为此而构建的。最简单的方法是克隆存储库并使用git log。大多数存储库很小。如果不是,那将会引起各种各样的问题,您应该研究git-lfs来解决此问题。

您可以进行浅表克隆,并使用git clone --depth=10仅获取最后10次提交。这样可以节省您一些时间,但是除非存储库很大,否则可能不值得。


如果它在Github上,则可以使用Github V3 API to request the tip of the branch,然后使用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次提交,但是我没有经验。

答案 1 :(得分:0)

感谢您的建议。

git-bisect也不起作用,因为该测试是在另一个系统(teamcity)上运行的,并且需要更多的工作来将结果报告给git。

我最终采取的解决方案是使用github API获取最近提交的列表并解析前10个修订版本

https://api.github.com/repos/foo/foo/commits?sha=master