InfoGrab Docs

로컬 컴퓨터에 Git 저장소 복제

요약

로컬 컴퓨터에 Git 저장소를 복제할 수 있습니다. 한 번만 인증하고 싶을 때 SSH로 복제합니다. SSH 문서의 지침을 따라 GitLab에 인증합니다. 상단 바에서 검색 또는 이동을 선택하고 복제할 프로젝트를 찾습니다.

로컬 컴퓨터에 Git 저장소를 복제할 수 있습니다. 이 작업은 저장소의 복사본을 만들고 컴퓨터와 GitLab 서버 간의 변경 사항을 동기화하는 연결을 구축합니다. 이 연결에는 자격 증명을 추가해야 합니다. SSH로 복제하거나 HTTPS로 복제할 수 있습니다. SSH가 권장되는 인증 방법입니다.

저장소 복제:

  • 모든 프로젝트 파일, 히스토리 및 메타데이터를 로컬 컴퓨터에 다운로드합니다.
  • 최신 버전의 파일로 작업 디렉토리를 만듭니다.
  • 향후 변경 사항을 동기화하기 위해 원격 추적을 설정합니다.
  • 전체 코드베이스에 오프라인으로 액세스할 수 있습니다.
  • 프로젝트에 코드를 다시 기여하기 위한 기반을 구축합니다.

SSH로 복제#

한 번만 인증하고 싶을 때 SSH로 복제합니다.

  1. SSH 문서의 지침을 따라 GitLab에 인증합니다.

  2. 상단 바에서 검색 또는 이동을 선택하고 복제할 프로젝트를 찾습니다.

  3. 프로젝트 개요 페이지의 오른쪽 상단에서 Code를 선택한 다음 SSH로 복제 URL을 복사합니다.

  4. 터미널을 열고 파일을 복제할 디렉토리로 이동합니다. Git은 자동으로 저장소 이름의 폴더를 만들고 파일을 거기에 다운로드합니다.

  5. 다음 명령을 실행합니다:

    git clone <copied URL>
    
  6. 파일을 보려면 새 디렉토리로 이동합니다:

    cd <new directory>
    

HTTPS로 복제#

컴퓨터와 GitLab 간의 작업을 수행할 때마다 인증하고 싶을 때 HTTPS로 복제합니다. OAuth 자격 증명 도우미는 수동으로 인증해야 하는 횟수를 줄여 HTTPS를 원활한 환경으로 만들 수 있습니다.

  1. 상단 바에서 검색 또는 이동을 선택하고 복제할 프로젝트를 찾습니다.

  2. 프로젝트 개요 페이지의 오른쪽 상단에서 Code를 선택한 다음 HTTPS로 복제 URL을 복사합니다.

  3. 터미널을 열고 파일을 복제할 디렉토리로 이동합니다.

  4. 다음 명령을 실행합니다. Git은 자동으로 저장소 이름의 폴더를 만들고 파일을 거기에 다운로드합니다.

    git clone <copied URL>
    
  5. 요청을 인증합니다.

    [!note] 이중 인증(2FA)을 활성화한 경우 사용자 이름과 비밀번호 인증을 사용할 수 없습니다. 대신:

  6. 파일을 보려면 새 디렉토리로 이동합니다:

    cd <new directory>
    
Note

Windows에서 비밀번호를 여러 번 잘못 입력하여 Access denied 메시지가 나타나면, 경로에 네임스페이스(사용자 이름 또는 그룹)를 추가하세요: git clone https://namespace@gitlab.com/gitlab-org/gitlab.git.

토큰을 사용한 복제#

다음의 경우 토큰을 사용하여 HTTPS로 복제합니다:

  • 2FA를 사용하려는 경우.
  • 하나 이상의 저장소로 범위가 지정된 취소 가능한 자격 증명 세트를 원하는 경우.

HTTPS로 복제할 때 다음 토큰 중 하나를 사용하여 인증할 수 있습니다:

예를 들어:

git clone https://<username>:<token>@gitlab.example.com/tanuki/awesome_project.git

Apple Xcode에서 복제 및 열기#

.xcodeproj 또는 .xcworkspace 디렉토리가 포함된 프로젝트는 macOS의 Xcode로 복제할 수 있습니다.

  1. GitLab UI에서 프로젝트 개요 페이지로 이동합니다.
  2. 오른쪽 상단에서 Code를 선택합니다.
  3. Xcode를 선택합니다.

