Получить последние несколько ревизий SHA на ветке - PullRequest
0 голосов
/ 02 июля 2018

Я пытаюсь получить последние версии 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 голосов
/ 03 июля 2018

Спасибо за предложения.

git-bisect на самом деле тоже не работает, потому что тест запускается в другой системе (teamcity) и требует больше работы, чтобы сообщить результат в git.

В итоге я решил использовать API github, чтобы получить список последних коммитов и проанализировать первые 10 ревизий

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

0 голосов
/ 03 июля 2018

Мне в основном нужно получить последнюю версию кода, которая проходит определенные тесты - к сожалению, нет способа получить последнюю успешную версию непосредственно из теста. Я могу только пройти по списку один за другим и проверить, прошла ли эта ревизия или нет, пока не найду ту, которая делает.

Инструмент, который вы ищете: 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 коммитов в одном запросе, но я не имею опыта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...