InfoGrab Docs

푸시 규칙

요약

푸시 규칙은 사용자 친화적인 인터페이스에서 활성화할 수 있는 pre-receive Git 훅입니다. GitLab은 푸시 규칙의 정규 표현식에 RE2 구문을 사용합니다. 사용자 정의 푸시 규칙을 위해서는 서버 훅을 사용합니다.

히스토리
  • 푸시 규칙의 최대 정규 표현식 길이가 GitLab 16.3에서 255자에서 511자로 변경됨.

푸시 규칙은 사용자 친화적인 인터페이스에서 활성화할 수 있는 pre-receive Git 훅입니다. 푸시 규칙을 통해 저장소에 푸시될 수 있는 것과 없는 것을 더 잘 제어할 수 있습니다. GitLab이 보호된 브랜치를 제공하지만 다음과 같이 더 구체적인 규칙이 필요할 수 있습니다:

  • 커밋 내용 평가.
  • 커밋 메시지가 예상 형식과 일치하는지 확인.
  • 브랜치 이름 규칙 적용.
  • 파일 세부 정보 평가.
  • Git 태그 제거 방지.
  • 서명된 커밋 요구.

GitLab은 푸시 규칙의 정규 표현식에 RE2 구문을 사용합니다. regex101 정규 표현식 테스터에서 테스트할 수 있습니다. 각 정규 표현식은 511자로 제한됩니다.

사용자 정의 푸시 규칙을 위해서는 서버 훅을 사용합니다.

Note

푸시 규칙은 포크 동기화 중에 우회됩니다. 업스트림 프로젝트에서 포크를 업데이트할 때 변경 사항은 포크의 푸시 규칙에 대한 유효성 검사 없이 직접 적용됩니다.

푸시 규칙은 상속된 설정이 아닌 템플릿으로 작동합니다:

  • 전역 푸시 규칙은 새 프로젝트의 템플릿 역할을 합니다. 전역 푸시 규칙을 만들면 해당 시점 이후에 만들어진 모든 프로젝트에 복사됩니다.
  • 프로젝트 푸시 규칙은 독립적인 복사본입니다. 프로젝트가 만들어진 후 전역 또는 그룹 규칙을 변경해도 프로젝트의 푸시 규칙이 자동으로 업데이트되지 않습니다.
  • 프로젝트에서 푸시 규칙을 삭제하면 해당 프로젝트에서 모든 푸시 규칙 제어가 제거됩니다. 프로젝트는 전역 또는 그룹 규칙을 사용하도록 되돌아가지 않습니다.

업데이트된 전역 푸시 규칙을 기존 프로젝트에 적용하려면 각 프로젝트에 대해 개별적으로 전역 푸시 규칙을 재정의해야 합니다.

Note

프로젝트에서 푸시 규칙을 삭제하면 해당 프로젝트에는 푸시 규칙이 전혀 없습니다. 프로젝트는 그룹이나 인스턴스의 규칙을 자동으로 상속하지 않습니다. 푸시 규칙을 복원하려면 프로젝트에 대해 다시 구성해야 합니다.

전역 푸시 규칙 활성화#

모든 새 프로젝트의 템플릿 역할을 하는 푸시 규칙을 만들 수 있습니다. 개별 프로젝트 또는 그룹에서 이러한 규칙을 재정의할 수 있습니다.

전역 푸시 규칙을 구성할 때:

  • 전역 푸시 규칙을 구성한 후에 만들어진 모든 프로젝트는 이 구성의 복사본을 상속합니다.
  • 기존 프로젝트는 영향을 받지 않습니다. 이러한 프로젝트를 수동으로 업데이트하려면 프로젝트별 전역 푸시 규칙 재정의를 참조하세요.
  • 전역 푸시 규칙 변경은 이미 푸시 규칙이 구성된 프로젝트를 업데이트하지 않습니다.

전제 조건:

  • 관리자여야 합니다.

전역 푸시 규칙을 만들려면:

  1. 오른쪽 상단에서 Admin을 선택합니다.
  2. Push rules를 선택합니다.
  3. Push rules를 확장합니다.
  4. 원하는 규칙을 설정합니다.
  5. Save push rules를 선택합니다.

그룹 푸시 규칙#

그룹 푸시 규칙을 통해 그룹 관리자는 특정 그룹에서 새로 만들어진 프로젝트에 대한 푸시 규칙을 설정할 수 있습니다.

그룹의 푸시 규칙을 구성하려면:

  1. 상단 바에서 Search or go to를 선택하고 그룹을 찾습니다.
  2. Settings > Repository를 선택합니다.
  3. Pre-defined push rules 섹션을 확장합니다.
  4. 원하는 설정을 선택합니다.
  5. Save push rules를 선택합니다.

새 프로젝트는 다음에서 푸시 규칙을 상속합니다:

  • 푸시 규칙이 정의된 가장 가까운 상위 그룹.
  • 상위 그룹에 푸시 규칙이 정의되어 있지 않으면 전체 인스턴스에 설정된 푸시 규칙.

