저장소 저장소

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

GitLab은 저장소 저장소에 저장소를 저장합니다. 저장소 저장소는 다음 중 하나입니다:

  • Gitaly 노드를 가리키는 gitaly_address로 구성된 물리적 저장소
  • Gitaly 클러스터에 저장소를 저장하는 가상 저장소

경고: 저장소 저장소는 저장소가 저장된 디렉토리를 직접 가리키는 path로 구성될 수 있습니다. GitLab이 저장소를 직접 액세스하는 것은 폐기되었습니다. GitLab을 구성하여 물리적이나 가상 저장소를 통해 저장소에 액세스하도록 설정해야 합니다.

자세한 정보:

해시된 저장소

  • 프로젝트 경로에 기초하여 저장소 경로가 생성된 기존 저장소를 지원하는 레거시 저장소 지원이 GitLab 14.0에서 완전히 제거되었습니다.
  • GitLab 16.3에서 저장소 이름 필드는 이름이 변경되었습니다 (이전에는 Gitaly 저장소 이름) 및 상대 경로 필드는 이름이 변경되었습니다.

해시된 저장소는 프로젝트를 프로젝트 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 저장소의 문제 해결, 후크 추가 및 기타 작업에는 사람이 읽을 수 있는 프로젝트 이름과 해시된 저장소 경로 간의 번역이 필요합니다. 다음을 번역할 수 있습니다:

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

관리자는 프로젝트의 이름 또는 ID를 사용하여 프로젝트의 해시된 경로를 조회할 수 있습니다:

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

Admin 영역에서 프로젝트의 해시 경로를 조회하려면:

  1. 왼쪽 사이드바에서 맨 아래쪽에 있는 Admin을 선택합니다.
  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 디렉토리를 찾습니다. 이 디렉토리는 해시 아래의 경로에서 /var/opt/gitlab/git-data/repositories/@hashed/에 있습니다. 예를 들어, 기본 Linux 패키지 설치에서 해시 b17eb17ef6d19c7a5b1ee83b907c595526dcb1eb06db8227d650d5dda0a9f4ce8cd9*.git 디렉토리는 /var/opt/gitlab/git-data/repositories/@hashed/b1/7e/b17ef6d19c7a5b1ee83b907c595526dcb1eb06db8227d650d5dda0a9f4ce8cd9.git이 됩니다.
  2. config 파일을 열고 [gitlab] 아래의 fullpath= 키를 찾습니다.

해시된 객체 풀

객체 풀은 공용 및 내부 프로젝트의 포크를 중복으로 저장하는 저장소로, 소스 프로젝트의 객체를 포함합니다. objects/info/alternates를 사용하여 소스 프로젝트 및 포크는 공유 객체를 위해 객체 풀을 사용합니다. 자세한 내용은 GitLab에서 Git 객체 중복 처리하는 방법을 참조하십시오.

객체는 소스 프로젝트에서 housekeeping이 실행될 때 객체 풀로 이동됩니다. 객체 풀 저장소는 @hashed 대신 @pools 디렉터리에 일반 저장소와 유사하게 저장됩니다.

# 객체 풀 경로
"@pools/#{hash[0..1]}/#{hash[2..3]}/#{hash}.git"

주의: @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 객체

GitLab의 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. 좌측 사이드바에서 아래쪽에서 관리를 선택합니다.
  2. 설정 > 저장소를 선택합니다.
  3. 저장소 저장 위치를 확장합니다.
  4. 새 저장소를 위한 저장소 노드 필드에 값 입력합니다.
  5. 변경 사항 저장을 선택합니다.

각 저장소 저장 경로에는 0-100까지의 가중치를 할당할 수 있습니다. 새 프로젝트를 만들 때 이러한 가중치는 저장소가 만들어질 위치를 결정하는 데 사용됩니다.

특정 저장소 저장 경로의 가중치가 다른 저장소 저장 경로에 비해 높으면, 선택될 확률이 더 높습니다((저장소 가중치) / (모든 가중치의 합) * 100 = 확률 %).

기본적으로, 저장소 가중치가 이전에 구성되지 않은 경우:

  • default의 가중치는 100입니다.
  • 다른 모든 저장소의 가중치는 0입니다.

참고: 모든 저장소 가중치가 0인 경우(예: default가 존재하지 않는 경우), GitLab은 구성에 관계없이 새 저장소를 default에 생성하려고 시도합니다. 더 많은 정보는 추적 이슈를 참조하십시오.

저장소 이동

저장소를 다른 저장소로 이동하려면(예: default에서 storage2로), Gitaly 클러스터로 이동하는 과정과 동일하게 수행하십시오.