当我单击 github 中的合并请求按钮时,是否会执行预合并提交挂钩?
Does the pre-merge commit hook get executed when I click merge request button in github?
我想在创建从发布分支到 master 的拉取请求时自动更新包版本,之后我希望每当我合并它时,预合并 git 挂钩将被执行以启动另一个脚本。
预合并提交:
cd my_app
node ./hooks/post-commit-version
RETVAL=$?
if [ $RETVAL -ne 0 ]
then
exit 1
fi
hooks/post-commit-version:
#!/usr/bin/env node
const exec = require('child_process').exec;
const path = require('path');
const moment = require('moment');
const fs = require('fs');
function getBranch(){
return new Promise((resolve, reject) =>{
exec(
"git branch | grep '*'",
function (err, stdout, stderr) {
if(err)reject(err)
const name = stdout.replace('* ','').replace('\n','');
resolve(name)
}
)
});
}
getBranch()
.then((branch) => {
if(branch === 'release') {
const currentDate = moment().format('YY.MM.DD')
var pathToFile = path.join(__dirname, "../package.json");
if (fs.existsSync(pathToFile)) {
const data = fs.readFileSync(pathToFile, 'utf-8')
const content = JSON.parse(data);
content.version = currentDate;
fs.writeFileSync(pathToFile, JSON.stringify(content, null, 2), 'utf8');
exec(`git add ${pathToFile}`, (err, stdout, stderr) => {
if(err) console.log(err)
console.log(stdout)
})
} else {
console.log("Cannot find file : " + pathToFile);
return;
}
}
return;
})
.catch(error => {
console.log(error)
})
当我在本地尝试此操作时,使用 pre-commit
挂钩并手动执行 git 命令,它成功运行并将 github 中的存储库更新为我想要的是。但是我不确定当我单击合并请求按钮时 git 挂钩是否在 Github 服务器中执行。
简短的回答是否定的。
挂钩绑定到一个特定的存储库并且不会通过Git操作传输。1您设置的任何挂钩在您的 存储库中未在其他存储库中设置。因此,您在存储库中的挂钩在您的存储库中和在您的存储库上起作用,但如果您在其他地方有第二个克隆,它不会在第二个克隆中和在第二个克隆上起作用。
除此之外,GitHub 使用不同的机制 ("GitHub Actions"),只是不允许您首先将任何挂钩放入其存储库。
1如果您的 OS 提供符号 links,您可以(手动,每个克隆一次)安装一个 symlink 作为Git 钩子,symlink 指向存储库工作树中的文件。通过这种方式,您可以获得一个 受到 各种操作影响的挂钩:由于挂钩的实际可执行代码存在于您的工作树中,因此影响工作树中该文件的事物会影响钩子。
类似地,在不提供符号 link 的 OS 上,您可以(手动,每个克隆一次)安装由 [=39 工作的挂钩脚本或二进制文件=]从您的工作树中提取一个脚本或二进制文件。也就是说,不是依赖 OS 的符号 link 机制直接从工作树 运行 文件,而是编写一个钩子,其 "run" 操作包括"run file from work-tree and use its exit status as the hook's exit status".
我想在创建从发布分支到 master 的拉取请求时自动更新包版本,之后我希望每当我合并它时,预合并 git 挂钩将被执行以启动另一个脚本。
预合并提交:
cd my_app
node ./hooks/post-commit-version
RETVAL=$?
if [ $RETVAL -ne 0 ]
then
exit 1
fi
hooks/post-commit-version:
#!/usr/bin/env node
const exec = require('child_process').exec;
const path = require('path');
const moment = require('moment');
const fs = require('fs');
function getBranch(){
return new Promise((resolve, reject) =>{
exec(
"git branch | grep '*'",
function (err, stdout, stderr) {
if(err)reject(err)
const name = stdout.replace('* ','').replace('\n','');
resolve(name)
}
)
});
}
getBranch()
.then((branch) => {
if(branch === 'release') {
const currentDate = moment().format('YY.MM.DD')
var pathToFile = path.join(__dirname, "../package.json");
if (fs.existsSync(pathToFile)) {
const data = fs.readFileSync(pathToFile, 'utf-8')
const content = JSON.parse(data);
content.version = currentDate;
fs.writeFileSync(pathToFile, JSON.stringify(content, null, 2), 'utf8');
exec(`git add ${pathToFile}`, (err, stdout, stderr) => {
if(err) console.log(err)
console.log(stdout)
})
} else {
console.log("Cannot find file : " + pathToFile);
return;
}
}
return;
})
.catch(error => {
console.log(error)
})
当我在本地尝试此操作时,使用 pre-commit
挂钩并手动执行 git 命令,它成功运行并将 github 中的存储库更新为我想要的是。但是我不确定当我单击合并请求按钮时 git 挂钩是否在 Github 服务器中执行。
简短的回答是否定的。
挂钩绑定到一个特定的存储库并且不会通过Git操作传输。1您设置的任何挂钩在您的 存储库中未在其他存储库中设置。因此,您在存储库中的挂钩在您的存储库中和在您的存储库上起作用,但如果您在其他地方有第二个克隆,它不会在第二个克隆中和在第二个克隆上起作用。
除此之外,GitHub 使用不同的机制 ("GitHub Actions"),只是不允许您首先将任何挂钩放入其存储库。
1如果您的 OS 提供符号 links,您可以(手动,每个克隆一次)安装一个 symlink 作为Git 钩子,symlink 指向存储库工作树中的文件。通过这种方式,您可以获得一个 受到 各种操作影响的挂钩:由于挂钩的实际可执行代码存在于您的工作树中,因此影响工作树中该文件的事物会影响钩子。
类似地,在不提供符号 link 的 OS 上,您可以(手动,每个克隆一次)安装由 [=39 工作的挂钩脚本或二进制文件=]从您的工作树中提取一个脚本或二进制文件。也就是说,不是依赖 OS 的符号 link 机制直接从工作树 运行 文件,而是编写一个钩子,其 "run" 操作包括"run file from work-tree and use its exit status as the hook's exit status".