git - 在分支上获取最后几个修订版 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 次修订的列表,而不仅仅是最后一次。
任何人都可以帮忙吗?
解决方案
我基本上需要获得通过某些测试的最新代码修订版——不幸的是,没有办法直接从测试中获得最新的成功修订版。我只能逐个查看该列表并检查该修订是否通过,直到找到一个通过为止。
您正在寻找的工具是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 次提交,但我没有这方面的经验。
推荐阅读
- java - DirectBuffer 加速 ImageIO
- search - NetSuite - 如何使标准项目字段可搜索
- django - Django保存多对多字段的选定值
- c# - 如何在 C# 的泛型方法中访问属性值?
- java - 如何将图像从项目目录检索到 jlabel?
- microcontroller - 带有 GSM 模块的 PIC 微控制器
- asp.net - 使用 Javascript 渲染 React JS 组件
- spring - 为什么 Spring bean 必须是可序列化的?
- python-2.x - 为什么 41 == 0041 的结果在 python 中给出 False?
- amazon-web-services - 使用 Amazon lambda 函数和 API Gateway 创建 API