프로젝트만 푸시 규칙을 상속합니다. 하위 그룹은 상위 그룹에서 푸시 규칙을 상속하지 않습니다. 새 프로젝트에 어떤 푸시 규칙이 적용되는지 확인하려면 하위 그룹에서 프로젝트를 만들고 프로젝트의 푸시 규칙을 확인합니다.

프로젝트별 전역 푸시 규칙 재정의#

프로젝트 푸시 규칙은 전역 푸시 규칙과 독립적입니다. 프로젝트의 푸시 규칙을 설정하면 해당 규칙이 해당 프로젝트에 대해 이전에 구성된 모든 규칙을 대체합니다.

프로젝트의 푸시 규칙을 설정하려면:

  1. 상단 바에서 Search or go to를 선택하고 프로젝트를 찾습니다.
  2. Settings > Repository를 선택합니다.
  3. Push rules를 확장합니다.
  4. 원하는 규칙을 설정합니다.
  5. Save push rules를 선택합니다.

프로젝트가 새 전역 푸시 규칙과 일치하려면 전역 설정과 일치하도록 프로젝트의 푸시 규칙을 구성해야 합니다. 프로젝트는 전역 푸시 규칙 변경을 자동으로 상속하지 않습니다.

사용자 확인#

커밋하는 사용자를 유효성 검사하는 데 이러한 규칙을 사용합니다.

Note

이러한 푸시 규칙은 커밋에만 적용되며 태그에는 적용되지 않습니다.

  • Reject unverified users: 커미터 이메일이 사용자의 확인된 이메일 주소 또는 비공개 커밋 이메일 주소 중 하나와 일치해야 합니다.

  • Reject inconsistent user name: 커밋 작성자 이름이 작성자 및 커미터 이메일이 동일한 커밋에 대해 사용자의 GitLab 계정 이름과 일치해야 합니다. 이 이메일이 다를 때 확인이 건너뛰어지며, 이는 다른 기여자의 커밋을 cherry-pick하거나 리베이스하는 것과 같은 워크플로우에서 발생합니다.

    이 규칙은 사용자의 Git 설정 잘못된 구성을 탐지하여 커밋 위생을 유지하는 데 도움이 되지만 사칭을 방지하지는 않습니다. 암호화 ID 확인을 위해서는 대신 Reject unsigned commits를 사용합니다.

  • Check whether the commit author is a GitLab user: 커밋 작성자와 커미터 이메일 주소 모두 GitLab 사용자의 확인된 이메일 주소와 일치해야 합니다.

  • Commit author's email: 작성자와 커미터 이메일 주소 모두 정규 표현식과 일치해야 합니다. 어떤 이메일 주소도 허용하려면 비워 두세요.

프로젝트용 봇 사용자 또는 그룹용 봇 사용자를 사용할 때 봇 토큰이 커밋하고 변경 사항을 푸시할 수 있도록 생성된 이메일 접미사를 추가해야 합니다.

커밋 메시지 유효성 검사#

커밋 메시지에 다음 규칙을 사용합니다:

  • Require expression in commit messages: 메시지가 표현식과 일치해야 합니다. 어떤 커밋 메시지도 허용하려면 비워 두세요. 멀티라인 모드를 사용하며 (?-m)을 사용하여 비활성화할 수 있습니다. 일부 유효성 검사 예시:

    • JIRA\-\d+은 모든 커밋이 Refactored css. Fixes JIRA-123처럼 Jira 이슈를 참조하도록 요구합니다.
    • [[:^punct:]]\b$은 마지막 문자가 구두점이면 커밋을 거부합니다. 단어 경계 문자(\b)는 Git이 커밋 메시지 끝에 줄바꿈 문자(\n)를 추가하기 때문에 거짓 음성을 방지합니다.

    GitLab UI에서 만든 커밋 메시지는 줄바꿈 문자로 \r\n을 설정합니다. 정규 표현식에서 \n 대신 (\r\n?|\n)을 사용하여 올바르게 일치시킵니다.

    예를 들어 다음 다중 줄 커밋 설명이 있는 경우:

    JIRA:
    Description
    

    이 정규 표현식으로 유효성을 검사할 수 있습니다: JIRA:(\r\n?|\n)\w+.

  • Reject expression in commit messages: 커밋 메시지가 표현식과 일치하지 않아야 합니다. 어떤 커밋 메시지도 허용하려면 비워 두세요. 멀티라인 모드를 사용하며 (?-m)을 사용하여 비활성화할 수 있습니다.

브랜치 이름 유효성 검사#

브랜치 이름을 유효성 검사하려면 Branch name에 정규 표현식을 입력합니다. 어떤 브랜치 이름도 허용하려면 비워 두세요. 기본 브랜치는 항상 허용됩니다. 특정 형식의 브랜치 이름은 보안 목적으로 기본적으로 제한됩니다. Git 커밋 해시와 유사한 40자 16진수 문자로 된 이름은 금지됩니다.