프로젝트가 컴퓨터로 복제되고 Xcode를 열라는 메시지가 표시됩니다.

Visual Studio Code에서 복제 및 열기#

모든 프로젝트는 GitLab 사용자 인터페이스에서 Visual Studio Code로 복제할 수 있지만, Visual Studio Code에서 복제하려면 GitLab VS Code 확장 프로그램을 설치할 수도 있습니다.

필수 조건:

  • Visual Studio Code가 로컬 컴퓨터에 설치되어 있어야 합니다. VS Code Insiders 및 VSCodium과 같은 다른 버전의 VS Code는 지원되지 않습니다.
  • IDE 프로토콜에 대한 브라우저 구성.
  • GitLab 인터페이스에서:
    1. 프로젝트 개요 페이지로 이동합니다.

    2. 오른쪽 상단에서 Code를 선택합니다.

    3. IDE에서 열기 아래에서 Visual Studio Code (SSH) 또는 **Visual Studio Code (HTTPS)**를 선택합니다.

    4. 프로젝트를 복제할 폴더를 선택합니다.

      Visual Studio Code가 프로젝트를 복제한 후 폴더가 열립니다.

  • 확장 프로그램이 설치된 Visual Studio Code에서 확장 프로그램의 Git: Clone 명령을 사용합니다.

IntelliJ IDEA에서 복제 및 열기#

모든 프로젝트는 GitLab 사용자 인터페이스에서 IntelliJ IDEA로 복제할 수 있습니다.

필수 조건:

방법:

  1. 프로젝트 개요 페이지로 이동합니다.
  2. 오른쪽 상단에서 Code를 선택합니다.
  3. IDE에서 열기 아래에서 IntelliJ IDEA (SSH) 또는 **IntelliJ IDEA (HTTPS)**를 선택합니다.

IDE 프로토콜에 대한 브라우저 구성#

IDE에서 열기 기능이 작동하는지 확인하려면 vscode:// 또는 jetbrains://와 같은 커스텀 애플리케이션 프로토콜을 처리하도록 브라우저를 구성해야 합니다.

Firefox#

Firefox는 시스템에 필요한 애플리케이션이 설치된 경우 커스텀 프로토콜을 자동으로 처리합니다. 커스텀 프로토콜 링크를 처음 선택하면 대화 상자가 열리고 애플리케이션을 열지 여부를 묻습니다. Firefox에서 애플리케이션을 열려면 링크 열기를 선택합니다.

다시 묻지 않으려면 선택 항목을 기억하는 확인란을 선택합니다.

메시지 대화 상자가 열리지 않으면 Firefox를 수동으로 구성해야 합니다:

  1. Firefox를 엽니다.
  2. 오른쪽 상단에서 애플리케이션 메뉴 열기([hamburger])를 선택합니다.
  3. 애플리케이션 섹션을 검색하거나 이동합니다.
  4. 목록에서 원하는 애플리케이션을 찾아 선택합니다. 예를 들어, vscode 또는 jetbrains.
  5. 드롭다운 목록에서 Visual Studio Code 또는 IntelliJ IDEA를 선택하거나 **다른 프로그램 사용...**을 선택하여 실행 파일을 찾습니다.

선호하는 IDE가 목록에 없으면 해당 링크를 처음 선택할 때 애플리케이션을 선택하라는 메시지가 표시됩니다.

Chrome#

Chrome은 시스템에 필요한 애플리케이션이 설치된 경우 커스텀 프로토콜을 자동으로 처리합니다. Chrome에서 커스텀 프로토콜 링크를 처음 선택하면 대화 상자가 열리고 애플리케이션을 열지 여부를 묻습니다. Chrome에서 애플리케이션을 열려면 열기를 선택합니다.

다시 묻지 않으려면 선택 항목을 기억하는 확인란을 선택합니다.

복제 크기 줄이기#

Git 저장소는 크기가 커질수록 다음과 같은 이유로 다루기가 번거로워질 수 있습니다:

  • 다운로드해야 하는 방대한 히스토리 양.
  • 필요한 많은 디스크 공간.

부분 복제는 Git이 저장소의 완전한 복사본 없이 작동할 수 있게 해주는 성능 최적화입니다. 이 작업의 목표는 Git이 매우 큰 저장소를 더 잘 처리할 수 있게 하는 것입니다.

