Keep-around ref 사용 가이드라인
GitLab v19.1Keep-around ref는 특정 커밋을 Git 가비지 컬렉션 프로세스로부터 보호합니다. Gitaly에서 Git 참조를 사용한 개발에 대한 자세한 내용은 Gitaly에서 사용되는 Git 참조를 참조하세요. Keep-around ref를 사용해 고아 커밋을 보관하면 몇 가지 문제가 발생합니다.
Keep-around ref란 무엇인가#
Keep-around ref는 특정 커밋을 Git 가비지 컬렉션 프로세스로부터 보호합니다. Git GC는 일반적으로 참조되지 않는 커밋(브랜치나 태그를 통해 도달할 수 없는 커밋)을 제거하지만, 커밋 댓글과 CI 빌드 히스토리를 유지하는 것처럼 이러한 고아 커밋을 보존해야 하는 경우가 있습니다. Keep-around ref를 생성함으로써, 이러한 커밋들이 더 이상 활성 브랜치 히스토리의 일부가 아닌 경우에도 리포지터리에 남아 있도록 보장할 수 있습니다.
Gitaly에서 Git 참조를 사용한 개발에 대한 자세한 내용은 Gitaly에서 사용되는 Git 참조를 참조하세요.
Keep-around ref의 단점#
Keep-around ref를 사용해 고아 커밋을 보관하면 몇 가지 문제가 발생합니다.
-
규모가 걷잡을 수 없이 증가합니다(
gitlab-org/gitlab에는 약 1.2 GB의 ref가 있습니다) -
이러한 keep-around ref의 실제 사용처가 분산되어 있어 어디서 keep-around ref가 존재해야 하는지 정확히 파악하기 어렵습니다
-
Keep-around ref의 필요성을 확인하는 데 시간이 많이 걸립니다. 이들이 참조될 수 있는 모든 위치를 고려해야 하기 때문입니다
-
이미 보존된 커밋의 조상은 keep around할 필요가 없지만, 이를 검증하고 효율적으로 정리하기 어렵기 때문에 필요 이상으로 많은 커밋을 보관하게 될 수 있습니다
위에 언급된 단점으로 인해, keep-around ref를 생성하는 위치를 더 추가해서는 안 됩니다. 대신 스코프가 지정된 ref(예: refs/merge-requests/<merge-request-iid>/head)와 같은 대안을 고려하거나, 가능하다면 이러한 ref 생성 자체를 피해야 합니다.
사용법#
다음은 특정 커밋 SHA에 대해 keep-around ref를 생성하는 일반적인 방법입니다.
project.repository.keep_around(sha, source: self.class.name)
이 명령은 refs/keep-around/ 라는 ref를 생성합니다. 여기서 는 keep around되는 커밋 SHA입니다. 이제 커밋을 직접 가리키는 ref가 생겼으므로, 해당 커밋 SHA와 모든 부모 커밋이 가비지 컬렉션되지 않습니다. source는 keep-around ref 생성을 특정 클래스에 귀속시키기 위한 수단으로 사용됩니다.
Keep-around ref가 현재 생성되는 위치#
다음은 현재 keep-around ref가 생성되는 위치들입니다.
-
after_save콜백과 함께MergeRequest#keep_around_commit(merge_commit_sha) -
타깃 프로젝트와 소스 프로젝트 모두에서
after_create콜백과 함께MergeRequestDiff#keep_around_commits(start_commit_sha, head_commit_sha) -
after_save콜백과 함께Note#keep_around_commit(commit_id) -
드래프트 노트를 일괄 게시하며
shas가original_potion과position양쪽에서 오는DraftNotes::PublishService#keep_around_commits(shas) -
일괄 삽입을 위해 건너뛰지 않은 경우
after_save콜백과 함께 단일DiffNote에 대해 위와 유사한DiffNote#Keep_around_commits(sha) -
after_create콜백과 함께Ci::Pipeline#keep_around_commits(sha, before_sha)
향후 작업#
Keep-around ref의 통제되지 않는 증가와 가시성 부족으로 인해, Keep Around Refs 워킹 그룹은 현재 다음 작업을 진행 중입니다:
-
기존 keep-around ref 수 줄이기
-
Keep-around ref가 어떻게, 어디서 사용되는지에 대한 가시성 개선
-
더 나은 확장성을 갖춘 대안 솔루션 개발
가능하면 keep-around ref를 더 이상 생성하지 말고 대안 솔루션을 찾아야 합니다.
gitlab::keep_around::orphaned Rake task는 고아 keep-around ref를 식별하는 데 도움을 주기 위해 만들어졌습니다.