일부 유효성 검사 예시:

  • 브랜치는 JIRA-로 시작해야 합니다.

    ^JIRA-
    
  • 브랜치는 -JIRA로 끝나야 합니다.

    -JIRA$
    
  • 브랜치는 4에서 15자 사이여야 하며 소문자, 숫자, 대시만 허용합니다.

    ^[a-z0-9\\-]{4,15}$
    

의도하지 않은 결과 방지#

의도하지 않은 결과를 방지하기 위해 이러한 규칙을 사용합니다.

파일 유효성 검사#

커밋에 포함된 파일을 유효성 검사하기 위해 이러한 규칙을 사용합니다.

  • Prevent pushing secret files: 파일에 비밀 정보가 포함되어 있으면 안 됩니다.
  • Prohibited filenames: 저장소에 존재하지 않는 파일이 정규 표현식과 일치하지 않아야 합니다. 모든 파일명을 허용하려면 비워 두세요. 일반적인 예시를 참조하세요.
  • Maximum file size: 추가되거나 업데이트된 파일이 이 파일 크기(MB)를 초과하지 않아야 합니다. 모든 크기의 파일을 허용하려면 0으로 설정합니다. Git LFS로 추적된 파일은 제외됩니다.

저장소에 비밀 정보 푸시 방지#

자격 증명 파일과 SSH 개인 키와 같은 비밀 정보를 버전 관리 시스템에 커밋하지 마세요. GitLab에서는 미리 정의된 파일명 패턴 목록을 사용하여 일치하는 파일이 저장소에 푸시되는 것을 방지할 수 있습니다. 일치하는 파일이 포함된 머지 리퀘스트가 차단됩니다. 이 푸시 규칙은 이미 저장소에 커밋된 파일을 제한하지 않습니다. 프로젝트별 전역 푸시 규칙 재정의에 설명된 프로세스를 사용하여 규칙을 사용하도록 기존 프로젝트의 구성을 업데이트해야 합니다.

이 규칙에 의해 차단된 파일은 아래에 나열되어 있습니다. 기준의 전체 목록은 files_denylist.yml을 참조하세요.

  • AWS CLI 자격 증명 blob:
    • .aws/credentials
    • aws/credentials
    • homefolder/aws/credentials
  • 개인 RSA SSH 키:
    • /ssh/id_rsa
    • /.ssh/personal_rsa
    • /config/server_rsa
    • id_rsa
    • .id_rsa
  • 개인 DSA SSH 키:
    • /ssh/id_dsa
    • /.ssh/personal_dsa
    • /config/server_dsa
    • id_dsa
    • .id_dsa
  • 개인 ED25519 SSH 키:
    • /ssh/id_ed25519
    • /.ssh/personal_ed25519
    • /config/server_ed25519
    • id_ed25519
    • .id_ed25519
  • 개인 ECDSA SSH 키:
    • /ssh/id_ecdsa
    • /.ssh/personal_ecdsa
    • /config/server_ecdsa
    • id_ecdsa
    • .id_ecdsa
  • 개인 ECDSA_SK SSH 키:
    • /ssh/id_ecdsa_sk
    • /.ssh/personal_ecdsa_sk
    • /config/server_ecdsa_sk
    • id_ecdsa_sk
    • .id_ecdsa_sk
  • 개인 ED25519_SK SSH 키:
    • /ssh/id_ed25519_sk
    • /.ssh/personal_ed25519_sk
    • /config/server_ed25519_sk
    • id_ed25519_sk
    • .id_ed25519_sk
  • 다음 접미사로 끝나는 모든 파일:
    • *.pem
    • *.key
    • *.history
    • *_history

이름으로 파일 금지#

Git에서 파일명에는 파일 이름과 이름 앞의 모든 디렉토리가 포함됩니다. git push할 때 푸시의 각 파일명이 Prohibited filenames의 정규 표현식과 비교됩니다.

Note

이 기능은 긍정적 또는 부정적 lookahead를 지원하지 않는 RE2 구문을 사용합니다.

정규 표현식은:

  • 저장소의 어느 위치에 있든 파일 이름과 일치할 수 있습니다.
  • 특정 위치의 파일 이름과 일치할 수 있습니다.
  • 파일 이름의 일부와 일치할 수 있습니다.
  • 확장자별로 특정 파일 유형을 제외할 수 있습니다.
  • 여러 표현식을 결합하여 여러 패턴을 제외할 수 있습니다.

정규 표현식 예시#

이 예시들은 일반적인 정규 표현식 문자열 경계 패턴을 사용합니다:

  • ^: 문자열의 시작과 일치합니다.
  • $: 문자열의 끝과 일치합니다.
  • \.: 리터럴 마침표 문자와 일치합니다. 백슬래시가 마침표를 이스케이프합니다.
  • \/: 리터럴 슬래시와 일치합니다. 백슬래시가 슬래시를 이스케이프합니다.

특정 파일 유형 방지#

  • 저장소의 어느 위치에서든 .exe 파일 푸시를 방지하려면:

    \.exe$
    