Git 2.22.0 이상이 필요합니다.

파일 크기로 필터링#

Git에 대용량 바이너리 파일을 저장하는 것은 일반적으로 권장되지 않습니다. 추가된 모든 대용량 파일은 이후에 변경 사항을 복제하거나 가져오는 모든 사람이 다운로드하기 때문입니다. 이러한 다운로드는 느리고 문제가 있으며 특히 느리거나 불안정한 인터넷 연결로 작업할 때 문제가 됩니다.

파일 크기 필터와 함께 부분 복제를 사용하면 복제 및 가져오기에서 문제가 있는 대용량 파일을 제외하여 이 문제를 해결합니다. Git이 누락된 파일을 만나면 요청 시 다운로드됩니다.

저장소를 복제할 때 --filter=blob:limit=<size> 인수를 사용합니다. 예를 들어, 1메가바이트보다 큰 파일을 제외하고 저장소를 복제하려면:

git clone --filter=blob:limit=1m git@gitlab.com:gitlab-com/www-gitlab-com.git

다음 출력이 생성됩니다:

Cloning into 'www-gitlab-com'...
remote: Enumerating objects: 832467, done.
remote: Counting objects: 100% (832467/832467), done.
remote: Compressing objects: 100% (207226/207226), done.
remote: Total 832467 (delta 585563), reused 826624 (delta 580099), pack-reused 0
Receiving objects: 100% (832467/832467), 2.34 GiB | 5.05 MiB/s, done.
Resolving deltas: 100% (585563/585563), done.
remote: Enumerating objects: 146, done.
remote: Counting objects: 100% (146/146), done.
remote: Compressing objects: 100% (138/138), done.
remote: Total 146 (delta 8), reused 144 (delta 8), pack-reused 0
Receiving objects: 100% (146/146), 471.45 MiB | 4.60 MiB/s, done.
Resolving deltas: 100% (8/8), done.
Updating files: 100% (13008/13008), done.
Filtering content: 100% (3/3), 131.24 MiB | 4.65 MiB/s, done.

Git이 다음 작업을 수행하므로 출력이 더 깁니다:

  1. 1메가바이트보다 큰 파일을 제외하고 저장소를 복제합니다.
  2. 기본 브랜치를 체크아웃하는 데 필요한 누락된 대용량 파일을 다운로드합니다.

브랜치를 변경할 때 Git이 더 많은 누락된 파일을 다운로드할 수 있습니다.

객체 유형으로 필터링#

수백만 개의 파일과 긴 히스토리가 있는 저장소의 경우 모든 파일을 제외하고 git sparse-checkout을 사용하여 작업 복사본의 크기를 줄일 수 있습니다.

# Clone the repo excluding all files
$ git clone --filter=blob:none --sparse git@gitlab.com:gitlab-com/www-gitlab-com.git
Cloning into 'www-gitlab-com'...
remote: Enumerating objects: 678296, done.
remote: Counting objects: 100% (678296/678296), done.
remote: Compressing objects: 100% (165915/165915), done.
remote: Total 678296 (delta 472342), reused 673292 (delta 467476), pack-reused 0
Receiving objects: 100% (678296/678296), 81.06 MiB | 5.74 MiB/s, done.
Resolving deltas: 100% (472342/472342), done.
remote: Enumerating objects: 28, done.
remote: Counting objects: 100% (28/28), done.
remote: Compressing objects: 100% (25/25), done.
remote: Total 28 (delta 0), reused 12 (delta 0), pack-reused 0
Receiving objects: 100% (28/28), 140.29 KiB | 341.00 KiB/s, done.
Updating files: 100% (28/28), done.

$ cd www-gitlab-com

$ git sparse-checkout set data --cone
remote: Enumerating objects: 301, done.
remote: Counting objects: 100% (301/301), done.
remote: Compressing objects: 100% (292/292), done.
remote: Total 301 (delta 16), reused 102 (delta 9), pack-reused 0
Receiving objects: 100% (301/301), 1.15 MiB | 608.00 KiB/s, done.
Resolving deltas: 100% (16/16), done.
Updating files: 100% (302/302), done.

자세한 내용은 sparse-checkout에 대한 Git 문서를 참조하세요.

파일 경로로 필터링#

