저장소 일관성 검사

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

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

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

  • 저장소가 손상되지 않도록 보장하는 기본적인 검사. 이에는 연결성 검사와 객체를 파싱할 수 있는지 확인하는 검사가 포함됩니다.
  • 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는 받은 packfiles에 대해 fsck를 실행하므로, 해당 커밋이 포함된 푸시는 거부됩니다.

missingSpaceBeforeDate

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

zeroPaddedFilemode

zeroPaddedFilemode 체크는 이전 Git 버전에서 일부 파일 모드를 영저로 채웠던 것으로 비활성화되었습니다. 예를 들어, 트리 객체는 파일 모드 40000 대신 040000으로 인코딩되었습니다.