我正在尝试获取一些最新的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个修订的列表,而不仅仅是最近一个。
有人可以帮忙吗?
答案 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 bad
或git 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