부분 복제와 sparse checkout 간의 더 깊은 통합은 --filter=sparse:oid=<blob-ish> 필터 스펙을 통해 가능합니다. 이 필터링 모드는 .gitignore 파일과 유사한 형식을 사용하여 복제 및 가져오기 시 포함할 파일을 지정합니다.

Warning

sparse 필터를 사용하는 부분 복제는 아직 실험적입니다. 복제 및 가져오기 시 느릴 수 있고 Gitaly 리소스 사용률을 크게 증가시킬 수 있습니다. 대신 모든 블롭을 필터링하고 sparse-checkout 사용하세요. git-sparse-checkout이 이 유형의 부분 복제 사용을 단순화하고 제한을 극복하기 때문입니다.

자세한 내용은 rev-list-options에 대한 Git 문서를 참조하세요.

  1. 필터 스펙을 만듭니다. 예를 들어, 루트의 다양한 하위 디렉토리에 많은 애플리케이션이 있는 모놀리식 저장소를 생각해 보세요. shiny-app/.filterspec 파일을 만드세요:

    # Only the paths listed in the file will be downloaded when performing a
    # partial clone using `--filter=sparse:oid=shiny-app/.gitfilterspec`
    
    # Explicitly include filterspec needed to configure sparse checkout with
    # git config --local core.sparsecheckout true
    # git show master:snazzy-app/.gitfilterspec >> .git/info/sparse-checkout
    shiny-app/.gitfilterspec
    
    # Shiny App
    shiny-app/
    
    # Dependencies
    shimmery-app/
    shared-component-a/
    shared-component-b/
    
  2. 경로로 복제 및 필터링합니다. 복제 명령과 함께 --filter=sparse:oid를 지원하는 것은 sparse checkout과 완전히 통합되지 않습니다.

    # Clone the filtered set of objects using the filterspec stored on the
    # server. WARNING: this step may be very slow!
    git clone --sparse --filter=sparse:oid=master:shiny-app/.gitfilterspec <url>
    
    # Optional: Check for missing objects that have not been fetched
    git rev-list --all --quiet --objects --missing=print | wc -l
    

    [!warning] Git 상태 정보를 자동으로 표시하는 bash, Zsh 등과 편집기를 사용한 Git 통합은 종종 전체 저장소를 가져오는 git fetch를 실행합니다. 이러한 통합을 비활성화하거나 재구성해야 할 수 있습니다.

부분 복제 필터링 제거#

부분 복제 필터링이 있는 Git 저장소는 필터링을 제거할 수 있습니다. 필터링을 제거하려면:

  1. 저장소가 완전한지 확인하기 위해 필터로 제외된 모든 것을 가져옵니다. git sparse-checkout을 사용한 경우 git sparse-checkout disable을 사용하여 비활성화합니다. 자세한 내용은 disable 문서를 참조하세요.

    그런 다음 저장소가 완전한지 확인하기 위해 일반 fetch를 수행합니다. 특히 git sparse-checkout을 사용하지 않는 경우 누락된 객체를 가져올지 확인한 다음 가져오려면 다음 명령을 사용할 수 있습니다:

    # Show missing objects
    git rev-list --objects --all --missing=print | grep -e '^\?'
    
    # Show missing objects without a '?' character before them (needs GNU grep)
    git rev-list --objects --all --missing=print | grep -oP '^\?\K\w+'
    
    # Fetch missing objects
    git fetch origin $(git rev-list --objects --all --missing=print | grep -oP '^\?\K\w+')
    
    # Show number of missing objects
    git rev-list --objects --all --missing=print | grep -e '^\?' | wc -l
    
  2. 모든 것을 다시 팩합니다. 예를 들어 git repack -a -d를 사용하여 수행할 수 있습니다. 이렇게 하면 .git/objects/pack/에 세 개의 파일만 남아야 합니다:

    • pack-.pack 파일.
    • 해당하는 pack-.idx 파일.
    • pack-.promisor 파일.
  3. .promisor 파일을 삭제합니다. 이전 단계에서 비어 있어야 하는 pack-.promisor 파일 하나만 남아 있어야 하며 삭제해야 합니다.

  4. 부분 복제 구성을 제거합니다. 부분 복제 관련 구성 변수는 Git 구성 파일에서 제거해야 합니다. 일반적으로 다음 구성만 제거하면 됩니다:

    • remote.origin.promisor.
    • remote.origin.partialclonefilter.

