Keep-around ref 사용 가이드라인
GitLab에서 keep-around ref를 사용해 커밋을 Git 가비지 컬렉션으로부터 보호하는 방법과 현재 생성 위치, 향후 작업 방향을 설명합니다.
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_co