получить все коммиты в теге Git через GitHub API, вернуть только первый коммит - PullRequest
4 голосов
/ 22 апреля 2020

Я пытаюсь получить все коммиты в теге git throw github api. Я зарегистрировал эту проблему переполнения стека , но при этом он просит меня сравнить два тега и возвращает мне только первый коммит. Я хочу получить все коммиты указанного тега c. я использовал

https://api.github.com/repos/:org/:repo/compare/:tag_1...:tag_2

, потому что я хочу указать тег c Я добавил тот же тег

https://api.github.com/repos/RapidAPI/ant-design/compare/3.13.2...3.13.2

, он возвращает мне только 2 коммита, но в теге у меня много совершает, как вы можете видеть здесь. enter image description here

Ответы [ 2 ]

1 голос
/ 02 мая 2020

да, я был бы рад узнать, что делает тот же тег ..

Чтобы объяснить API /repos/:owner/:repo/compare/:base...:head, сначала мне нужно объяснить соответствующий API в Git сам по себе - как получить список коммитов.

Если бы вы запустили git log 3.13.2, он бы сделал несколько вещей:

  1. выяснит, что 3.13.2 является тегом ( здесь также можно использовать ветвь, идентификатор коммита или другие псевдонимы)
  2. найти коммит, принадлежащий этому тегу
  3. перечислить подробности об этом первом коммите
  4. проверить первый родитель этого коммита
  5. GOTO 3

Затем он будет продолжать проходить по истории репозитория, пока вы не решите выйти из процесса.

Но Что, если мы только хотим go вернуться к определенной точке? Здесь «диапазоны коммита» вступают в игру.

Если бы вы работали в командной строке, чтобы найти коммиты между двумя тегами, вы, вероятно, использовали бы этот синтаксис:

$ git log 3.13.1...3.13.2 --oneline                                                                                   
dab30ef2cc (tag: 3.13.2) update changelog (#14746)
a9a6da47ed Input: Clear icon doesn't disappear if value is null (vs undefined or empy string) (#14733)
5ad97a33d1 :lipstick: improve home page style in mobile device
dfc9b24c98 Properly type onMouseEnter and onMouseLeave events
991b47f421 update antd-tools version to check (#14738)
b3834e48b1 Table: fix showing only first page (#14724)
2b558af960 update silder snapshot (#14732)
99eeefc25d correct type in Switch (#14727)
6cdc203a2f Merge pull request #14725 from ant-design/fix-form-test
6f040b6c40 fix: strict check input
777c56a515 mock test
b6f81340ba small change
976a6a5c5a Fixed typos and improved grammar
31d55e43b3 upd: version
163140189f Fix quote rendering (#14708)
c895c809f9 improve tabs demo (#14701)
0d65f0578d :arrow_up: Update @types/react requirement from ~16.7.13 to ~16.8.1
736f5b9549 doc: handle invalid date in message.info() call
4b526bf251 docs: fix wrong comma

Именно таков дизайн /repos/:owner/:repo/compare/:base...:head API. основан на предоставлении диапазона фиксации, к которому вы хотите запросить, в форме двух тегов. Но что происходит, когда вы предоставляете один и тот же тег дважды?

$ git log 3.13.2...3.13.2 --oneline

Никаких коммитов не возвращается, потому что Git считает, что вы хотите найти диапазон коммитов из одного и того же тега - который является пустым набором. Это то, что GitHub API делает с вашим начальным вызовом API.

1 голос
/ 27 апреля 2020

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

Я считаю, что теги, возвращенные /repos/:owner/:name/tags, не отсортированы по дате создания , но в алфавитном порядке, поэтому мне пришлось отфильтровать теги, которые не соответствовали регулярному выражению версии, чтобы отловить некоторые случайные данные. Чтобы убедиться в правильности порядка, я использовал пакет semver npm, чтобы отсортировать их по версии.

Тогда нужно было просто использовать конечную точку сравнения с двумя последними тегами в хранилище.

// API client for working with GitHub data using promises
const { Octokit } = require("@octokit/rest");

// helper function to compare two version strings using semver
const semverGt = require('semver/functions/gt');

const owner =  "RapidAPI";
const repo = "ant-design";

const octokit = new Octokit();

octokit.repos
  .listTags({
    owner,
    repo,
  })
  .then(({ data: tags }) => {
    // filter out tags that don't look like releases
    const sortedTaggedVersions = tags.filter(t => t.name.match(/\d+.\d+.\d+/))
                                     .sort((a, b) => semverGt(a.name, b.name));

    // these are out inputs for locating the commits that are in the latest
    // release (aka "head") but are not in the previous release (aka "base")
    const head = sortedTaggedVersions[0].name;
    const base = sortedTaggedVersions[1].name;

    console.log(`Comparing base ${base} and head ${head}...`)

    return octokit.repos.compareCommits({
        owner,
        repo,
        base,
        head,
    });
  })
  .then(({ data }) => {
    console.log(`Found ${data.commits.length} commits:`);
    for (const c of data.commits) {
        let message = c.commit.message;

        // only show first line of commit message to keep output clean
        const newline = message.indexOf("\n");
        if (newline > -1) {
            message = message.substr(0, newline);
        }

        let author = c.author ? `@${c.author.login}` : null;
        if (author == null) {
          // use the name from the commit itself if we cannot find a GitHub committer
          author = c.commit.author.name;
        }

        console.log(` - ${c.sha} - ${author} - ${message}`)
    }
  })
  .catch(err => {
      console.error("Unable to find commits", err);
  });

Это результат:

$ node index.js
Comparing base 3.13.1 and head 3.13.2...
Found 19 commits:
 - 4b526bf251fde5d4b6f1fec6d1ec3eb8805b4c75 - @orzyyyy - docs: fix wrong comma
 - 736f5b9549a3de6d694786f63f835aa26c29d105 - @pine3ree - doc: handle invalid date in message.info() call
 - 0d65f0578de652d2b3f5231088eaeaab95d8a3be - dependabot[bot] - :arrow_up: Update @types/react requirement from ~16.7.13 to ~16.8.1
 - c895c809f91e7ce817d9a42c4e0fd3ea5311d198 - @gyh9457 - improve tabs demo (#14701)
 - 163140189f57c225dd49758f4ea2b8116f201dc9 - @ashearer - Fix quote rendering (#14708)
 - 31d55e43b358c148640a7991b444c56e1cf25456 - @ycjcl868 - upd: version
 - 976a6a5c5a2adb3c407e953b95df08f6810e0cd5 - @Josephus-P - Fixed typos and improved grammar
 - b6f81340baeec20caa8511693ea4ec7d7d0c0ba7 - @Josephus-P - small change
 - 777c56a515159a2eb7e809695def53d66aebfc10 - @zombieJ - mock test
 - 6f040b6c4090fbc060bf2a06a7a01b900f4fe890 - @ycjcl868 - fix: strict check input
 - 6cdc203a2fc58b5c89ea7bfe0ef361e7afdf95e6 - @ycjcl868 - Merge pull request #14725 from ant-design/fix-form-test
 - 99eeefc25d38a2e2060c23de0f8446fd90729911 - @imhele - correct type in Switch (#14727)
 - 2b558af9600c0d0fa56467b8de0522b2a4277232 - @zombieJ - update silder snapshot (#14732)
 - b3834e48b1e009adbd142a7e2c38a129729170de - @imhele - Table: fix showing only first page (#14724)
 - 991b47f421bc3c60d30a8ff1d689615e6b70dbe1 - @zombieJ - update antd-tools version to check (#14738)
 - dfc9b24c989c58ffe6a922b45286e09450f85579 - @GabeMedrash - Properly type onMouseEnter and onMouseLeave events
 - 5ad97a33d1d65f05a121796210e4fa15f2894c5c - @afc163 - :lipstick: improve home page style in mobile device
 - a9a6da47ed44d811e402822ec3933608405c27fb - @thilo-behnke - Input: Clear icon doesn't disappear if value is null (vs undefined or empy string) (#14733)
 - dab30ef2ccead39135ff6e4b215259344d812897 - @zombieJ - update changelog (#14746)

Это отличается от предоставленного URL на скриншоте https://api.github.com/repos/RapidAPI/ant-design/compare/3.13.2...3.13.2, поскольку он использует версию 3.13.2 для обоих тегов.

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