로컬 컴퓨터에 Git 저장소 복제

원문 보기
요약

로컬 컴퓨터에 Git 저장소를 복제할 수 있습니다. 한 번만 인증하고 싶을 때 SSH로 복제합니다. SSH 문서의 지침을 따라 GitLab에 인증합니다. 상단 바에서 검색 또는 이동을 선택하고 복제할 프로젝트를 찾습니다.

로컬 컴퓨터에 Git 저장소를 복제할 수 있습니다. 이 작업은 저장소의 복사본을 만들고 컴퓨터와 GitLab 서버 간의 변경 사항을 동기화하는 연결을 구축합니다. 이 연결에는 자격 증명을 추가해야 합니다. SSH로 복제하거나 HTTPS로 복제할 수 있습니다. SSH가 권장되는 인증 방법입니다.

저장소 복제:

  • 모든 프로젝트 파일, 히스토리 및 메타데이터를 로컬 컴퓨터에 다운로드합니다.
  • 최신 버전의 파일로 작업 디렉토리를 만듭니다.
  • 향후 변경 사항을 동기화하기 위해 원격 추적을 설정합니다.
  • 전체 코드베이스에 오프라인으로 액세스할 수 있습니다.
  • 프로젝트에 코드를 다시 기여하기 위한 기반을 구축합니다.

SSH로 복제#

한 번만 인증하고 싶을 때 SSH로 복제합니다.

  1. SSH 문서의 지침을 따라 GitLab에 인증합니다.

  2. 상단 바에서 검색 또는 이동을 선택하고 복제할 프로젝트를 찾습니다.

  3. 프로젝트 개요 페이지의 오른쪽 상단에서 Code를 선택한 다음 SSH로 복제 URL을 복사합니다.

  4. 터미널을 열고 파일을 복제할 디렉토리로 이동합니다. Git은 자동으로 저장소 이름의 폴더를 만들고 파일을 거기에 다운로드합니다.

  5. 다음 명령을 실행합니다:

    git clone <copied URL>
    
  6. 파일을 보려면 새 디렉토리로 이동합니다:

    cd <new directory>
    

HTTPS로 복제#

컴퓨터와 GitLab 간의 작업을 수행할 때마다 인증하고 싶을 때 HTTPS로 복제합니다. OAuth 자격 증명 도우미는 수동으로 인증해야 하는 횟수를 줄여 HTTPS를 원활한 환경으로 만들 수 있습니다.

  1. 상단 바에서 검색 또는 이동을 선택하고 복제할 프로젝트를 찾습니다.

  2. 프로젝트 개요 페이지의 오른쪽 상단에서 Code를 선택한 다음 HTTPS로 복제 URL을 복사합니다.

  3. 터미널을 열고 파일을 복제할 디렉토리로 이동합니다.

  4. 다음 명령을 실행합니다. Git은 자동으로 저장소 이름의 폴더를 만들고 파일을 거기에 다운로드합니다.

    git clone <copied URL>
    
  5. 요청을 인증합니다.

    [!note] 이중 인증(2FA)을 활성화한 경우 사용자 이름과 비밀번호 인증을 사용할 수 없습니다. 대신:

  6. 파일을 보려면 새 디렉토리로 이동합니다:

    cd <new directory>
    
Note

Windows에서 비밀번호를 여러 번 잘못 입력하여 Access denied 메시지가 나타나면, 경로에 네임스페이스(사용자 이름 또는 그룹)를 추가하세요: git clone https://namespace@gitlab.com/gitlab-org/gitlab.git.

토큰을 사용한 복제#

다음의 경우 토큰을 사용하여 HTTPS로 복제합니다:

  • 2FA를 사용하려는 경우.
  • 하나 이상의 저장소로 범위가 지정된 취소 가능한 자격 증명 세트를 원하는 경우.

HTTPS로 복제할 때 다음 토큰 중 하나를 사용하여 인증할 수 있습니다:

예를 들어:

git clone https://<username>:<token>@gitlab.example.com/tanuki/awesome_project.git

Apple Xcode에서 복제 및 열기#

.xcodeproj 또는 .xcworkspace 디렉토리가 포함된 프로젝트는 macOS의 Xcode로 복제할 수 있습니다.

  1. GitLab UI에서 프로젝트 개요 페이지로 이동합니다.
  2. 오른쪽 상단에서 Code를 선택합니다.
  3. Xcode를 선택합니다.

