GitHub позволяет настроить репозиторий так, чтобы пользователи не могли принудительно принудительно передать, но есть ли способ полностью предотвратить отправку в мастер? Я надеюсь сделать так, чтобы единственный способ добавить коммиты в мастер - это через пользовательский интерфейс запроса на вытягивание GitHub.

Ответы (7)

Начиная с исходного вопроса / ответа, Github добавил новую опцию для этого в пользовательский интерфейс ограниченных веток, который позволяет вам это настроить.

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

Чтобы найти его, перейдите в «Настройки»> «Филиалы»> «Правила защиты веток». и нажмите «Добавить правило». Github UI after following instructions Затем введите имя ветки, которую вы хотите защитить, и установите флажок, чтобы требовать проверки запросов на вытягивание перед объединением. Github UI with the button to click По умолчанию это останавливает только людей, которые не являются модераторами. Позже есть еще один флажок, чтобы гарантировать, что даже модераторы не могут объединиться. Github UI with the other button to click

Прямое нажатие на удаленное ведущее устройство отклоняется, когда проверки состояния включены, что означает, что единственный способ добавить коммиты на удаленном ведущем устройстве - это объединение запросов на вытягивание (которые проходят проверку состояния) на GitHub.

Вот результат моего эксперимента для главной ветки, требующей проверки статуса:

  1. Создать фиксацию в главной ветке на моем ПК.
  2. Направить к мастеру пульта.
  3. Появляется сообщение об отказе. В конце концов, фиксация не отправляется на удаленный компьютер.
C:\GitRepo\GitHub\TomoyukiAota\photo-location-map [master ↑1]> git push
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 12 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 305 bytes | 305.00 KiB/s, done.
Total 3 (delta 2), reused 0 (delta 0)
remote: Resolving deltas: 100% (2/2), completed with 2 local objects.
remote: error: GH006: Protected branch update failed for refs/heads/master.
remote: error: 3 of 3 required status checks are expected.
To https://github.com/TomoyukiAota/photo-location-map.git
 ! [remote rejected] master -> master (protected branch hook declined)
error: failed to push some refs to 'https://github.com/TomoyukiAota/photo-location-map.git'
C:\GitRepo\GitHub\TomoyukiAota\photo-location-map [master ↑1]>

Я надеюсь сделать так, чтобы единственный способ добавления коммитов в master - через пользовательский интерфейс запроса на вытягивание GitHub.

У меня есть решение, которое предотвращает отправку в основную ветвь и не требует утверждений или длительных проверок статуса для передачи запроса на вытягивание.

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

Создайте следующее действие GitHub в .github / workflows / requirePullRequest.yml.

имя: требуется запрос на вытягивание

на:
  pull_request:
    ветви:
      - владелец

вакансии:
  работа:
    имя: требуется запрос на вытягивание
    работает: ubuntu-latest
    шаги:
      - запустить: эхо привет

Затем обновите настройки репозитория, чтобы потребовать запрос на вытягивание пройти проверку статуса.

Если вы хотите, чтобы администраторы следовали одному и тому же правилу, вы должны проверить правило включить администраторов.

Таким образом, GitHub будет отклонять все прямые отправки в основную ветку, и запросы на вытягивание не будут задерживаться ничем.

Если вы используете Node, вы можете использовать хаски, чтобы создать предварительную проверку того, что прямое нажатие на мастер не происходит. Таким образом, вы по-прежнему можете использовать свои права администратора для объединения PR. Я думаю, что в других языках есть решения, похожие на хаски.

  1. npm install husky --save-dev
  2. В /. Huskyrc.js:
const preventPushToMaster = `branch=\`git symbolic-ref HEAD\`
if [ "$branch" = "refs/heads/master" ]; then
    echo "\\033[31mDirect push to master is not allowed.\\033[0m"
    exit 1
fi`;

module.exports = {
  hooks: {
    'pre-push': preventPushToMaster,
  },
};

Вы можете включить ограничения веток и решить, кому (с точки зрения пользователей и групп организации) разрешено отправлять сообщения.

https://help.github.com/articles/about-branch-restrictions/

«Примечание: если установлен флажок« Включить администраторов », и вы включили обязательные проверки статуса в ветке, и они завершились неудачно, любая попытка отправить изменения в базовую ветвь также потерпит неудачу, независимо от статуса разрешений пользователя или группы. . »

Текущий принятый ответ на самом деле правильный, но если вы являетесь владельцем организации или имеете права администратора, как в случае, если вы создали репо, вы все равно можете нажать на защищенные ветки. Из документации Github по адресу https://help.github.com/en/articles/about-branch-restrictions:

Владельцы организаций и люди с правами администратора для репозитория всегда могут отправлять запросы в защищенную ветку.

Для любого другого типа сотрудника git push завершится ошибкой.

Если вы действительно хотите вообще отключить нажатие, вам нужно настроить это локально, либо настроив недопустимый pushRemote для ветки, как упоминалось ранее:

git config branch.master.pushRemote no_push

или путем создания крюка предварительного выталкивания, как показано здесь: https://gist.github.com/vlucas/8009a5edadf8d0ff7430

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

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

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

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

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

как видите, у меня есть 2 скрипта, один для предварительного нажатия и один для предварительного коммита.

А это мои команды / 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 вещи:

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

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

2022 WebDevInsider