Мне в основном нужно получить последнюю версию кода, которая проходит определенные тесты - к сожалению, нет способа получить последнюю успешную версию непосредственно из теста. Я могу только пройти по списку один за другим и проверить, прошла ли эта ревизия или нет, пока не найду ту, которая делает.
Инструмент, который вы ищете: 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
или git bisect good
. Затем он перейдет к следующему коммиту в своем бинарном поиске. В конце концов, это сузит неудачу до одного коммита. Обычно это занимает log(n)
попыток. Так что если будет 100 коммитов для поиска, он найдет их примерно за 10 попыток.
Вы можете автоматизировать процесс с помощью git bisect run <command>
. Он будет запускать command
для каждого коммита и использовать состояние выхода, чтобы определить, хорошо это или плохо.
Именно поэтому важно избегать коммитов, которые не проходят тесты.
Обычно Git не любит работать через пульты. Это просто не для этого. Самое простое, что нужно сделать, это клонировать репозиторий и использовать git log
. Большинство хранилищ очень маленькие. Если это не так, это вызовет всевозможные проблемы, и вы должны изучить git-lfs
, чтобы это исправить.
Вы можете сделать мелкий клон и получить только 10 последних коммитов с помощью 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 коммитов в одном запросе, но я не имею опыта.