프로젝트가 컴퓨터로 복제되고 Xcode를 열라는 메시지가 표시됩니다.

Visual Studio Code에서 복제 및 열기#

모든 프로젝트는 GitLab 사용자 인터페이스에서 Visual Studio Code로 복제할 수 있지만, Visual Studio Code에서 복제하려면 GitLab VS Code 확장 프로그램을 설치할 수도 있습니다.

필수 조건:

  • Visual Studio Code가 로컬 컴퓨터에 설치되어 있어야 합니다. VS Code Insiders 및 VSCodium과 같은 다른 버전의 VS Code는 지원되지 않습니다.
  • IDE 프로토콜에 대한 브라우저 구성.
  • GitLab 인터페이스에서:
    1. 프로젝트 개요 페이지로 이동합니다.

    2. 오른쪽 상단에서 Code를 선택합니다.

    3. IDE에서 열기 아래에서 Visual Studio Code (SSH) 또는 **Visual Studio Code (HTTPS)**를 선택합니다.

    4. 프로젝트를 복제할 폴더를 선택합니다.

      Visual Studio Code가 프로젝트를 복제한 후 폴더가 열립니다.

  • 확장 프로그램이 설치된 Visual Studio Code에서 확장 프로그램의 Git: Clone 명령을 사용합니다.

IntelliJ IDEA에서 복제 및 열기#

모든 프로젝트는 GitLab 사용자 인터페이스에서 IntelliJ IDEA로 복제할 수 있습니다.

필수 조건:

방법:

  1. 프로젝트 개요 페이지로 이동합니다.
  2. 오른쪽 상단에서 Code를 선택합니다.
  3. IDE에서 열기 아래에서 IntelliJ IDEA (SSH) 또는 **IntelliJ IDEA (HTTPS)**를 선택합니다.

IDE 프로토콜에 대한 브라우저 구성#

IDE에서 열기 기능이 작동하는지 확인하려면 vscode:// 또는 jetbrains://와 같은 커스텀 애플리케이션 프로토콜을 처리하도록 브라우저를 구성해야 합니다.

Firefox#

Firefox는 시스템에 필요한 애플리케이션이 설치된 경우 커스텀 프로토콜을 자동으로 처리합니다. 커스텀 프로토콜 링크를 처음 선택하면 대화 상자가 열리고 애플리케이션을 열지 여부를 묻습니다. Firefox에서 애플리케이션을 열려면 링크 열기를 선택합니다.

다시 묻지 않으려면 선택 항목을 기억하는 확인란을 선택합니다.

메시지 대화 상자가 열리지 않으면 Firefox를 수동으로 구성해야 합니다:

  1. Firefox를 엽니다.
  2. 오른쪽 상단에서 애플리케이션 메뉴 열기([hamburger])를 선택합니다.
  3. 애플리케이션 섹션을 검색하거나 이동합니다.
  4. 목록에서 원하는 애플리케이션을 찾아 선택합니다. 예를 들어, vscode 또는 jetbrains.
  5. 드롭다운 목록에서 Visual Studio Code 또는 IntelliJ IDEA를 선택하거나 **다른 프로그램 사용...**을 선택하여 실행 파일을 찾습니다.

선호하는 IDE가 목록에 없으면 해당 링크를 처음 선택할 때 애플리케이션을 선택하라는 메시지가 표시됩니다.

Chrome#

Chrome은 시스템에 필요한 애플리케이션이 설치된 경우 커스텀 프로토콜을 자동으로 처리합니다. Chrome에서 커스텀 프로토콜 링크를 처음 선택하면 대화 상자가 열리고 애플리케이션을 열지 여부를 묻습니다. Chrome에서 애플리케이션을 열려면 열기를 선택합니다.

다시 묻지 않으려면 선택 항목을 기억하는 확인란을 선택합니다.

복제 크기 줄이기#

Git 저장소는 크기가 커질수록 다음과 같은 이유로 다루기가 번거로워질 수 있습니다:

  • 다운로드해야 하는 방대한 히스토리 양.
  • 필요한 많은 디스크 공간.

부분 복제는 Git이 저장소의 완전한 복사본 없이 작동할 수 있게 해주는 성능 최적화입니다. 이 작업의 목표는 Git이 매우 큰 저장소를 더 잘 처리할 수 있게 하는 것입니다.

