리포지터리 일관성 검사
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: [
# 이전 커밋에서 잘못된 이메일 헤더 허용
# (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.missingSpaceBeforeEmail", value: "ignore" },
# 특정 일관성 검사 무시
# 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 클라이언트에 영향을 미치지 않는 특정 잘못된 형식의 특성을 가진 리포지터리에서도 작동할 수 있도록 Gitaly는 기본적으로 일부 외관 검사를 비활성화합니다.
일관성 검사의 전체 목록은 Git 설명서를 참조하세요.
badTimezone#
badTimezone 검사는 Git의 버그로 인해 사용자들이 유효하지 않은 시간대로 커밋을 만들게 되었기 때문에 비활성화됩니다. 결과적으로 일부 Git 로그에는 명세와 일치하지 않는 커밋이 포함되어 있습니다. Gitaly는 기본적으로 수신된 packfile에 대해 fsck를 실행하므로 이러한 커밋이 포함된 푸시는 거부됩니다.
missingSpaceBeforeDate#
missingSpaceBeforeDate 검사는 서명에 메일과 날짜 사이의 공백이 없거나 날짜가 완전히 누락된 경우 git-fsck(1)이 실패하기 때문에 비활성화됩니다. 이는 잘못 작동하는 Git 클라이언트 등 다양한 문제로 인해 발생할 수 있습니다.
zeroPaddedFilemode#
zeroPaddedFilemode 검사는 이전 Git 버전에서 일부 파일 모드를 앞에 0을 붙여 표시했기 때문에 비활성화됩니다. 예를 들어 40000의 파일 모드 대신 트리 객체가 파일 모드를 040000으로 인코딩했습니다.
