저장소 저장소
GitLab은 저장소 저장소에 저장소를 저장합니다. 저장소 저장소는 다음 중 하나입니다:
경고:
저장소 저장소는 저장소가 저장된 디렉토리를 직접 가리키는 path
로 구성될 수 있습니다. GitLab이 저장소를 직접 액세스하는 것은 폐기되었습니다. GitLab을 구성하여 물리적이나 가상 저장소를 통해 저장소에 액세스하도록 설정해야 합니다.
자세한 정보:
- Gitaly 구성에 대한 자세한 내용은 Gitaly 구성을 참조하십시오.
- Gitaly 클러스터 구성에 대한 자세한 내용은 Gitaly 클러스터 구성을 참조하십시오.
해시된 저장소
- 프로젝트 경로에 기초하여 저장소 경로가 생성된 기존 저장소를 지원하는 레거시 저장소 지원이 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 영역에서 프로젝트의 해시 경로를 조회하려면:
- 왼쪽 사이드바에서 맨 아래쪽에 있는 Admin을 선택합니다.
- 개요 > 프로젝트를 선택하고 프로젝트를 선택합니다.
-
상대 경로 필드를 찾습니다. 값은 다음과 비슷합니다:
"@hashed/b1/7e/b17ef6d19c7a5b1ee83b907c595526dcb1eb06db8227d650d5dda0a9f4ce8cd9.git"
Rails 콘솔을 사용하여 프로젝트의 해시 경로를 조회하려면:
- Rails 콘솔을 시작합니다.
-
다음과 유사한 명령을 실행합니다 (프로젝트의 ID 또는 이름을 사용합니다):
Project.find(16).disk_path Project.find_by_full_path('group/project').disk_path
해시된 경로에서 프로젝트 이름으로
관리자는 해시된 상대 경로를 사용하여 프로젝트의 이름을 조회할 수 있습니다:
- Rails 콘솔을 사용합니다.
-
*.git
디렉토리의config
파일을 사용합니다.
Rails 콘솔을 사용하여 프로젝트의 이름을 조회하려면:
- Rails 콘솔을 시작합니다.
-
다음과 유사한 명령을 실행합니다:
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
파일을 사용하여 프로젝트의 이름을 조회하려면:
-
*.git
디렉토리를 찾습니다. 이 디렉토리는 해시 아래의 경로에서/var/opt/gitlab/git-data/repositories/@hashed/
에 있습니다. 예를 들어, 기본 Linux 패키지 설치에서 해시b17eb17ef6d19c7a5b1ee83b907c595526dcb1eb06db8227d650d5dda0a9f4ce8cd9
의*.git
디렉토리는/var/opt/gitlab/git-data/repositories/@hashed/b1/7e/b17ef6d19c7a5b1ee83b907c595526dcb1eb06db8227d650d5dda0a9f4ce8cd9.git
이 됩니다. -
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 콘솔을 사용하여 프로젝트의 객체 풀을 찾으려면 다음을 수행하십시오:
- Rails 콘솔 세션 시작.
-
다음 예와 유사한 명령을 실행하십시오:
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 호환입니다.
새 저장소 저장 위치 구성
여러 저장소 저장 위치를 구성한 후, 새 저장소의 저장 위치를 선택할 수 있습니다:
- 좌측 사이드바에서 아래쪽에서 관리를 선택합니다.
- 설정 > 저장소를 선택합니다.
- 저장소 저장 위치를 확장합니다.
- 새 저장소를 위한 저장소 노드 필드에 값 입력합니다.
- 변경 사항 저장을 선택합니다.
각 저장소 저장 경로에는 0-100까지의 가중치를 할당할 수 있습니다. 새 프로젝트를 만들 때 이러한 가중치는 저장소가 만들어질 위치를 결정하는 데 사용됩니다.
특정 저장소 저장 경로의 가중치가 다른 저장소 저장 경로에 비해 높으면, 선택될 확률이 더 높습니다((저장소 가중치) / (모든 가중치의 합) * 100 = 확률 %
).
기본적으로, 저장소 가중치가 이전에 구성되지 않은 경우:
-
default
의 가중치는100
입니다. - 다른 모든 저장소의 가중치는
0
입니다.
참고:
모든 저장소 가중치가 0
인 경우(예: default
가 존재하지 않는 경우), GitLab은 구성에 관계없이 새 저장소를 default
에 생성하려고 시도합니다.
더 많은 정보는 추적 이슈를 참조하십시오.
저장소 이동
저장소를 다른 저장소로 이동하려면(예: default
에서 storage2
로), Gitaly 클러스터로 이동하는 과정과 동일하게 수행하십시오.