Git:获取分支中最新推送的所有提交的列表



我正在尝试在gitlab-runner中创建一个自动管道,该管道将应用最新git push中的所有更改。它在推送中拾取最新的提交(使用gitlab-runner中的$CI_COMMIT_SHA变量)。但是,如果推送有多个提交,则忽略旧的提交。因此,所有的更改都不会应用到应用程序中。

我有以下查询:

  1. 是否有任何Id分配给每个git push?基本上给定一个git推送Id,有没有办法找到所有的底层提交?
  2. 在gitlab-runner中是否有一种方法可以找到在最新的git推送中提交的所有文件?此外,我更愿意保持它们被提交的顺序。
  3. 我看到git cherry可以给我未推送提交的列表。是否有一种方法,我可以通过变量传递信息给gitlab-runner ?

Thanks in advance

我通过GitLab API获取最新的推送事件,通过在本地生成git CLI工具获取最新的提交,然后交叉检查它们来解决这个问题。

Push事件将有push_data属性,它将告诉您哪个提交范围在推送中。https://docs.gitlab.com/ee/api/events.html list-a-projects-visible-events

我缩短的node.js代码:

require('isomorphic-fetch');
const exec = require('util').promisify(require('child_process').exec);
const lastPush = await getLastPushEvent();
const commits = await listLatestCommits();
const commitsInLatestPush = [];
for (const commit of commits) {
if (lastPush.push_data.commit_from === commit.commit) {
break;
}
commitsInLatestPush.push(commit);
}
console.log(commitsInLatestPush);
async function getLastPushEvent() {
const events = await fetch(`https://gitlab.example.com/api/v4/projects/${process.env.CI_PROJECT_ID}/events?action=pushed`, {
headers: {
'PRIVATE-TOKEN': process.env.PRIVATE_GITLAB_TOKEN,
},
});
return events[0] || null;
}
async function listLatestCommits(count = 10) {
const { stdout, stderr } = await exec(`git log --pretty=format:'{%n  ^^^^commit^^^^: ^^^^%H^^^^,%n  ^^^^abbreviated_commit^^^^: ^^^^%h^^^^,%n  ^^^^tree^^^^: ^^^^%T^^^^,%n  ^^^^abbreviated_tree^^^^: ^^^^%t^^^^,%n  ^^^^parent^^^^: ^^^^%P^^^^,%n  ^^^^abbreviated_parent^^^^: ^^^^%p^^^^,%n  ^^^^refs^^^^: ^^^^%D^^^^,%n  ^^^^encoding^^^^: ^^^^%e^^^^,%n  ^^^^subject^^^^: ^^^^%s^^^^,%n  ^^^^sanitized_subject_line^^^^: ^^^^%f^^^^,%n  ^^^^commit_notes^^^^: ^^^^%N^^^^,%n  ^^^^verification_flag^^^^: ^^^^%G?^^^^,%n  ^^^^signer^^^^: ^^^^%GS^^^^,%n  ^^^^signer_key^^^^: ^^^^%GK^^^^,%n  ^^^^author^^^^: {%n    ^^^^name^^^^: ^^^^%aN^^^^,%n    ^^^^email^^^^: ^^^^%aE^^^^,%n    ^^^^date^^^^: ^^^^%aD^^^^%n  },%n  ^^^^committer^^^^: {%n    ^^^^name^^^^: ^^^^%cN^^^^,%n    ^^^^email^^^^: ^^^^%cE^^^^,%n    ^^^^date^^^^: ^^^^%cD^^^^%n  }%n},' -n ${count} | sed 's/"/\\"/g' | sed 's/\^^^^/"/g' | sed "$ s/,$//" | sed -e ':a' -e 'N' -e '$!ba' -e 's/\n/ /g'  | awk 'BEGIN { print("[") } { print($0) } END { print("]") }'`);
if (stderr) {
throw new Error(`Git command failed: ${stderr}`);
}
const data = JSON.parse(stdout);
return data;
}

最新更新