리포지터리 스토리지

Tier: Free, Premium, Ultimate Offering: Self-managed

GitLab은 리포지터리를 리포지터리 저장공간에 저장합니다. 리포지터리 리포지터리는 다음 중 하나입니다:

caution
리포지터리 스토리지는 리포지터리가 저장된 디렉터리를 직접 가리키는 path로 구성될 수 있습니다. GitLab이 직접 리포지터리가 있는 디렉터리에 액세스하는 것은 사용이 중단되었습니다. GitLab을 물리적 또는 가상 리포지터리를 통해 리포지터리에 액세스하도록 구성해야 합니다.

자세한 내용은 다음을 참조하세요:

해시된 리포지터리

해시된 리포지터리는 프로젝트를 프로젝트 ID의 해시를 기반으로 디스크에 저장된 위치에 저장합니다. 이렇게 하면 폴더 구조가 변경되지 않고 URL로부터 디스크 구조로 상태를 동기화하는 필요가 없어집니다. 즉, 그룹, 사용자 또는 프로젝트의 이름을 변경하는 경우:

  • 데이터베이스 트랜잭션만 필요합니다.
  • 즉시 적용됩니다.

해시는 또한 디스크에 저장된 리포지터리를 균일하게 분산시키는 데 도움이 됩니다. 최상위 디렉터리에는 총 상위 네임스페이스 수보다 적은 폴더가 포함되어 있습니다.

해시 형식은 SHA256(project.id)로 계산된 SHA256의 16진 표현에 기반합니다. 최상위 폴더는 처음 두 문자를 사용한 다음 다음 두 문자가 포함된 다른 폴더가 따릅니다. 이 둘은 모두 기존 레거시 리포지터리 프로젝트와 공존할 수 있도록 특수한 @hashed 폴더에 저장됩니다. 예를 들어:

# 프로젝트의 리포지터리:
"@hashed/#{hash[0..1]}/#{hash[2..3]}/#{hash}.git"

# 위키 리포지터리:
"@hashed/#{hash[0..1]}/#{hash[2..3]}/#{hash}.wiki.git"

해시된 리포지터리 경로 번역

Git 리포지터리에 문제를 해결하거나 후크를 추가하는 등의 작업을 위해서는 해시된 리포지터리 경로로부터 사람이 읽을 수 있는 프로젝트 이름으로 번역해야 합니다. 다음을 번역할 수 있습니다:

프로젝트 이름에서 해시된 경로로

관리자는 다음을 사용하여 프로젝트의 해시된 경로를 찾을 수 있습니다:

  • 관리 영역을 사용합니다.
  • Rails 콘솔을 사용합니다.

관리 영역에서 프로젝트의 해시 경로를 찾으려면:

  1. 왼쪽 사이드바에서 맨 아래에서 관리 영역을 선택합니다.
  2. 개요 > 프로젝트를 선택하고 프로젝트를 선택합니다.
  3. 상대 경로 필드를 찾습니다. 값은 다음과 유사합니다:

    "@hashed/b1/7e/b17ef6d19c7a5b1ee83b907c595526dcb1eb06db8227d650d5dda0a9f4ce8cd9.git"
    

Rails 콘솔을 사용하여 프로젝트의 해시 경로를 찾으려면:

  1. Rails 콘솔 시작을 참조하세요.
  2. 다음과 유사한 명령을 실행합니다 (프로젝트의 ID 또는 이름을 사용합니다):

    Project.find(16).disk_path
    Project.find_by_full_path('group/project').disk_path
    

해시된 경로에서 프로젝트 이름으로

관리자는 다음을 사용하여 해시된 상대 경로에서 프로젝트 이름을 찾을 수 있습니다:

  • Rails 콘솔을 사용합니다.
  • *.git 디렉터리의 config 파일을 사용합니다.

