Выполняется ли ловушка фиксации перед слиянием, когда я нажимаю кнопку запроса на слияние в github? - PullRequest
2 голосов
/ 03 марта 2020

Я хочу обновить версию пакета автоматически, когда я создаю запрос на извлечение из ветки релиза в мастер, и после этого я хочу всякий раз, когда я объединяю его, будет выполняться ловушка предварительного слияния git для запуска другого сценария.

pre-merge-commit:

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 hook и выполнить git команды вручную, он успешно работает и обновляет репозиторий в github как тот, который я хочу. Но я не уверен, что хуки git выполняются на сервере Github, когда я нажимаю кнопку запроса на слияние.

1 Ответ

2 голосов
/ 04 марта 2020

Короткий ответ - нет.

Крючки привязаны к одному заданному c репозиторию и не передаются Git операциями. 1 Любые хуки вы настроили в ваш репозиторий не настроен в каком-либо другом репозитории. Таким образом, хук, который у вас есть в вашем репозитории, действует в вашем репозитории и в нем, но если у вас есть второй клон в другом месте, он не действует в этом втором клоне и в нем.

Кроме того, GitHub использует другой механизм ( «GitHub Actions») и просто не позволяйте вам устанавливать какие-либо хуки в их репозитории.


1 Если ваша ОС предоставляет символические c ссылки, вы Можно (вручную, один раз для каждого клона) установить символическую ссылку как хук Git, причем символическая ссылка указывает на файл в рабочем дереве для вашего хранилища. Таким образом, вы можете получить хук, который зависит от различных операций: поскольку фактический исполняемый код хука живет в вашем рабочем дереве, вещи, которые влияют на этот файл в вашем рабочем дереве, влияют на хук.

Аналогично, в ОС, которые не предоставляют символьные c ссылки, вы можете (вручную, один раз для клона) установить бинарный скрипт-или-бинарный файл, который работает, выполняя скрипт-или-бинарный файл из вашего работа дерево. То есть вместо того, чтобы полагаться на механизм символьной c ОС для запуска файла непосредственно из вашего рабочего дерева, вы пишете ловушку, операция «run» которой состоит из «запуска файла из рабочего дерева», и используете его состояние выхода как статус выхода из крючка ".

...