Как предотвратить создание pu sh ветки с помощью python? - PullRequest
0 голосов
/ 28 мая 2020

Я написал хук pre-pu sh в python, который частично предотвращает попадание pu sh в основную ветку. т.е. когда в ветке функции и данной команде git push origin master, файлы помещаются.

На изображении ниже, когда голова находится в основной ветке, пу sh предотвращается. when the user is in master branch, the push is prevented

Но когда голова находится в ветви feature1, пу sh мастер не препятствует. enter image description here

Мой код на данный момент:

#!/usr/bin/env python

import sys
import re
from subprocess import check_output

branch = check_output(['git', 'symbolic-ref','--short','HEAD']).strip()
print('branch-name:',branch.decode('utf-8')) #this prints the current branch: feature (if in feature) 


if ((branch.decode('utf-8')) != 'master'):
    print('into if clause')
    print('push to remote successful')
    sys.exit(0)

else :
    print('into else clause')
    print('you are not allowed to push to the master branch')
    sys.exit(1)

Я хочу изменить код таким образом, чтобы следующие команды не были разрешены (независимо от ветка, в которой он находится): git push --force origin master; git push --delete origin master; git push origin master; git co master; git push --force origin. Заранее спасибо.

1 Ответ

0 голосов
/ 09 августа 2020

Если вы используете бесплатный план для частного репо в Github, возможно, вы не сможете использовать функцию защищенной ветки. Таким образом, вам нужно заблокировать любой pu sh / commit из local. Имейте в виду, что это можно легко обойти с помощью команды --no-verify.

Я рекомендую вам делать это с помощью хаски вместо python, так как это намного проще, я думаю ..

Это то, что я сделал, чтобы он работал локально и распространялся среди всех участников репо.

Прежде всего, вам нужно установить хаски для управления pre-commit и pre-pu sh hook. Затем я создал сценарий pre-pu sh bash и зафиксировал его в репозитории. Затем вызовите этот скрипт из хука хаски pre-pu sh с параметром хаски.

Это моя конфигурация хаски внутри package.json (вы можете установить отдельную конфигурацию, если хотите)

"husky": {
    "hooks": {
        "pre-commit": "./commands/pre-commit",
        "pre-push": "./commands/pre-push $HUSKY_GIT_STDIN"
    }
},

как видите, у меня есть 2 скрипта, один для pre-pu sh и один для pre-commit.

А это мой commands/pre-push bash скрипт

#!/bin/bash

echo -e "===\n>> Talenavi Pre-push Hook: Checking branch name / Mengecek nama branch..."

BRANCH=`git rev-parse --abbrev-ref HEAD`
PROTECTED_BRANCHES="^(master|develop)"

if [[ $1 != *"$BRANCH"* ]]
then
  echo -e "\n? You must use (git push origin $BRANCH) / Anda harus menggunakan (git push origin $BRANCH).\n" && exit 1
fi

if [[ "$BRANCH" =~ $PROTECTED_BRANCHES ]]
then
  echo -e "\n? Cannot push to remote $BRANCH branch, please create your own branch and use PR."
  echo -e "? Tidak bisa push ke remote branch $BRANCH, silahkan buat branch kamu sendiri dan gunakan pull request.\n" && exit 1
fi

echo -e ">> Finish checking branch name / Selesai mengecek nama branch.\n==="

exit 0

Скрипт в основном будет делать 2 вещи:

  • Этот скрипт будет блокировать любого, кто пытается сделать sh определенную ветку (в моем случае я не хочу, чтобы кто-либо, включая меня, делал пу sh напрямую в ветки master и develop). Им нужно работать в своей собственной ветке, а затем создать запрос на перенос.
  • Этот сценарий заблокирует любого, кто пытается сделать sh ветку, отличную от их текущей активной ветки. Например, вы находитесь в ветке fix/someissue, но затем ошибочно набираете git push origin master.

Более подробные инструкции вы можете найти в этой статье: https://github.com/talenavi/husky-precommit-prepush-githooks

...