当我创建从release分支到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如果您的操作系统提供了符号链接,则可以(通常,每个克隆一次)将符号链接安装为Git钩子,该符号链接指向存储库工作树中的文件。这样,您可以得到受各种操作影响的钩子:由于该钩子的实际可执行代码位于您的工作树中,因此影响工作树中该文件的事物也会影响该钩子。类似地,在不提供符号链接的OS上,您可以(手动,每个克隆一次)安装一个钩子脚本或二进制文件,该脚本可以通过在工作树之外运行脚本或二进制文件来工作。也就是说,您不必依赖于操作系统的符号链接机制来直接从工作树中运行文件,而是编写一个钩子,其“运行”操作由“来自工作树中的运行文件”组成,并使用其退出状态作为钩子的出口状态”。