저장소 일관성 검사

Gitaly에서는 저장소 일관성 검사를 실행합니다.

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

이러한 일관성 검사는 저장소에 필요한 모든 객체가 있는지와 이러한 객체가 유효한 객체인지 검증합니다. 이러한 검사는 다음과 같이 분류할 수 있습니다.

  • 저장소가 손상되지 않도록 보장하는 기본 검사입니다. 이에는 연결성 검사 및 객체의 구문 분석이 가능한지 확인하는 검사가 포함됩니다.
  • Git에서 이전 보안 관련 버그를 악용할 수 있는 객체를 인식하는 보안 검사입니다.
  • 모든 객체 메타데이터가 유효한지 검증하는 코스메틱 검사입니다. 이전 Git 버전 및 다른 Git 구현은 잘못된 메타데이터로 객체를 생성할 수 있지만, 최신 버전은 이러한 형태로 생성된 객체를 해석할 수 있습니다.

일관성 검사를 통과하지 못한 잘못된 객체를 제거하려면 일반적으로 저장소의 이력을 다시 작성해야 합니다. 따라서 Gitaly는 기본적으로 저장소 일관성에 부정적인 영향을 미치지 않는 다양한 코스메틱 문제에 대해 일관성 검사를 비활성화합니다.

기본적으로 Gitaly는 기본 또는 보안 관련 검사를 비활성화하지 않으므로 Git 클라이언트에서 알려진 취약점을 유발할 수 있는 객체를 배포하지 않습니다. 이는 프로젝트에 악의가 없더라도 해당 객체를 포함하는 저장소를 가져올 수 있는 능력을 제한합니다.

저장소 일관성 검사 재정의

인스턴스 관리자는 일관성 검사를 통과하지 못하는 저장소를 처리해야 하는 경우 일관성 검사를 재정의할 수 있습니다.

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는 기본적으로 packfile을 받아들이고 fsck를 실행하기 때문에 이러한 커밋을 포함하는 푸시는 거부될 것입니다.

missingSpaceBeforeDate

missingSpaceBeforeDate 체크는 git-fsck(1)가 서명에 메일과 날짜 사이에 공백이 없거나 날짜가 완전히 없는 경우에 실패하기 때문에 비활성화되었습니다. Git 클라이언트의 잘못된 동작을 포함하여 여러 문제로 인해 발생할 수 있습니다.

zeroPaddedFilemode

zeroPaddedFilemode 체크는 예전 Git 버전에서 일부 파일 모드를 0으로 채워 넣은 것으로 비활성화되었습니다. 예를 들어, 파일 모드가 40000이 아닌 경우 트리 개체는 파일 모드를 040000으로 인코딩했습니다.