보호된 브랜치

Tier: Free, Premium, Ultimate Offering: GitLab.com, Self-managed, GitLab Dedicated

GitLab에서는 권한이 기본적으로 리포지터리 및 브랜치에 대한 읽기 또는 쓰기 권한을 가지는 개념을 중심으로 정의됩니다. 특정 브랜치에 대해 추가 제한을 가하기 위해 브랜치를 보호할 수 있습니다.

보호된 브랜치는 다음을 관리합니다:

  • 어떤 사용자가 브랜치를 Merge할 수 있는지
  • 어떤 사용자가 브랜치로 푸시할 수 있는지
  • 사용자가 브랜치로 강제 푸시할 수 있는지
  • CODEOWNERS 파일에 나열된 파일의 변경 내용을 직접 푸시할 수 있는지
  • 어떤 사용자가 브랜치를 보호 해제할 수 있는지
  • Commits API를 통해 브랜치를 수정할 수 있는지

리포지터리의 기본 브랜치는 기본적으로 보호됩니다.

보호된 브랜치를 수정할 수 있는 사용자

  • GitLab 16.0에서 브랜치 푸시 권한이 변경되어 GitLab 관리자가 GitLab 16.0에서 allowed 권한을 가져야 함.

브랜치가 보호되면 기본 동작은 해당 브랜치에 대해 이러한 제한을 강제합니다.

액션 수행 가능한 사용자
브랜치 보호 적어도 Maintainer 역할
브랜치로 푸시 Allowed 권한이 있는 모든 사용자 (1)
브랜치로 강제 푸시 아무도 안 됨 (3)
브랜치 삭제 아무도 안 됨 (2)
  1. Developer 역할을 가진 사용자는 그룹 내에서 프로젝트를 만들 수 있지만, 초기에는 기본 브랜치로 푸시할 수 있는 권한을 가지고 있지 않을 수 있습니다.
  2. 아무도 Git 명령을 사용하여 보호된 브랜치를 삭제할 수 없지만, 적어도 Maintainer 역할을 가진 사용자는 UI 또는 API에서 보호된 브랜치를 삭제할 수 있습니다.
  3. group_protected_branches 피처 플래그가 활성화되고 동일한 브랜치가 그룹 및 프로젝트 레벨에서 모두 보호되는 경우, 프로젝트 레벨에서 구성된 강제 푸시 설정은 무시됩니다. 다른 모든 보호는 프로젝트 레벨 설정을 계속 사용합니다.

Merge Request 승인 정책을 구현하여 보호된 브랜치의 보호 해제 또는 삭제를 방지할 수 있습니다.

브랜치가 여러 규칙과 일치하는 경우

브랜치가 여러 규칙과 일치하는 경우, 가장 관대한 규칙이 브랜치의 보호 수준을 결정합니다. 예를 들어 다음과 같은 규칙을 고려해 보세요. 이 규칙은 와일드카드를 포함합니다:

브랜치 이름 패턴 Merge 허용 여부 푸시 및 Merge 허용 여부
v1.x Maintainer Maintainer
v1.* Maintainer + Developer Maintainer
v* 아무도 아무도

v1.x라는 브랜치는 v1.x, v1.*, v* 세 가지 브랜치 이름 패턴과 일치합니다. 가장 관대한 옵션이 행동을 결정하므로 v1.x 브랜치에 대한 권한은 다음과 같습니다:

  • Merge 허용: 3개의 설정 중에서 Maintainer + Developer가 가장 관대하며 따라서 결과적으로 브랜치의 동작을 제어합니다. 브랜치가 v1.xv*에도 일치하더라도(각각이 더 엄격한 권한을 갖는), Developer 역할을 가진 사용자가 브랜치를 Merge할 수 있습니다.
  • 푸시 및 Merge 허용: 3개의 설정 중에서 Maintainer가 가장 관대하며 따라서 브랜치 동작을 제어합니다. v*에 매칭되는 브랜치에 대해 아무도가 설정되어 있더라도, v1.x 또는 v1.*와도 매칭되는 브랜치는 더 관대한 Maintainer 권한을 받습니다.

특정 규칙이 브랜치의 동작을 제어하도록 하려면, 해당 규칙을 만족하는 모든 다른 패턴이 더 적거나 같은 규칙을 적용해야 합니다.

아무도v1.x 브랜치로 푸시할 수 있도록 보장하려면, v1.x에 일치하는 모든 패턴이 푸시 및 Merge 허용아무도로 설정해야 합니다. 다음처럼:

브랜치 이름 패턴 Merge 허용 여부 푸시 및 Merge 허용 여부
v1.x Maintainer 아무도
v1.* Maintainer + Developer 아무도
v* 아무도 아무도

기본 브랜치 보호 수준 설정

관리자는 관리자 영역에서 기본 브랜치 보호 수준을 설정할 수 있습니다.

기존 브랜치에 보호 추가

그룹 내 모든 프로젝트 또는 특정 프로젝트에 보호된 브랜치를 구성합니다.

특정 프로젝트의 경우

전제 조건:

  • 적어도 Maintainer 역할이 필요합니다.
  • 보호된 브랜치에 대해 그룹에 Allowed to merge 또는 Allowed to push and merge 권한을 부여할 때, 해당 그룹이 프로젝트에 추가되어야 합니다.

브랜치를 보호하려면:

  1. 왼쪽 사이드 바에서 검색 또는 이동을 선택하여 프로젝트를 찾습니다.
  2. 설정 > 리포지터리를 선택합니다.
  3. 보호된 브랜치를 확장합니다.
  4. 보호된 브랜치 추가를 선택합니다.
  5. 브랜치 드롭다운 디렉터리에서 보호하려는 브랜치를 선택합니다.
  6. Allowed to merge 디렉터리에서 이 브랜치로 Merge할 수 있는 역할을 선택합니다.
  7. Allowed to push and merge 디렉터리에서 이 브랜치로 푸시할 수 있는 역할을 선택합니다.

    note
    GitLab Premium 및 Ultimate에서는 Allowed to mergeAllowed to push and merge에 그룹 또는 개별 사용자를 추가할 수 있습니다.
  8. 보호를 선택합니다.

보호된 브랜치가 보호된 브랜치 디렉터리에 표시됩니다.

그룹 내 모든 프로젝트에 대한 경우

Tier: Premium, Ultimate Offering: Self-managed
  • GitLab 15.9에서 group_protected_branches라는 플래그와 함께 도입. 기본적으로 비활성화됨.
Self-managed GitLab에서는 이 기능이 기본적으로 사용 불가능합니다. 이를 사용하도록하려면 관리자가 feature flag를 활성화해야 합니다. GitLab.com 및 GitLab Dedicated에서는 이 기능을 사용할 수 없습니다.

그룹 소유자는 그룹에 대한 보호된 브랜치를 만들 수 있습니다. 이러한 설정은 그룹의 모든 프로젝트에서 상속되며 프로젝트 설정에서 재정의할 수 없습니다. 특정 브랜치가 그룹 및 프로젝트 레벨에서 각각 강제 푸시 허용 설정으로 구성된 경우, 프로젝트 수준의 강제 푸시 허용 설정은 그룹 레벨 설정을 무시합니다.

전제 조건:

  • 그룹 내에서 소유자 역할이 필요합니다.

그룹의 모든 프로젝트에 대해 브랜치를 보호하려면:

  1. 왼쪽 사이드 바에서 검색 또는 이동을 선택하여 그룹을 찾습니다.
  2. 설정 > 리포지터리를 선택합니다.
  3. 보호된 브랜치를 확장합니다.
  4. 보호된 브랜치 추가를 선택합니다.
  5. Branch 텍스트 상자에 브랜치 이름이나 와일드카드를 입력합니다. 브랜치 이름과 와일드카드 대소문자를 구분합니다.
  6. Allowed to merge 디렉터리에서 이 브랜치로 Merge할 수 있는 역할을 선택합니다.
  7. Allowed to push and merge 디렉터리에서 이 브랜치로 푸시할 수 있는 역할을 선택합니다.
  8. 보호를 선택합니다.

보호된 브랜치가 보호된 브랜치 디렉터리에 추가됩니다.

여러 브랜치를 와일드카드 규칙으로 보호하기

와일드카드를 사용하면 하나의 브랜치에 여러 규칙을 적용할 수 있습니다. 한 브랜치에 두 개 이상의 규칙이 적용되면 가장 허용이 많은 규칙이 브랜치 동작을 제어합니다. Merge 컨트롤이 올바르게 작동하려면 푸시 및 Merge 허용Merge 허용보다 넓은 사용자 집합으로 설정해야 합니다.

사전 준비 사항:

  • 최소한 Maintainer 권한이 있어야 합니다.