특정 파일 방지#

  • 특정 구성 파일 푸시를 방지하려면:

    • 저장소 루트에서:

      ^config\.yml$
      
    • 특정 디렉토리에서:

      ^directory-name\/config\.yml$
      
  • 모든 위치에서 - 이 예시는 install.exe라는 파일 푸시를 방지합니다:

    (^|\/)install\.exe$
    

패턴 결합#

여러 패턴을 하나의 표현식으로 결합할 수 있습니다. 이 예시는 이전 표현식을 모두 결합합니다:

(\.exe|^config\.yml|^directory-name\/config\.yml|(^|\/)install\.exe)$

서명된 커밋 요구#

서명된 커밋은 Git 커밋의 신뢰성과 무결성을 확인하는 데 사용되는 디지털 서명입니다. Reject unsigned commits 푸시 규칙을 사용하여 외부 기여자에게 서명된 커밋을 적용하면서 GitLab이 만든 커밋은 서명되지 않아도 되도록 허용합니다.

Reject unsigned commits 푸시 규칙을 활성화하면:

  • GitLab 외부에서 (git push로) 푸시된 커밋에는 유효한 암호화 서명이 포함되어야 합니다. 서명되지 않은 커밋은 거부됩니다.
  • GitLab UI 또는 API를 통해 만들어진 커밋은 서명 없이도 허용됩니다. 이러한 커밋은 Web IDE, 머지 리퀘스트 작업, API 작업에서 올 수 있습니다.
Warning

GitLab에서 만든 커밋은 이 규칙에서 제외되므로 규칙이 활성화된 경우에도 서명되지 않은 커밋이 커밋 기록에 나타날 수 있습니다. 이 규칙은 외부 Git 클라이언트에서 푸시된 커밋만 유효성을 검사합니다.

자세한 내용은 이슈 5361을 참조하세요.

서명은 지원되는 서명 방법으로 만들어야 합니다:

  • GPG
  • SSH
  • X.509

유효하지 않거나 손상된 서명이 있는 커밋은 거부됩니다.

규칙 활성화#

Reject unsigned commits 푸시 규칙을 활성화하려면:

  1. 상단 바에서 Search or go to를 선택하고 프로젝트를 찾습니다.
  2. Settings > Repository를 선택합니다.
  3. Push rules를 확장합니다.
  4. Reject unsigned commits를 선택합니다.
  5. Save push rules를 선택합니다.

서명되지 않은 커밋 거부 및 Web IDE#

프로젝트에 Reject unsigned commits 푸시 규칙이 있으면 기본적으로 사용자가 GitLab Web IDE를 통해 커밋을 만들 수 없습니다.

이 푸시 규칙이 있는 프로젝트에서 Web IDE를 통한 커밋을 허용하려면 GitLab 관리자가 기능 플래그 reject_unsigned_commits_by_gitlab을 비활성화해야 합니다:

Feature.disable(:reject_unsigned_commits_by_gitlab)

이 기능 플래그가 비활성화되면 Web IDE에서 만든 커밋은 서명 없이도 허용됩니다. 자세한 내용은 기능 활성화 또는 비활성화를 참조하세요.

DCO 인증되지 않은 커밋 거부#

Developer Certificate of Origin(DCO)으로 서명된 커밋은 기여자가 해당 커밋에서 기여한 코드를 작성했거나 제출할 권리가 있음을 인증합니다. 프로젝트에 대한 모든 커밋이 DCO를 준수하도록 요구할 수 있습니다. 이 푸시 규칙은 모든 커밋 메시지에 Signed-off-by: 트레일러를 요구하며 이것이 없는 커밋을 거부합니다.

관련 주제#

트러블슈팅#

모든 프로젝트에 대한 푸시 규칙 일괄 업데이트#

모든 프로젝트의 푸시 규칙을 동일하게 업데이트하려면 Rails 콘솔을 사용하거나 푸시 규칙 API 엔드포인트를 사용하여 각 프로젝트를 업데이트하는 스크립트를 작성합니다.

예를 들어, Check whether the commit author is a GitLab userDo not allow users to remove Git tags with git push 체크박스를 활성화하고 Rails 콘솔을 통해 특정 이메일 도메인에서만 커밋을 허용하는 필터를 만들려면:

Warning

데이터를 변경하는 명령은 올바르게 또는 올바른 조건에서 실행되지 않으면 손상을 일으킬 수 있습니다. 항상 먼저 테스트 환경에서 명령을 실행하고 복원할 백업 인스턴스를 준비해 두세요.

Project.find_each do |p|
  pr = p.push_rule || PushRule.new(project: p)
  # Check whether the commit author is a GitLab user
  pr.member_check = true
  # Do not allow users to remove Git tags with `git push`
  pr.deny_delete_tag = true
  # Commit author's email
  pr.author_email_regex = '@domain\.com$'
  pr.save!
end

푸시 규칙

