리포지터리 일관성 검사

Gitaly는 리포지터리 일관성 검사를 실행합니다.

  • 리포지터리 검사를 트리거할 때
  • 미러링된 리포지터리에서 변경 사항을 가져올 때
  • 사용자가 변경 사항을 푸시할 때

이러한 일관성 검사는 리포지터리에 필요한 모든 객체가 있는지와 해당 객체가 유효한 객체인지를 확인합니다. 이들은 다음과 같이 분류될 수 있습니다:

  • 리포지터리가 손상되지 않도록 하는 기본 검사. 이에는 연결성 검사와 객체를 구문 분석할 수 있는지 확인하는 검사가 포함됩니다.
  • Git과 관련된 이전 보안 버그를 악용할 수 있는 객체를 인식하는 보안 검사
  • 모든 객체 메타데이터가 유효한지를 확인하는 미용적 검사. 오래된 Git 버전 및 기타 Git 구현은 유효하지 않은 메타데이터로 객체를 생성했을 수 있지만, 더 최신 버전에서는 이러한 산출물을 해석할 수 있습니다.

일관성 검사에 실패한 잘못된 객체를 제거하면 종종 리포지터리의 이력을 다시 작성해야 합니다. 따라서, Gitaly는 기본적으로 미용적 문제를 가진 검사를 비활성화합니다.

기본적으로 Gitaly는 기본 또는 보안 관련 검사를 비활성화하지 않아 알려진 취약점을 트리거할 수 있는 객체를 배포하지 않습니다. 이는 프로젝트가 악의적인 의도가 없더라도 해당 객체를 포함한 리포지터리를 가져오는 능력을 제한합니다.

리포지터리 일관성 검사 재정의

인스턴스 관리자는 일관성 검사를 재정의할 수 있습니다. 이는 일관성 검사를 통과하지 못하는 리포지터리를 처리해야 하는 경우에 필요합니다.

Linux 패키지 설치의 경우, /etc/gitlab/gitlab.rb를 수정하고 다음 키를 설정합니다 (이 예에서는 hasDotgit 일관성 검사를 비활성화하는 방법을 보여줍니다):

  • GitLab 15.10 이상:

    ignored_blobs = "/etc/gitlab/instance_wide_ignored_git_blobs.txt"
      
    gitaly['configuration'] = {
      # ...
      git: {
        # ...
        config: [
          # 한 줄에 하나의 약어가 포함되지 않은 SHA-1로 파일을 채웁니다.
          # https://git-scm.com/docs/git-config#Documentation/git-config.txt-fsckskipList 참조
          { key: "fsck.skipList", value: ignored_blobs },
          { key: "fetch.fsck.skipList", value: ignored_blobs },
          { key: "receive.fsck.skipList", value: ignored_blobs },
            
          { key: "fsck.hasDotgit", value: "ignore" },
          { key: "fetch.fsck.hasDotgit", value: "ignore" },
          { key: "receive.fsck.hasDotgit", value: "ignore" },
          { key: "fsck.missingSpaceBeforeEmail", value: "ignore" },
        ],
      },
    }
    
  • GitLab 15.3에서 GitLab 15.9까지:

    ignored_blobs = "/etc/gitlab/instance_wide_ignored_git_blobs.txt"
      
    gitaly['gitconfig'] = [
       
     # 한 줄에 하나의 약어가 포함되지 않은 SHA-1로 파일을 채웁니다.
     # https://git-scm.com/docs/git-config#Documentation/git-config.txt-fsckskipList 참조
     { key: "fsck.skipList", value: ignored_blobs },
     { key: "fetch.fsck.skipList", value: ignored_blobs },
     { key: "receive.fsck.skipList", value: ignored_blobs },
       
     { key: "fsck.hasDotgit", value: "ignore" },
     { key: "fetch.fsck.hasDotgit", value: "ignore" },
     { key: "receive.fsck.hasDotgit", value: "ignore" },
     { key: "fsck.missingSpaceBeforeEmail", value: "ignore" },
    ]
    
  • GitLab 15.2 및 이전 (레거시 방법):

    ignored_git_errors = [
      "hasDotgit = ignore",
      "missingSpaceBeforeEmail = ignore",
    ]
    omnibus_gitconfig['system'] = {
       
     # 한 줄에 하나의 약어가 포함되지 않은 SHA-1로 파일을 채웁니다.
     # https://git-scm.com/docs/git-config#Documentation/git-config.txt-fsckskipList 참조
      "fsck.skipList" => ignored_blobs
      "fetch.fsck.skipList" => ignored_blobs,
      "receive.fsck.skipList" => ignored_blobs,
        
      "fsck" => ignored_git_errors,
      "fetch.fsck" => ignored_git_errors,
      "receive.fsck" => ignored_git_errors,
    }
    

셀프 컴파일된 설치의 경우, 동등한 작업을 수행하기 위해 Gitaly 구성 (gitaly.toml)을 수정합니다:

[[git.config]]
key = "fsck.hasDotgit"
value = "ignore"

[[git.config]]
key = "fetch.fsck.hasDotgit"
value = "ignore"

[[git.config]]
key = "receive.fsck.hasDotgit"
value = "ignore"

[[git.config]]
key = "fsck.missingSpaceBeforeEmail"
value = "ignore"

[[git.config]]
key = "fetch.fsck.missingSpaceBeforeEmail"
value = "ignore"

[[git.config]]
key = "receive.fsck.missingSpaceBeforeEmail"
value = "ignore"

[[git.config]]
key = "fsck.skipList"
value = "/etc/gitlab/instance_wide_ignored_git_blobs.txt"

[[git.config]]
key = "fetch.fsck.skipList"
value = "/etc/gitlab/instance_wide_ignored_git_blobs.txt"

[[git.config]]
key = "receive.fsck.skipList"
value = "/etc/gitlab/instance_wide_ignored_git_blobs.txt"

비활성화된 검사

Gitaly가 동작에 영향을 미치지 않는 특정한 잘못된 특성을 가진 리포지터리와 여전히 작동할 수 있게 하기 위해 Gitaly는 기본적으로 일부 미용적 검사를 비활성화합니다.

일관성 검사의 전체 디렉터리은 Git 문서를 참조하세요.

badTimezone

badTimezone 검사는 Git에서 사용자가 잘못된 타임존으로 커밋을 만들도록 하는 버그가 있었기 때문에 비활성화되었습니다. 결과적으로 일부 Git 로그에는 명세와 일치하지 않는 커밋이 포함되어 있습니다. 따라서, Gitaly는 기본적으로 수신한 packfiles에 대해 fsck를 실행하므로 해당 커밋을 포함하는 푸시는 거부될 것입니다.

missingSpaceBeforeDate

missingSpaceBeforeDate 검사는 서명에 메일과 날짜 사이에 공백이 없거나 날짜가 완전히 빠져있을 때 git-fsck(1)가 실패하기 때문에 비활성화되었습니다. 이는 다양한 문제로 인해 발생할 수 있습니다.

zeroPaddedFilemode

zeroPaddedFilemode 검사는 이전 Git 버전에서 일부 파일 모드를 제로(0)로 패딩했었기 때문에 비활성화되었습니다. 예를 들어, 40000 대신에 트리 객체가 파일 모드를 040000으로 인코딩했습니다.