Rails 콘솔을 사용하여 프로젝트 이름을 찾으려면:

  1. Rails 콘솔 시작을 참조하세요.
  2. 다음과 유사한 명령을 실행합니다:

    ProjectRepository.find_by(disk_path: '@hashed/b1/7e/b17ef6d19c7a5b1ee83b907c595526dcb1eb06db8227d650d5dda0a9f4ce8cd9').project
    

그 명령의 따옴표로 묶인 문자열은 GitLab 서버에서 찾을 수 있는 디렉터리 트리입니다. 예를 들어, 기본 Linux 패키지 설치에서 이것은 /var/opt/gitlab/git-data/repositories/@hashed/b1/7e/b17ef6d19c7a5b1ee83b907c595526dcb1eb06db8227d650d5dda0a9f4ce8cd9.git 를 사용하고 디렉터리 이름의 끝에서 .git을 제거합니다.

출력에는 프로젝트 ID와 프로젝트 이름이 포함됩니다. 예를 들어:

=> #<Project id:16 it/supportteam/ticketsystem>

*.git 디렉터리의 config 파일을 사용하여 프로젝트 이름을 찾으려면:

  1. *.git 디렉터리를 찾습니다. 이 디렉터리는 @hashed/ 아래의 경로에서 해시의 첫 네 문자가 @hashed/ 아래의 경로의 첫 두 디렉터리입니다. 예를 들어, 기본 Linux 패키지 설치에서 해시 b17eb17ef6d19c7a5b1ee83b907c595526dcb1eb06db8227d650d5dda0a9f4ce8cd9*.git 디렉터리는 /var/opt/gitlab/git-data/repositories/@hashed/b1/7e/b17ef6d19c7a5b1ee83b907c595526dcb1eb06db8227d650d5dda0a9f4ce8cd9.git일 것입니다.
  2. config 파일을 열고 [gitlab] 아래의 fullpath= 키를 찾습니다.

해시된 객체 풀

객체 풀은 공용 및 내부 프로젝트의 복제본을 중복으로 저장하는 리포지터리로 사용되며, 소스 프로젝트의 객체를 포함합니다.objects/info/alternates를 사용하여 소스 프로젝트와 복제본은 공유된 객체를 위해 객체 풀을 사용합니다. 자세한 정보는 깃랩에서 Git 객체 중복 저장이 작동하는 방식을 참조하십시오.

소스 프로젝트에서 정기적인 정리를 실행할 때 객체는 객체 풀로 이동됩니다. 객체 풀 리포지터리는 @hashed 대신에 @pools 디렉터리에 일반 리포지터리와 유사하게 저장됩니다.

# 객체 풀 경로
"@pools/#{hash[0..1]}/#{hash[2..3]}/#{hash}.git"
caution
@pools 디렉터리에 저장된 객체 풀 리포지터리에서는 git prune 또는 git gc을 실행하지 마십시오. 이로 인해 객체 풀에 종속된 일반 리포지터리에서 데이터가 손실될 수 있습니다.

해시된 객체 풀 리포지터리 경로 번역

Rails 콘솔을 사용하여 프로젝트의 객체 풀을 조회하려면:

  1. Rails 콘솔을 시작합니다.
  2. 다음 예제와 유사한 명령을 실행합니다.

    project_id = 1
    pool_repository = Project.find(project_id).pool_repository
    pool_repository = Project.find_by_full_path('group/project').pool_repository
       
    # 객체 풀 리포지터리에 대한 자세한 정보 가져오기
    pool_repository.source_project
    pool_repository.member_projects
    pool_repository.shard
    pool_repository.disk_path
    

그룹 위키 리포지터리

프로젝트 위키가 @hashed 디렉터리에 저장되는 것과 달리, 그룹 위키는 @groups 디렉터리에 저장됩니다. 프로젝트 위키와 유사하게 그룹 위키는 해시된 리포지터리 폴더 규칙을 따르지만 프로젝트 ID 대신에 그룹 ID의 해시를 사용합니다.

예:

