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


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
그리고 당신이 대부분의 경우에 무엇을 할 수 것입니다
미셸 미아

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

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