동시에 여러 브랜치를 보호하려면:

  1. 왼쪽 사이드바에서 검색 또는 이동을 선택하고 프로젝트를 찾습니다.
  2. 설정 > 리포지터리를 선택합니다.
  3. 보호된 브랜치를 확장합니다.
  4. 보호된 브랜치 추가를 선택합니다.
  5. 브랜치 드롭다운 디렉터리에서 브랜치 이름과 와일드카드를 입력합니다. 브랜치 이름과 와일드카드는 대소문자를 구분합니다. 예를 들어:

    와일드카드 보호된 브랜치 일치하는 브랜치들
    *-stable production-stable, staging-stable
    production/* production/app-server, production/load-balancer
    *gitlab* gitlab, gitlab/staging, master/gitlab/production
  6. Merge 허용 디렉터리에서 이 브랜치에 Merge할 수 있는 역할을 선택합니다.
  7. 푸시 및 Merge 허용 디렉터리에서 이 브랜치로 푸시할 수 있는 역할을 선택합니다. GitLab Premium이나 Ultimate을 사용하는 경우 그룹이나 개별 사용자를 추가할 수도 있습니다.
  8. 보호를 선택합니다.

보호된 브랜치가 보호된 브랜치 디렉터리에 표시됩니다.

보호된 새 브랜치 생성하기

개발자 권한이 있는 사용자는 새로운 보호된 브랜치를 만들 수 있습니다.

사전 준비 사항:

  • 푸시 및 Merge 허용아무도로 설정되어 있어야 합니다.
  • Merge 허용개발자로 설정되어 있어야 합니다.

다음 방법으로 사용자 인터페이스를 통해 보호된 새 브랜치를 만들 수 있습니다:

  1. 왼쪽 사이드바에서 검색 또는 이동을 선택하고 프로젝트를 찾습니다.
  2. 코드 > 브랜치를 선택합니다.
  3. 새 브랜치를 선택합니다.
  4. 브랜치 이름을 입력하고 새로운 브랜치를 기반으로하는 기존 브랜치, 태그 또는 커밋을 선택합니다. 보호된 브랜치와 이미 보호된 브랜치에 있는 커밋만을 허용합니다.

보호된 브랜치에 대한 Merge Request 제출 의무화

모든 사람에게 Merge Request을 제출하도록 강제할 수 있고, 이를 위해 직접 보호된 브랜치로 체크인하는 것을 허용하지 않을 수 있습니다.

  1. 왼쪽 사이드바에서 검색 또는 이동을 선택하고 프로젝트를 찾습니다.
  2. 설정 > 리포지터리를 선택합니다.
  3. 보호된 브랜치를 확장합니다.
  4. 보호된 브랜치 추가를 선택합니다.
  5. 브랜치 드롭다운 디렉터리에서 보호하려는 브랜치를 선택합니다.
  6. Merge 허용 디렉터리에서 개발자 + Maintainers를 선택합니다.
  7. 푸시 및 Merge 허용 디렉터리에서 아무도를 선택합니다.
  8. 보호를 선택합니다.

모든 사람이 보호된 브랜치로 직접 푸시할 수 있게 허용하기

쓰기 액세스 권한이 있는 모든 사람에게 보호된 브랜치로 푸시할 수 있도록 허용할 수 있습니다.

  1. 왼쪽 사이드바에서 검색 또는 이동을 선택하고 프로젝트를 찾습니다.
  2. 설정 > 리포지터리를 선택합니다.
  3. 보호된 브랜치를 확장합니다.
  4. 보호된 브랜치 추가를 선택합니다.
  5. 브랜치 드롭다운 디렉터리에서 보호하려는 브랜치를 선택합니다.
  6. 푸시 및 Merge 허용 디렉터리에서 개발자 + Maintainers를 선택합니다.
  7. 보호를 선택합니다.

보호된 브랜치로 푸시하기 위해 배포 키를 허용하기

  • GitLab 13.7에서 도입되었습니다.
  • 이 기능은 GitLab.com에서 13.7에서 선택적으로 배포되었으며 모든 사용자에게 사용 가능하지 않을 수 있습니다.
  • 이 기능은 GitLab 13.9에서 모든 사용자에게 사용 가능합니다.

배포 키의 소유자가 보호된 브랜치로 푸시할 수 있게 허용할 수 있습니다. 해당 사용자가 관련 프로젝트의 멤버가 아니더라도, 배포 키의 소유자는 프로젝트에 최소한 읽기 액세스를 가지고 있어야합니다.

사전 준비 사항:

  • 프로젝트에 배포 키를 활성화해야 합니다. 프로젝트 배포 키는 생성될 때 기본적으로 활성화됩니다. 그러나 공개 배포 키는 프로젝트에 액세스 권한을 부여받아야 합니다.
  • 배포 키는 해당 프로젝트 리포지터리에 쓰기 액세스를 가지고 있어야 합니다.

보호된 브랜치로 배포 키를 허용하려면:

  1. 왼쪽 사이드바에서 검색 또는 이동을 선택하고 프로젝트를 찾습니다.
  2. 설정 > 리포지터리를 선택합니다.
  3. 보호된 브랜치를 확장합니다.
  4. 보호된 브랜치 추가를 선택합니다.
  5. 브랜치 드롭다운 디렉터리에서 보호하려는 브랜치를 선택합니다.
  6. 푸시 및 Merge 허용 디렉터리에서 배포 키를 선택합니다.
  7. 보호를 선택합니다.

배포 키는 Merge 허용 드롭다운 디렉터리에 표시되지 않습니다.

보호된 브랜치에서 강제 푸시 허용하기

  • allow_force_push_to_protected_branches라는 플래그와 함께 GitLab 13.10에서 도입되었습니다. 기본적으로 비활성화되어 있습니다.
  • 이 기능은 GitLab.com과 올인원에서 14.0에서 활성화되었습니다. allow_force_push_to_protected_branches 플래그가 제거되었습니다.

보호된 브랜치로 강제 푸시를 허용할 수 있습니다.

새로운 브랜치를 보호하고 강제 푸시를 활성화하려면:

  1. 왼쪽 사이드바에서 검색 또는 이동을 선택하고 프로젝트를 찾습니다.
  2. 설정 > 리포지터리를 선택합니다.
  3. 보호된 브랜치를 확장합니다.
  4. 보호된 브랜치 추가를 선택합니다.
  5. 브랜치 드롭다운 디렉터리에서 보호하려는 브랜치를 선택합니다.
  6. 푸시 및 Merge 허용Merge 허용 디렉터리에서 원하는 설정을 선택합니다.
  7. 모든 사용자가 푸시 액세스를 허용하려면 강제 푸시 허용 토글을 켭니다.
  8. 보호를 선택합니다.

이미 보호된 브랜치에 이미 강제 푸시를 활성화하려면:

  1. 왼쪽 사이드바에서 검색 또는 이동을 선택하고 프로젝트를 찾습니다.
  2. 설정 > 리포지터리를 선택합니다.
  3. 보호된 브랜치를 확장합니다.
  4. 보호된 브랜치 추가를 선택합니다.
  5. 보호된 브랜치 디렉터리에서 해당 브랜치 옆에 강제 푸시 허용 토글을 켭니다.

해당 브랜치로 푸시할 수 있는 멤버는 이제 강제 푸시도 할 수 있습니다.

여러 규칙과 일치하는 브랜치

브랜치가 여러 규칙과 일치하는 경우, 가장 관대한 규칙이 브랜치의 보호 수준을 결정합니다. 예를 들어, 와일드카드를 사용하여 여러 브랜치 보호를 포함하는 다음 규칙을 고려해보세요:

브랜치 이름 패턴 강제 푸시 허용
v1.x
v1.* 아니오
v* 아니오

v1.x라는 브랜치는 v1.x, v1.*, v* 세 가지 브랜치 이름 패턴과 모두 일치합니다. 가장 관대한 옵션이 동작을 결정하기 때문에, 브랜치 v1.x의 결과적인 권한은 다음과 같습니다:

  • 강제 푸시 허용: 세 가지 설정 중에서 가 가장 관대하며, 결과적으로 브랜치 동작을 제어합니다. 브랜치가 v1.x, v1.*, v*에도 일치했지만(각각 더 엄격한 권한을 가지고 있음에도 불구하고), 이 브랜치에 푸시할 수 있는 사용자라면 강제 푸시도 할 수 있습니다.
note
프로젝트 수준에서의 브랜치 강제 푸시 설정은, group_protected_branches 피처 플래그가 활성화되고 그룹 소유자가 동일한 브랜치에 대한 그룹 수준 보호를 설정한 경우에는 그룹 수준 설정에 의해 재정의됩니다.

보호된 브랜치에 코드 소유자 승인 필요

Tier: Premium, Ultimate Offering: GitLab.com, Self-managed, GitLab Dedicated
  • GitLab 13.5에서 도입됨, 보호된 브랜치에 푸시할 수 있는 사용자와 그룹은 자신들의 기능 브랜치를 Merge하기 위해 Merge Request을 사용할 필요가 없습니다. 이는 이들이 Merge Request 승인 규칙을 건너뛸 수 있다는 것을 의미합니다.

보호된 브랜치의 경우, 코드 소유자 중 최소한 하나의 승인이 필요합니다. 브랜치가 여러 규칙에 의해 보호되는 경우, 적용 가능한 규칙 중에 코드 소유자 승인 필요가 활성화된 경우 이중 어떤 규칙도 승인이 필요합니다.

새로운 브랜치를 보호하고 코드 소유자 승인을 활성화하려면:

  1. 왼쪽 사이드바에서 검색 또는 이동을 선택하고 프로젝트를 찾습니다.
  2. 설정 > 리포지터리를 선택합니다.
  3. 보호된 브랜치를 확장합니다.
  4. 보호된 브랜치 추가를 선택합니다.
  5. 브랜치 드롭다운 디렉터리에서 보호하려는 브랜치를 선택합니다.
  6. 푸시 및 Merge 허용Merge 허용 허용 디렉터리에서 원하는 설정을 선택합니다.
  7. 코드 소유자 승인 필요 토글을 켭니다.
  8. 보호를 선택합니다.

이미 보호된 브랜치에 코드 소유자 승인을 활성화하려면:

  1. 왼쪽 사이드바에서 검색 또는 이동을 선택하고 프로젝트를 찾습니다.
  2. 설정 > 리포지터리를 선택합니다.
  3. 보호된 브랜치를 확장합니다.
  4. 보호된 브랜치 추가를 선택합니다.
  5. 보호된 브랜치 디렉터리에서 브랜치 옆에 있는 코드 소유자 승인 토글을 켭니다.

활성화되면, 이러한 브랜치에 대한 모든 Merge Request은 승인이 필요하며 일치하는 규칙별로 코드 소유자에 의해 승인되어야만 Merge될 수 있습니다. 또한, 보호된 브랜치로의 직접 푸시는 규칙이 일치하는 경우 거부됩니다.

CODEOWNERS 파일에 지정되지 않은 사용자는 지정된 파일이나 경로에 대한 변경을 푸시할 수 없으며, 특별히 허용되지 않는 한입니다. 개발자들을 직접 보호된 브랜치로 푸시하는 것을 제한할 필요는 없습니다. 대신, 코드 소유자의 검토가 필요한 특정 파일로의 푸시를 제한할 수 있습니다.

GitLab Premium 13.5 및 이후 버전에서는, 보호된 브랜치로 푸시할 수 있는 사용자와 그룹은 자신들의 기능 브랜치를 Merge하기 위해 Merge Request을 사용할 필요가 없습니다. 그러므로, Merge Request 승인 규칙, 코드 소유자를 포함하여 건너뛸 수 있습니다.

보호된 브랜치에서 파이프라인 실행

보호된 브랜치로의 Merge이나 푸시 권한은 사용자가 CI/CD 파이프라인을 실행하고 작업을 실행할 수 있는지를 결정합니다.

Merge Request 파이프라인은 소스 브랜치에서 실행되므로, Merge Request을 열고 있는 사용자가 소스 브랜치에 Merge하거나 푸시할 권한이 없다면 파이프라인이 생성되지 않습니다.

자세한 내용은 보호된 브랜치의 파이프라인 보안을 참조하세요.

보호된 브랜치 삭제

최소한 Maintainer 역할을 가진 사용자는 GitLab 웹 인터페이스를 사용하여 보호된 브랜치를 매뉴얼으로 삭제할 수 있습니다:

  1. 왼쪽 사이드바에서 검색 또는 이동을 선택하고 프로젝트를 찾습니다.
  2. 코드 > 브랜치를 선택합니다.
  3. 삭제하려는 브랜치 옆에 삭제()를 선택합니다.
  4. 확인 대화상자에서 브랜치 이름을 입력하고 예, 보호된 브랜치 삭제를 선택합니다. 브랜치 이름은 대소문자를 구분합니다.

보호된 브랜치는 UI 또는 API를 통해서만 GitLab을 통해 삭제할 수 있습니다. 로컬 Git 명령이나 외부 Git 클라이언트를 통한 브랜치의 실수 삭제를 방지합니다.

관련 주제

문제 해결

브랜치 이름은 대소문자를 구분합니다

git에서 브랜치 이름은 대소문자를 구분합니다. 보호된 브랜치를 구성하거나 대상 브랜치 워크플로 구성하는 경우, devDEVDev와 같지 않습니다.