마스터 브랜치에서 커밋 방지


84

(간단 함을 위해) Git-repo에 master브랜치와 a dev가 있습니다. master브랜치가 항상 작동 하는지 확인하고 싶으 므로 내가하는 모든 작업은 dev브랜치에 있어야합니다 .

그러나 변경 사항을 병합으로 병합 할 때 분기 --no-ff에 머무르고 master계속 작업 하는 경향이 있습니다 ( dev분기 를 체크 아웃하는 것을 잊었 기 때문에 ).

master커밋 및 빨리 감기 병합을 수행 할 수 없지만 --no-ff다른 분기 에서만 병합 하는 분기에 대한 규칙을 설정할 수 있습니까?

이것은 비공개 호스팅 리포지토리에서 작동해야합니다 (GitHub 및 BitBucket이 아님).


4
"빨리 감기 커밋"은 문제가 아닙니다. 커밋은 단지 커밋이며 git commit, 새로운 것을 만들고, 빨리 감기가 일어나지 않습니다. 현재 분기가 master인 경우 일반 커밋을 금지하려는 것처럼 들립니다 .이 경우 pre-commit후크를 살펴보십시오 .
— torek

답변:


154

예, 가능합니다. 마스터 브랜치에 대한 커밋을 거부하는 사전 커밋 후크를 생성해야합니다. Git은 merge 명령 을 호출 할 때 사전 커밋 후크를 호출하지 않으므로이 후크는 일반 커밋 만 거부합니다.

  1. 저장소로 이동하십시오.
  2. 다음 내용으로 .git / hooks / pre-commit 파일을 만듭니다 .

    #!/bin/sh
    
    branch="$(git rev-parse --abbrev-ref HEAD)"
    
    if [ "$branch" = "master" ]; then
      echo "You can't commit directly to master branch"
      exit 1
    fi
    
  3. 실행 가능하게 만드십시오 ( Windows 에서는 필요하지 않음 ).

    $ chmod +x .git/hooks/pre-commit
    

빨리 감기 병합 을 비활성화하려면 .git / config 파일에 다음 옵션도 추가해야 합니다.

[branch "master"]
    mergeoptions = --no-ff

원격에서 마스터 브랜치를 보호하려면이 답변을 확인하십시오 : git에서 마스터 브랜치에 대한 액세스를 제한하는 방법


이것은 내가 필요한 것과 똑같이 보입니다. Windows에서도 작동합니까?
— Rasmus Bækgaard 2016

2
@ RasmusBækgaard 그렇습니다. 후크에 대한 bash 스크립트는 Windows 용 Git에 포함 된 Git bash에 의해 해석됩니다. (chmod 단계는 필요하지 않습니다.)
— VonC

참고 : master사전 푸시 후크에서 원격 분기로 푸시하지 못하도록 방지 할 수도 있습니다 . 예 : gist.github.com/aaronhoffman/ffbfd36928f9336be2436cffe39feaec
— 아론 호프만

4
니스, 프로젝트 저장소에서 이러한 규칙이나 다른 자식 후크를 추가하는 방법을 찾고 사람을 위해,이 간단한 NPM 패키지를 확인합니다 github.com/kilianc/shared-git-hooks을 , 당신은 아무것도를 포함 할 수 없기 때문에 그 아래에 상주 .git 디렉토리를 저장소에 추가합니다.
— George Dimitriadis 2017-10-24

9
또한 이것은 로컬 git 리포지토리에만 해당됩니다. .git 디렉토리의 내용을 수동으로 변경하지 않고도 모든 개발자를 위해 다른 git 리포지토리에 규칙을 적용하려면 어떻게해야합니까?
— Alexander Mills

13

이를 위해 사전 커밋 유틸리티를 사용할 수 있습니다 . no-commit-to-branch하나 이상의 분기에 대한 커밋을 방지하는 데 사용할 수있는 후크가 내장되어 있습니다.

설정

기본 설정 프로세스는 다음과 같습니다.

  • pip 또는 brew를 사용하여 설치 ( https://pre-commit.com/#install의 지침 )
  • .pre-commit-config.yaml프로젝트의 루트에 파일을 만듭니다 (첫 번째 초안은 아래 참조).
  • 을 실행하여 git 구성에 후크를 설치합니다 pre-commit install.

분기 보호를위한 기본 구성

다음은 no-commit-to-branch후크 만 포함하는 기본 구성입니다 .

repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
  rev: v3.3.0
  hooks:
    - id: no-commit-to-branch
      args: ['--branch', 'master']

여러 분기를 보호 --branch하려면 인수 목록에 여러 인수를 포함 할 수 있습니다 .

repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
  rev: v3.3.0
  hooks:
    - id: no-commit-to-branch
      args: ['--branch', 'master', '--branch', 'staging']

이 모든 것이 과잉 아닌가?

사전 커밋에는 다른 많은 내장 후크 와 커밋을 정리하고 유효성을 검사하는 방식을 변화시킬 커뮤니티 구축 후크 모음이 있습니다 . 내가 이것을 언급 한 이유는이 도구가 보호 된 브랜치에 대한 커밋을 막기에는 과도 할 수 있지만 모든 git 프로젝트에 매력적이고 간단한 추가를 만드는 다른 많은 기능이 있기 때문입니다.


7

다음을 통해 전 세계적으로 설치하는 것이 합리적 일 수 있습니다.

git config --global core.hooksPath ~/githooks

해당 pre-commit파일을 해당 디렉토리로 이동


여러 저장소가있는 경우 모든 저장소에 영향을주지 않습니까?
— Rasmus Bækgaard

1
그리고 당신이 대부분의 경우에 무엇을 할 수 것입니다
— 미셸 미아

나는 그들이 이름이 이상한 프로젝트,이 말 master에 Production예외가 될 수 있습니다 -
— Rasmus Bækgaard

당신이 사용하거나 bash는 연산자를 사용하면 클라이언트 측에서 보호하려는 많은 지점을 지정
— 미셸 미아
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.