Tier: Premium, Ultimate
Offering: GitLab.com, GitLab Self-Managed, GitLab Dedicated
원문 보기
요약

푸시 규칙은 사용자 친화적인 인터페이스에서 활성화할 수 있는 pre-receive Git 훅입니다. GitLab은 푸시 규칙의 정규 표현식에 RE2 구문을 사용합니다. 사용자 정의 푸시 규칙을 위해서는 서버 훅을 사용합니다.

히스토리
  • 푸시 규칙의 최대 정규 표현식 길이가 GitLab 16.3에서 255자에서 511자로 변경됨.

푸시 규칙은 사용자 친화적인 인터페이스에서 활성화할 수 있는 pre-receive Git 훅입니다. 푸시 규칙을 통해 저장소에 푸시될 수 있는 것과 없는 것을 더 잘 제어할 수 있습니다. GitLab이 보호된 브랜치를 제공하지만 다음과 같이 더 구체적인 규칙이 필요할 수 있습니다:

  • 커밋 내용 평가.
  • 커밋 메시지가 예상 형식과 일치하는지 확인.
  • 브랜치 이름 규칙 적용.
  • 파일 세부 정보 평가.
  • Git 태그 제거 방지.
  • 서명된 커밋 요구.

GitLab은 푸시 규칙의 정규 표현식에 RE2 구문을 사용합니다. regex101 정규 표현식 테스터에서 테스트할 수 있습니다. 각 정규 표현식은 511자로 제한됩니다.

사용자 정의 푸시 규칙을 위해서는 서버 훅을 사용합니다.

Note

푸시 규칙은 포크 동기화 중에 우회됩니다. 업스트림 프로젝트에서 포크를 업데이트할 때 변경 사항은 포크의 푸시 규칙에 대한 유효성 검사 없이 직접 적용됩니다.

푸시 규칙은 상속된 설정이 아닌 템플릿으로 작동합니다:

  • 전역 푸시 규칙은 새 프로젝트의 템플릿 역할을 합니다. 전역 푸시 규칙을 만들면 해당 시점 이후에 만들어진 모든 프로젝트에 복사됩니다.
  • 프로젝트 푸시 규칙은 독립적인 복사본입니다. 프로젝트가 만들어진 후 전역 또는 그룹 규칙을 변경해도 프로젝트의 푸시 규칙이 자동으로 업데이트되지 않습니다.
  • 프로젝트에서 푸시 규칙을 삭제하면 해당 프로젝트에서 모든 푸시 규칙 제어가 제거됩니다. 프로젝트는 전역 또는 그룹 규칙을 사용하도록 되돌아가지 않습니다.

업데이트된 전역 푸시 규칙을 기존 프로젝트에 적용하려면 각 프로젝트에 대해 개별적으로 전역 푸시 규칙을 재정의해야 합니다.

Note

프로젝트에서 푸시 규칙을 삭제하면 해당 프로젝트에는 푸시 규칙이 전혀 없습니다. 프로젝트는 그룹이나 인스턴스의 규칙을 자동으로 상속하지 않습니다. 푸시 규칙을 복원하려면 프로젝트에 대해 다시 구성해야 합니다.

전역 푸시 규칙 활성화#

모든 새 프로젝트의 템플릿 역할을 하는 푸시 규칙을 만들 수 있습니다. 개별 프로젝트 또는 그룹에서 이러한 규칙을 재정의할 수 있습니다.

전역 푸시 규칙을 구성할 때:

  • 전역 푸시 규칙을 구성한 후에 만들어진 모든 프로젝트는 이 구성의 복사본을 상속합니다.
  • 기존 프로젝트는 영향을 받지 않습니다. 이러한 프로젝트를 수동으로 업데이트하려면 프로젝트별 전역 푸시 규칙 재정의를 참조하세요.
  • 전역 푸시 규칙 변경은 이미 푸시 규칙이 구성된 프로젝트를 업데이트하지 않습니다.

전제 조건:

  • 관리자여야 합니다.

전역 푸시 규칙을 만들려면:

  1. 오른쪽 상단에서 Admin을 선택합니다.
  2. Push rules를 선택합니다.
  3. Push rules를 확장합니다.
  4. 원하는 규칙을 설정합니다.
  5. Save push rules를 선택합니다.

그룹 푸시 규칙#

그룹 푸시 규칙을 통해 그룹 관리자는 특정 그룹에서 새로 만들어진 프로젝트에 대한 푸시 규칙을 설정할 수 있습니다.

그룹의 푸시 규칙을 구성하려면:

  1. 상단 바에서 Search or go to를 선택하고 그룹을 찾습니다.
  2. Settings > Repository를 선택합니다.
  3. Pre-defined push rules 섹션을 확장합니다.
  4. 원하는 설정을 선택합니다.
  5. Save push rules를 선택합니다.

새 프로젝트는 다음에서 푸시 규칙을 상속합니다:

  • 푸시 규칙이 정의된 가장 가까운 상위 그룹.
  • 상위 그룹에 푸시 규칙이 정의되어 있지 않으면 전체 인스턴스에 설정된 푸시 규칙.

