当我点击 github 中的合并请求按钮时,预合并提交钩子是否会被执行?

Sli*_*lim 5 git githooks node.js

当我创建从发布分支到主控的拉取请求时,我想自动更新包版本,之后我希望每当我合并它时,都会执行预合并 git 挂钩来启动另一个脚本。

预合并提交:

cd my_app
    node ./hooks/post-commit-version
    RETVAL=$?

    if [ $RETVAL -ne 0 ]
    then
       exit 1
    fi
Run Code Online (Sandbox Code Playgroud)

钩子/提交后版本:

#!/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)
    })
Run Code Online (Sandbox Code Playgroud)

当我在本地尝试此操作时,使用pre-commithook 并手动执行 git 命令,它会成功运行并按照我想要的方式更新 github 中的存储库。但当我单击合并请求按钮时,我不确定 git hooks 是否在 Github 服务器中执行。

tor*_*rek 6

最简洁的答案是不。

Hooks 绑定到一个特定的存储库,并且不会通过 Git 操作进行传输。1您在存储库 中设置的任何挂钩都不会在其他存储库中设置。因此,您存储库中的挂钩会在存储库中起作用,但如果您在其他地方有第二个克隆,则它不会在第二个克隆中起作用。

除此之外,GitHub 使用不同的机制(“GitHub Actions”),只是不允许您首先将任何钩子放入其存储库中。


1如果您的操作系统提供符号链接,您可以(手动,每个克隆一次)安装符号链接作为 Git 挂钩,该符号链接指向存储库工作树中的文件。通过这种方式,您可以获得受各种操作影响的挂钩:由于挂钩的实际可执行代码位于工作树中,因此影响工作树中该文件的事物也会影响挂钩。

同样,在不提供符号链接的操作系统上,您可以(手动,每个克隆一次)安装一个钩子脚本或二进制文件,该钩子脚本或二进制文件通过在工作树外运行脚本或二进制文件来工作。也就是说,您不依赖操作系统的符号链接机制直接从工作树运行文件,而是编写一个钩子,其“运行”操作包括“从工作树运行文件并使用其退出状态作为钩子的退出”地位”。