InfoGrab DocsInfoGrab Docs

Keep-around ref 사용 가이드라인

요약

Keep-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)

  • 드래프트 노트를 일괄 게시하며 shasoriginal_potionposition 양쪽에서 오는 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를 식별하는 데 도움을 주기 위해 만들어졌습니다.

Keep-around ref 사용 가이드라인

GitLab v19.1
원문 보기
요약

Keep-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)

  • 드래프트 노트를 일괄 게시하며 shasoriginal_potionposition 양쪽에서 오는 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를 식별하는 데 도움을 주기 위해 만들어졌습니다.