프로젝트만 푸시 규칙을 상속합니다. 하위 그룹은 상위 그룹에서 푸시 규칙을 상속하지 않습니다. 새 프로젝트에 어떤 푸시 규칙이 적용되는지 확인하려면 하위 그룹에서 프로젝트를 만들고 프로젝트의 푸시 규칙을 확인합니다.

프로젝트별 전역 푸시 규칙 재정의#

프로젝트 푸시 규칙은 전역 푸시 규칙과 독립적입니다. 프로젝트의 푸시 규칙을 설정하면 해당 규칙이 해당 프로젝트에 대해 이전에 구성된 모든 규칙을 대체합니다.

프로젝트의 푸시 규칙을 설정하려면:

  1. 상단 바에서 Search or go to를 선택하고 프로젝트를 찾습니다.
  2. Settings > Repository를 선택합니다.
  3. Push rules를 확장합니다.
  4. 원하는 규칙을 설정합니다.
  5. Save push rules를 선택합니다.

프로젝트가 새 전역 푸시 규칙과 일치하려면 전역 설정과 일치하도록 프로젝트의 푸시 규칙을 구성해야 합니다. 프로젝트는 전역 푸시 규칙 변경을 자동으로 상속하지 않습니다.

사용자 확인#

커밋하는 사용자를 유효성 검사하는 데 이러한 규칙을 사용합니다.

Note

이러한 푸시 규칙은 커밋에만 적용되며 태그에는 적용되지 않습니다.

  • Reject unverified users: 커미터 이메일이 사용자의 확인된 이메일 주소 또는 비공개 커밋 이메일 주소 중 하나와 일치해야 합니다.

  • Reject inconsistent user name: 커밋 작성자 이름이 작성자 및 커미터 이메일이 동일한 커밋에 대해 사용자의 GitLab 계정 이름과 일치해야 합니다. 이 이메일이 다를 때 확인이 건너뛰어지며, 이는 다른 기여자의 커밋을 cherry-pick하거나 리베이스하는 것과 같은 워크플로우에서 발생합니다.

    이 규칙은 사용자의 Git 설정 잘못된 구성을 탐지하여 커밋 위생을 유지하는 데 도움이 되지만 사칭을 방지하지는 않습니다. 암호화 ID 확인을 위해서는 대신 Reject unsigned commits를 사용합니다.

  • Check whether the commit author is a GitLab user: 커밋 작성자와 커미터 이메일 주소 모두 GitLab 사용자의 확인된 이메일 주소와 일치해야 합니다.

  • Commit author's email: 작성자와 커미터 이메일 주소 모두 정규 표현식과 일치해야 합니다. 어떤 이메일 주소도 허용하려면 비워 두세요.

프로젝트용 봇 사용자 또는 그룹용 봇 사용자를 사용할 때 봇 토큰이 커밋하고 변경 사항을 푸시할 수 있도록 생성된 이메일 접미사를 추가해야 합니다.

커밋 메시지 유효성 검사#

커밋 메시지에 다음 규칙을 사용합니다:

  • Require expression in commit messages: 메시지가 표현식과 일치해야 합니다. 어떤 커밋 메시지도 허용하려면 비워 두세요. 멀티라인 모드를 사용하며 (?-m)을 사용하여 비활성화할 수 있습니다. 일부 유효성 검사 예시:

    • JIRA\-\d+은 모든 커밋이 Refactored css. Fixes JIRA-123처럼 Jira 이슈를 참조하도록 요구합니다.
    • [[:^punct:]]\b$은 마지막 문자가 구두점이면 커밋을 거부합니다. 단어 경계 문자(\b)는 Git이 커밋 메시지 끝에 줄바꿈 문자(\n)를 추가하기 때문에 거짓 음성을 방지합니다.

    GitLab UI에서 만든 커밋 메시지는 줄바꿈 문자로 \r\n을 설정합니다. 정규 표현식에서 \n 대신 (\r\n?|\n)을 사용하여 올바르게 일치시킵니다.

    예를 들어 다음 다중 줄 커밋 설명이 있는 경우:

    JIRA:
    Description
    

    이 정규 표현식으로 유효성을 검사할 수 있습니다: JIRA:(\r\n?|\n)\w+.

  • Reject expression in commit messages: 커밋 메시지가 표현식과 일치하지 않아야 합니다. 어떤 커밋 메시지도 허용하려면 비워 두세요. 멀티라인 모드를 사용하며 (?-m)을 사용하여 비활성화할 수 있습니다.

브랜치 이름 유효성 검사#

브랜치 이름을 유효성 검사하려면 Branch name에 정규 표현식을 입력합니다. 어떤 브랜치 이름도 허용하려면 비워 두세요. 기본 브랜치는 항상 허용됩니다. 특정 형식의 브랜치 이름은 보안 목적으로 기본적으로 제한됩니다. Git 커밋 해시와 유사한 40자 16진수 문자로 된 이름은 금지됩니다.

