![](/img/trans.png)
[英]How to get a list of incoming commits on git push for a new branch in a hook
[英]Git: Get list if all commits in the latest push in a branch
我正在尝试在 gitlab-runner 中创建一个自动管道,它将应用最新的git push
中的所有更改。 它正在获取推送中的最新提交(使用 gitlab-runner 中的 $CI_COMMIT_SHA 变量)。 但是,如果推送有多个提交,它会忽略较旧的提交。 因此,所有更改都不会应用到应用程序中。
我有以下查询:
git cherry
可以给我未推送的提交列表。 有没有办法,我可以通过变量将信息传递给 gitlab-runner?提前致谢
我通过 GitLab API 获取最新的推送事件解决了这个问题,通过在本地生成 git CLI 工具获取最新的提交,然后交叉检查它们。
推送事件将具有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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.