# 그룹 위키 경로
"@groups/#{hash[0..1]}/#{hash[2..3]}/#{hash}.wiki.git"

Gitaly 클러스터 리포지터리

Gitaly 클러스터를 사용하는 경우, Praefect가 리포지터리 위치를 관리합니다. Praefect가 사용하는 내부 경로는 해시된 경로와 다릅니다. 더 많은 정보는 Praefect가 생성한 복제본 경로를 참조하십시오.

객체 리포지터리 지원

이 표는 각 리포지터리 유형에서 저장 가능한 객체를 보여줍니다:

저장 가능한 객체 해시된 리포지터리 S3 호환
리포지터리 -
첨부 파일 -
아바타 아니요 -
페이지 아니요 -
도커 레지스트리 아니요 -
CI/CD 작업 로그 아니요 -
CI/CD 아티팩트 아니요
CI/CD 캐시 아니요
LFS 객체 유사
리포지터리 풀 -

S3 호환 엔드포인트에 저장된 파일은 #{namespace}/#{project_name}로 접두어가 지정되지 않는 한 해시된 리포지터리와 동일한 이점을 가질 수 있습니다.

아바타

각 파일은 데이터베이스에서 할당된 id와 일치하는 디렉터리에 저장됩니다. 사용자 아바타의 파일 이름은 항상 avatar.png입니다. 아바타가 교체되면 Upload 모델이 파괴되고 새로운 모델이 다른 id로 대체됩니다.

CI/CD 아티팩트

CI/CD 아티팩트는 S3 호환입니다.

LFS 객체

깃랩의 LFS 객체는 Git 구현을 따르는 두 문자 및 두 수준 폴더를 사용하여 유사한 리포지터리 패턴을 구현합니다.

"shared/lfs-objects/#{oid[0..1}/#{oid[2..3]}/#{oid[4..-1]}"

# 객체 `oid`를 기반으로, `8909029eb962194cfb326259411b22ae3f4a814b5be4f80651735aeef9f3229c` 경로는 다음과 같습니다:
"shared/lfs-objects/89/09/029eb962194cfb326259411b22ae3f4a814b5be4f80651735aeef9f3229c"

LFS 객체는 또한 S3 호환입니다.

새로운 리포지터리가 저장되는 위치 구성

여러 리포지터리 스토리지를 구성한 후에, 새로운 리포지터리가 저장되는 위치를 선택할 수 있습니다:

  1. 왼쪽 사이드바에서 맨 아래에서 Admin Area를 선택합니다.
  2. Settings > Repository를 선택합니다.
  3. Repository storage를 확장합니다.
  4. Storage nodes for new repositories 필드에 값을 입력합니다.
  5. Save changes를 선택합니다.

각 리포지터리 저장 경로에는 0-100의 가중치가 지정될 수 있습니다. 새 프로젝트가 생성될 때, 이러한 가중치는 리포지터리가 생성되는 위치를 결정하는 데 사용됩니다.

주어진 리포지터리 저장 경로의 가중치가 다른 리포지터리 저장 경로에 대한 가중치에 비해 높을수록 더 자주 선택됩니다((저장 가중치) / (모든 가중치의 합) * 100 = 확률 %).

기본적으로, 리포지터리 가중치가 이전에 구성되지 않았다면:

  • default100의 가중치이며,
  • 다른 모든 리포지터리는 0의 가중치를 갖습니다.
note
모든 저장 가중치가 0인 경우(예: default가 없는 경우), GitLab은 구성과 관계없이 새 리포지터리를 default에 생성하려고 시도하며, default가 존재하는지 여부에 관계없이 생성하려고 시도합니다. 더 많은 정보는 추적 이슈를 참조하십시오.

리포지터리 이동

리포지터리를 다른 리포지터리로 이동하려면(default에서 storage2로 예를 들어), Gitaly 클러스터로 이동하는 것과 유사한 프로세스를 사용합니다.