일부 유효성 검사 예시:

  • 브랜치는 JIRA-로 시작해야 합니다.

    ^JIRA-
    
  • 브랜치는 -JIRA로 끝나야 합니다.

    -JIRA$
    
  • 브랜치는 4에서 15자 사이여야 하며 소문자, 숫자, 대시만 허용합니다.

    ^[a-z0-9\\-]{4,15}$
    

의도하지 않은 결과 방지#

의도하지 않은 결과를 방지하기 위해 이러한 규칙을 사용합니다.

파일 유효성 검사#

커밋에 포함된 파일을 유효성 검사하기 위해 이러한 규칙을 사용합니다.

  • Prevent pushing secret files: 파일에 비밀 정보가 포함되어 있으면 안 됩니다.
  • Prohibited filenames: 저장소에 존재하지 않는 파일이 정규 표현식과 일치하지 않아야 합니다. 모든 파일명을 허용하려면 비워 두세요. 일반적인 예시를 참조하세요.
  • Maximum file size: 추가되거나 업데이트된 파일이 이 파일 크기(MB)를 초과하지 않아야 합니다. 모든 크기의 파일을 허용하려면 0으로 설정합니다. Git LFS로 추적된 파일은 제외됩니다.

저장소에 비밀 정보 푸시 방지#

자격 증명 파일과 SSH 개인 키와 같은 비밀 정보를 버전 관리 시스템에 커밋하지 마세요. GitLab에서는 미리 정의된 파일명 패턴 목록을 사용하여 일치하는 파일이 저장소에 푸시되는 것을 방지할 수 있습니다. 일치하는 파일이 포함된 머지 리퀘스트가 차단됩니다. 이 푸시 규칙은 이미 저장소에 커밋된 파일을 제한하지 않습니다. 프로젝트별 전역 푸시 규칙 재정의에 설명된 프로세스를 사용하여 규칙을 사용하도록 기존 프로젝트의 구성을 업데이트해야 합니다.

이 규칙에 의해 차단된 파일은 아래에 나열되어 있습니다. 기준의 전체 목록은 files_denylist.yml을 참조하세요.

  • AWS CLI 자격 증명 blob:
    • .aws/credentials
    • aws/credentials
    • homefolder/aws/credentials
  • 개인 RSA SSH 키:
    • /ssh/id_rsa
    • /.ssh/personal_rsa
    • /config/server_rsa
    • id_rsa
    • .id_rsa
  • 개인 DSA SSH 키:
    • /ssh/id_dsa
    • /.ssh/personal_dsa
    • /config/server_dsa
    • id_dsa
    • .id_dsa
  • 개인 ED25519 SSH 키:
    • /ssh/id_ed25519
    • /.ssh/personal_ed25519
    • /config/server_ed25519
    • id_ed25519
    • .id_ed25519
  • 개인 ECDSA SSH 키:
    • /ssh/id_ecdsa
    • /.ssh/personal_ecdsa
    • /config/server_ecdsa
    • id_ecdsa
    • .id_ecdsa
  • 개인 ECDSA_SK SSH 키:
    • /ssh/id_ecdsa_sk
    • /.ssh/personal_ecdsa_sk
    • /config/server_ecdsa_sk
    • id_ecdsa_sk
    • .id_ecdsa_sk
  • 개인 ED25519_SK SSH 키:
    • /ssh/id_ed25519_sk
    • /.ssh/personal_ed25519_sk
    • /config/server_ed25519_sk
    • id_ed25519_sk
    • .id_ed25519_sk
  • 다음 접미사로 끝나는 모든 파일:
    • *.pem
    • *.key
    • *.history
    • *_history

이름으로 파일 금지#

Git에서 파일명에는 파일 이름과 이름 앞의 모든 디렉토리가 포함됩니다. git push할 때 푸시의 각 파일명이 Prohibited filenames의 정규 표현식과 비교됩니다.

Note

이 기능은 긍정적 또는 부정적 lookahead를 지원하지 않는 RE2 구문을 사용합니다.

정규 표현식은:

  • 저장소의 어느 위치에 있든 파일 이름과 일치할 수 있습니다.
  • 특정 위치의 파일 이름과 일치할 수 있습니다.
  • 파일 이름의 일부와 일치할 수 있습니다.
  • 확장자별로 특정 파일 유형을 제외할 수 있습니다.
  • 여러 표현식을 결합하여 여러 패턴을 제외할 수 있습니다.

정규 표현식 예시#

이 예시들은 일반적인 정규 표현식 문자열 경계 패턴을 사용합니다:

  • ^: 문자열의 시작과 일치합니다.
  • $: 문자열의 끝과 일치합니다.
  • \.: 리터럴 마침표 문자와 일치합니다. 백슬래시가 마침표를 이스케이프합니다.
  • \/: 리터럴 슬래시와 일치합니다. 백슬래시가 슬래시를 이스케이프합니다.