Git 2.22.0 이상이 필요합니다.

파일 크기로 필터링#

Git에 대용량 바이너리 파일을 저장하는 것은 일반적으로 권장되지 않습니다. 추가된 모든 대용량 파일은 이후에 변경 사항을 복제하거나 가져오는 모든 사람이 다운로드하기 때문입니다. 이러한 다운로드는 느리고 문제가 있으며 특히 느리거나 불안정한 인터넷 연결로 작업할 때 문제가 됩니다.

파일 크기 필터와 함께 부분 복제를 사용하면 복제 및 가져오기에서 문제가 있는 대용량 파일을 제외하여 이 문제를 해결합니다. Git이 누락된 파일을 만나면 요청 시 다운로드됩니다.

저장소를 복제할 때 --filter=blob:limit=<size> 인수를 사용합니다. 예를 들어, 1메가바이트보다 큰 파일을 제외하고 저장소를 복제하려면:

git clone --filter=blob:limit=1m git@gitlab.com:gitlab-com/www-gitlab-com.git

다음 출력이 생성됩니다:

Cloning into 'www-gitlab-com'...
remote: Enumerating objects: 832467, done.
remote: Counting objects: 100% (832467/832467), done.
remote: Compressing objects: 100% (207226/207226), done.
remote: Total 832467 (delta 585563), reused 826624 (delta 580099), pack-reused 0
Receiving objects: 100% (832467/832467), 2.34 GiB | 5.05 MiB/s, done.
Resolving deltas: 100% (585563/585563), done.
remote: Enumerating objects: 146, done.
remote: Counting objects: 100% (146/146), done.
remote: Compressing objects: 100% (138/138), done.
remote: Total 146 (delta 8), reused 144 (delta 8), pack-reused 0
Receiving objects: 100% (146/146), 471.45 MiB | 4.60 MiB/s, done.
Resolving deltas: 100% (8/8), done.
Updating files: 100% (13008/13008), done.
Filtering content: 100% (3/3), 131.24 MiB | 4.65 MiB/s, done.

Git이 다음 작업을 수행하므로 출력이 더 깁니다:

  1. 1메가바이트보다 큰 파일을 제외하고 저장소를 복제합니다.
  2. 기본 브랜치를 체크아웃하는 데 필요한 누락된 대용량 파일을 다운로드합니다.

브랜치를 변경할 때 Git이 더 많은 누락된 파일을 다운로드할 수 있습니다.

객체 유형으로 필터링#

수백만 개의 파일과 긴 히스토리가 있는 저장소의 경우 모든 파일을 제외하고 git sparse-checkout을 사용하여 작업 복사본의 크기를 줄일 수 있습니다.

# Clone the repo excluding all files
$ git clone --filter=blob:none --sparse git@gitlab.com:gitlab-com/www-gitlab-com.git
Cloning into 'www-gitlab-com'...
remote: Enumerating objects: 678296, done.
remote: Counting objects: 100% (678296/678296), done.
remote: Compressing objects: 100% (165915/165915), done.
remote: Total 678296 (delta 472342), reused 673292 (delta 467476), pack-reused 0
Receiving objects: 100% (678296/678296), 81.06 MiB | 5.74 MiB/s, done.
Resolving deltas: 100% (472342/472342), done.
remote: Enumerating objects: 28, done.
remote: Counting objects: 100% (28/28), done.
remote: Compressing objects: 100% (25/25), done.
remote: Total 28 (delta 0), reused 12 (delta 0), pack-reused 0
Receiving objects: 100% (28/28), 140.29 KiB | 341.00 KiB/s, done.
Updating files: 100% (28/28), done.

$ cd www-gitlab-com

$ git sparse-checkout set data --cone
remote: Enumerating objects: 301, done.
remote: Counting objects: 100% (301/301), done.
remote: Compressing objects: 100% (292/292), done.
remote: Total 301 (delta 16), reused 102 (delta 9), pack-reused 0
Receiving objects: 100% (301/301), 1.15 MiB | 608.00 KiB/s, done.
Resolving deltas: 100% (16/16), done.
Updating files: 100% (302/302), done.

자세한 내용은 sparse-checkout에 대한 Git 문서를 참조하세요.

파일 경로로 필터링#

