리포지터리 일관성 검사
GitLab v19.4요약
Gitaly는 다음 시점에 리포지터리 일관성 검사를 수행합니다. 이 일관성 검사는 리포지터리에 필요한 오브젝트가 모두 있는지, 그리고 그 오브젝트가 유효한지 확인합니다. 일관성 검사를 통과하지 못한 형식 오류 오브젝트를 제거하려면 리포지터리 히스토리를 다시 작성해야 하는데, 이는 대체로 불가능합니다.
Gitaly는 다음 시점에 리포지터리 일관성 검사를 수행합니다.
- 리포지터리 검사를 트리거할 때.
- 미러링된 리포지터리에서 변경 사항을 가져올 때.
- 사용자가 리포지터리에 변경 사항을 푸시할 때.
이 일관성 검사는 리포지터리에 필요한 오브젝트가 모두 있는지, 그리고 그 오브젝트가 유효한지 확인합니다. 검사는 다음과 같이 분류합니다.
- 리포지터리가 손상되지 않았음을 확인하는 기본 검사. 여기에는 연결성 검사와 오브젝트 파싱 가능 여부 검사가 포함됩니다.
- Git의 과거 보안 관련 버그를 악용할 수 있는 오브젝트를 식별하는 보안 검사.
- 모든 오브젝트 메타데이터가 유효한지 확인하는 형식 검사. 예전 Git 버전이나 다른 Git 구현은 메타데이터가 유효하지 않은 오브젝트를 만들었을 수 있으나, 최신 버전은 이러한 형식 오류 오브젝트를 해석할 수 있습니다.
일관성 검사를 통과하지 못한 형식 오류 오브젝트를 제거하려면 리포지터리 히스토리를 다시 작성해야 하는데, 이는 대체로 불가능합니다. 따라서 Gitaly는 리포지터리 일관성에 악영향을 주지 않는 여러 형식 관련 일관성 검사를 기본적으로 비활성화합니다.
Gitaly는 Git 클라이언트의 알려진 취약점을 유발할 수 있는 오브젝트가 배포되지 않도록 기본 검사와 보안 관련 검사는 기본적으로 비활성화하지 않습니다. 이 때문에 악의적인 의도가 없는 프로젝트라도 해당 오브젝트가 포함된 리포지터리는 가져오기가 제한됩니다.
리포지터리 일관성 검사 재정의#
일관성 검사를 통과하지 못하는 리포지터리를 처리해야 한다면 인스턴스 관리자는 일관성 검사를 재정의할 수 있습니다.
Linux 패키지 설치본에서는 /etc/gitlab/gitlab.rb를 편집하여 다음
키를 설정합니다. 아래 예시는 오래된 커밋의 잘못된 이메일 헤더를 허용하고
hasDotgit 및 gitmodulesUrl 일관성 검사를 비활성화합니다.
ignored_blobs = "/etc/gitlab/instance_wide_ignored_git_blobs.txt"
gitaly['configuration'] = {
# ...
git: {
# ...
config: [
# Allow bad email headers in old commits
# (Populate a file with one unabbreviated SHA-1 per line.
# See 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.missingSpaceBeforeEmail", value: "ignore" },
# Ignore specific consistency checks
# See https://git-scm.com/docs/git-fsck.html#_fsck_messages
{ key: "fsck.hasDotgit", value: "ignore" },
{ key: "fetch.fsck.hasDotgit", value: "ignore" },
{ key: "receive.fsck.hasDotgit", value: "ignore" },
{ key: "fsck.gitmodulesUrl", value: "ignore" },
{ key: "fetch.fsck.gitmodulesUrl", value: "ignore" },
],
},
}
직접 컴파일한 설치본에서는 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.gitmodulesUrl"
value = "ignore"
[[git.config]]
key = "fetch.fsck.gitmodulesUrl"
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 버전이 일부 파일 모드를 0으로 채워 표기했기 때문에 비활성화되어 있습니다.
예를 들어 트리 오브젝트가 파일 모드를 40000 이 아니라 040000으로 인코딩했습니다.