특정 파일 유형 방지#

  • 저장소의 어느 위치에서든 .exe 파일 푸시를 방지하려면:

    \.exe$
    

특정 파일 방지#

  • 특정 구성 파일 푸시를 방지하려면:

    • 저장소 루트에서:

      ^config\.yml$
      
    • 특정 디렉토리에서:

      ^directory-name\/config\.yml$
      
  • 모든 위치에서 - 이 예시는 install.exe라는 파일 푸시를 방지합니다:

    (^|\/)install\.exe$
    

패턴 결합#

여러 패턴을 하나의 표현식으로 결합할 수 있습니다. 이 예시는 이전 표현식을 모두 결합합니다:

(\.exe|^config\.yml|^directory-name\/config\.yml|(^|\/)install\.exe)$

서명된 커밋 요구#

서명된 커밋은 Git 커밋의 신뢰성과 무결성을 확인하는 데 사용되는 디지털 서명입니다. Reject unsigned commits 푸시 규칙을 사용하여 외부 기여자에게 서명된 커밋을 적용하면서 GitLab이 만든 커밋은 서명되지 않아도 되도록 허용합니다.

Reject unsigned commits 푸시 규칙을 활성화하면:

  • GitLab 외부에서 (git push로) 푸시된 커밋에는 유효한 암호화 서명이 포함되어야 합니다. 서명되지 않은 커밋은 거부됩니다.
  • GitLab UI 또는 API를 통해 만들어진 커밋은 서명 없이도 허용됩니다. 이러한 커밋은 Web IDE, 머지 리퀘스트 작업, API 작업에서 올 수 있습니다.
Warning

GitLab에서 만든 커밋은 이 규칙에서 제외되므로 규칙이 활성화된 경우에도 서명되지 않은 커밋이 커밋 기록에 나타날 수 있습니다. 이 규칙은 외부 Git 클라이언트에서 푸시된 커밋만 유효성을 검사합니다.

자세한 내용은 이슈 5361을 참조하세요.

서명은 지원되는 서명 방법으로 만들어야 합니다:

  • GPG
  • SSH
  • X.509

유효하지 않거나 손상된 서명이 있는 커밋은 거부됩니다.

규칙 활성화#

Reject unsigned commits 푸시 규칙을 활성화하려면:

  1. 상단 바에서 Search or go to를 선택하고 프로젝트를 찾습니다.
  2. Settings > Repository를 선택합니다.
  3. Push rules를 확장합니다.
  4. Reject unsigned commits를 선택합니다.
  5. Save push rules를 선택합니다.

서명되지 않은 커밋 거부 및 Web IDE#

프로젝트에 Reject unsigned commits 푸시 규칙이 있으면 기본적으로 사용자가 GitLab Web IDE를 통해 커밋을 만들 수 없습니다.

이 푸시 규칙이 있는 프로젝트에서 Web IDE를 통한 커밋을 허용하려면 GitLab 관리자가 기능 플래그 reject_unsigned_commits_by_gitlab을 비활성화해야 합니다:

Feature.disable(:reject_unsigned_commits_by_gitlab)

이 기능 플래그가 비활성화되면 Web IDE에서 만든 커밋은 서명 없이도 허용됩니다. 자세한 내용은 기능 활성화 또는 비활성화를 참조하세요.

DCO 인증되지 않은 커밋 거부#

Developer Certificate of Origin(DCO)으로 서명된 커밋은 기여자가 해당 커밋에서 기여한 코드를 작성했거나 제출할 권리가 있음을 인증합니다. 프로젝트에 대한 모든 커밋이 DCO를 준수하도록 요구할 수 있습니다. 이 푸시 규칙은 모든 커밋 메시지에 Signed-off-by: 트레일러를 요구하며 이것이 없는 커밋을 거부합니다.

관련 주제#

트러블슈팅#

모든 프로젝트에 대한 푸시 규칙 일괄 업데이트#

모든 프로젝트의 푸시 규칙을 동일하게 업데이트하려면 Rails 콘솔을 사용하거나 푸시 규칙 API 엔드포인트를 사용하여 각 프로젝트를 업데이트하는 스크립트를 작성합니다.

예를 들어, Check whether the commit author is a GitLab userDo not allow users to remove Git tags with git push 체크박스를 활성화하고 Rails 콘솔을 통해 특정 이메일 도메인에서만 커밋을 허용하는 필터를 만들려면:

Warning

데이터를 변경하는 명령은 올바르게 또는 올바른 조건에서 실행되지 않으면 손상을 일으킬 수 있습니다. 항상 먼저 테스트 환경에서 명령을 실행하고 복원할 백업 인스턴스를 준비해 두세요.

Project.find_each do |p|
  pr = p.push_rule || PushRule.new(project: p)
  # Check whether the commit author is a GitLab user
  pr.member_check = true
  # Do not allow users to remove Git tags with `git push`
  pr.deny_delete_tag = true
  # Commit author's email
  pr.author_email_regex = '@domain\.com$'
  pr.save!
end