부분 복제와 sparse checkout 간의 더 깊은 통합은 --filter=sparse:oid=<blob-ish> 필터 스펙을 통해 가능합니다. 이 필터링 모드는 .gitignore 파일과 유사한 형식을 사용하여 복제 및 가져오기 시 포함할 파일을 지정합니다.

Warning

sparse 필터를 사용하는 부분 복제는 아직 실험적입니다. 복제 및 가져오기 시 느릴 수 있고 Gitaly 리소스 사용률을 크게 증가시킬 수 있습니다. 대신 모든 블롭을 필터링하고 sparse-checkout 사용하세요. git-sparse-checkout이 이 유형의 부분 복제 사용을 단순화하고 제한을 극복하기 때문입니다.

자세한 내용은 rev-list-options에 대한 Git 문서를 참조하세요.

  1. 필터 스펙을 만듭니다. 예를 들어, 루트의 다양한 하위 디렉토리에 많은 애플리케이션이 있는 모놀리식 저장소를 생각해 보세요. shiny-app/.filterspec 파일을 만드세요:

    # Only the paths listed in the file will be downloaded when performing a
    # partial clone using `--filter=sparse:oid=shiny-app/.gitfilterspec`
    
    # Explicitly include filterspec needed to configure sparse checkout with
    # git config --local core.sparsecheckout true
    # git show master:snazzy-app/.gitfilterspec >> .git/info/sparse-checkout
    shiny-app/.gitfilterspec
    
    # Shiny App
    shiny-app/
    
    # Dependencies
    shimmery-app/
    shared-component-a/
    shared-component-b/
    
  2. 경로로 복제 및 필터링합니다. 복제 명령과 함께 --filter=sparse:oid를 지원하는 것은 sparse checkout과 완전히 통합되지 않습니다.

    # Clone the filtered set of objects using the filterspec stored on the
    # server. WARNING: this step may be very slow!
    git clone --sparse --filter=sparse:oid=master:shiny-app/.gitfilterspec <url>
    
    # Optional: Check for missing objects that have not been fetched
    git rev-list --all --quiet --objects --missing=print | wc -l
    

    [!warning] Git 상태 정보를 자동으로 표시하는 bash, Zsh 등과 편집기를 사용한 Git 통합은 종종 전체 저장소를 가져오는 git fetch를 실행합니다. 이러한 통합을 비활성화하거나 재구성해야 할 수 있습니다.

부분 복제 필터링 제거#

부분 복제 필터링이 있는 Git 저장소는 필터링을 제거할 수 있습니다. 필터링을 제거하려면:

  1. 저장소가 완전한지 확인하기 위해 필터로 제외된 모든 것을 가져옵니다. git sparse-checkout을 사용한 경우 git sparse-checkout disable을 사용하여 비활성화합니다. 자세한 내용은 disable 문서를 참조하세요.

    그런 다음 저장소가 완전한지 확인하기 위해 일반 fetch를 수행합니다. 특히 git sparse-checkout을 사용하지 않는 경우 누락된 객체를 가져올지 확인한 다음 가져오려면 다음 명령을 사용할 수 있습니다:

    # Show missing objects
    git rev-list --objects --all --missing=print | grep -e '^\?'
    
    # Show missing objects without a '?' character before them (needs GNU grep)
    git rev-list --objects --all --missing=print | grep -oP '^\?\K\w+'
    
    # Fetch missing objects
    git fetch origin $(git rev-list --objects --all --missing=print | grep -oP '^\?\K\w+')
    
    # Show number of missing objects
    git rev-list --objects --all --missing=print | grep -e '^\?' | wc -l
    
  2. 모든 것을 다시 팩합니다. 예를 들어 git repack -a -d를 사용하여 수행할 수 있습니다. 이렇게 하면 .git/objects/pack/에 세 개의 파일만 남아야 합니다:

    • pack-.pack 파일.
    • 해당하는 pack-.idx 파일.
    • pack-.promisor 파일.
  3. .promisor 파일을 삭제합니다. 이전 단계에서 비어 있어야 하는 pack-.promisor 파일 하나만 남아 있어야 하며 삭제해야 합니다.

  4. 부분 복제 구성을 제거합니다. 부분 복제 관련 구성 변수는 Git 구성 파일에서 제거해야 합니다. 일반적으로 다음 구성만 제거하면 됩니다:

    • remote.origin.promisor.
    • remote.origin.partialclonefilter.