Git 저장소를 로컬 컴퓨터로 클론하기

저장소를 클론하면 서버와 연결이 생성되고 원격 저장소의 파일이 컴퓨터로 다운로드됩니다.

이 연결은 자격 증명을 추가해야 합니다. SSH 또는 HTTPS를 사용할 수 있습니다. SSH를 권장합니다.

SSH로 클론하기

한 번만 인증하고 싶을 때 SSH로 클론하세요.

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

  2. 왼쪽 사이드바에서 검색 또는 이동을 선택하고 클론하고 싶은 프로젝트를 찾습니다.

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

  4. 터미널을 열고 파일을 클론할 디렉터리로 이동합니다.
    Git은 자동으로 저장소 이름으로 폴더를 생성하고 그곳에 파일을 다운로드합니다.

  5. 다음 명령어를 실행합니다:

    git clone <복사한 URL>
    
  6. 파일을 보려면 새로운 디렉터리로 이동합니다:

    cd <새 디렉터리>
    

HTTPS로 클론하기

컴퓨터와 GitLab 간의 작업을 수행할 때마다 인증하고 싶을 때 HTTPS로 클론하세요.
OAuth 자격 증명 도우미
귀하가 수동으로 인증해야 하는 횟수를 줄여주어 HTTPS를 원활한 경험으로 만듭니다.

  1. 왼쪽 사이드바에서 검색 또는 이동을 선택하고 클론하고 싶은 프로젝트를 찾습니다.

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

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

  4. 다음 명령어를 실행합니다. Git은 자동으로 저장소 이름으로 폴더를 생성하고 그곳에 파일을 다운로드합니다.

    git clone <복사한 URL>
    
  5. GitLab이 사용자 이름과 비밀번호를 요청합니다.

    계정에서 이중 인증(2FA)을 활성화한 경우, 계정 비밀번호를 사용할 수 없습니다. 대신 다음 중 하나를 수행할 수 있습니다:

    2FA를 활성화하지 않은 경우, 계정 비밀번호를 사용하세요.

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

    cd <새 디렉터리>
    

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

토큰을 사용하여 클론하기

다음과 같은 경우 HTTPS로 클론할 때 토큰을 사용하세요:

  • 2FA를 사용하고 싶을 때.
  • 하나 이상의 저장소에 범위가 있는 철회 가능한 자격 증명 세트를 원할 때.

HTTPS를 통해 클론할 때 인증하는 데 사용할 수 있는 토큰은 다음과 같습니다:

예를 들어:

git clone https://<사용자 이름>:<토큰>@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로 클론할 수 있지만, VS Code용 GitLab Workflow 확장을 설치하여 Visual Studio Code에서 클론할 수도 있습니다:

  • GitLab 인터페이스에서:
    1. 프로젝트 개요 페이지로 이동합니다.
    2. 오른쪽 상단 모서리에서 Code를 선택합니다.
    3. Open in your 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. Open in your IDE에서 IntelliJ IDEA (SSH) 또는 IntelliJ IDEA (HTTPS)를 선택합니다.

클론 크기 줄이기

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를 사용하여 작업 복사본의 크기를 줄일 수 있습니다.

# 모든 파일을 제외하고 리포지토리 클론하기
$ git clone --filter=blob:none --sparse git@gitlab.com:gitlab-com/www-gitlab-com.git
'www-gitlab-com'로 복제 중...
원격: 객체 수 세기: 678296, 완료.
원격: 객체 수 세기: 100% (678296/678296), 완료.
원격: 객체 압축: 100% (165915/165915), 완료.
원격: 총 678296 (델타 472342), 재사용 673292 (델타 467476), 패키지 재사용 0
객체 수신 중: 100% (678296/678296), 81.06 MiB | 5.74 MiB/s, 완료.
델타 해결 중: 100% (472342/472342), 완료.
원격: 객체 수 세기: 28, 완료.
원격: 객체 수 세기: 100% (28/28), 완료.
원격: 객체 압축: 100% (25/25), 완료.
원격: 총 28 (델타 0), 재사용 12 (델타 0), 패키지 재사용 0
객체 수신 중: 100% (28/28), 140.29 KiB | 341.00 KiB/s, 완료.
파일 업데이트 중: 100% (28/28), 완료.

$ cd www-gitlab-com

$ git sparse-checkout set data --cone
원격: 객체 수 세기: 301, 완료.
원격: 객체 수 세기: 100% (301/301), 완료.
원격: 객체 압축: 100% (292/292), 완료.
원격: 총 301 (델타 16), 재사용 102 (델타 9), 패키지 재사용 0
객체 수신 중: 100% (301/301), 1.15 MiB | 608.00 KiB/s, 완료.
델타 해결 중: 100% (16/16), 완료.
파일 업데이트 중: 100% (302/302), 완료.

더 많은 세부사항은 sparse-checkout에 대한 Git 문서를 참조하세요.

파일 경로별 필터링

부분 클론과 스패스 체크아웃 간의 더 깊은 통합은 --filter=sparse:oid=<blob-ish> 필터 사양을 통해 가능합니다. 이 필터링 모드는 클론 및 페치할 때 포함할 파일을 지정하기 위해 .gitignore 파일과 유사한 형식을 사용합니다.

경고:
sparse 필터를 사용하는 부분 클론은 여전히 실험적입니다. 이것은 느릴 수 있으며 클론 및 페치할 때 Gitaly 리소스 활용도를 크게 증가시킬 수 있습니다. 대신 모든 블롭 필터링 및 스패스 체크아웃 사용하세요. git-sparse-checkout는 이러한 유형의 부분 클론 사용을 간소화하고 그 한계를 극복합니다.

더 많은 세부사항은 rev-list-options에 대한 Git 문서를 참조하세요.

  1. 필터 사양을 만듭니다. 예를 들어, 루트의 서로 다른 하위 디렉토리에 여러 애플리케이션이 있는 단일 리포지토리를 고려하십시오. 다음과 같은 파일 shiny-app/.filterspec을 만듭니다:

    # 파일에 나열된 경로만 다운로드됩니다.
    # --filter=sparse:oid=shiny-app/.gitfilterspec를 사용하여 부분 클론을 수행할 때
    
    # 스패스 체크아웃을 구성하는 데 필요한 필터 사양 포함
    # git config --local core.sparsecheckout true
    # git show master:snazzy-app/.gitfilterspec >> .git/info/sparse-checkout
    shiny-app/.gitfilterspec
    
    # Shiny App
    shiny-app/
    
    # 의존성
    shimmery-app/
    shared-component-a/
    shared-component-b/
    
  2. 경로로 필터링하고 클론합니다. --filter=sparse:oid에 대한 지원은 클론 명령과 완전히 통합되어 있지 않습니다.

    # 서버에 저장된 필터 사양을 사용하여 필터링된 객체 세트를 클론합니다. 경고: 이 단계는 매우 느릴 수 있습니다!
    git clone --sparse --filter=sparse:oid=master:shiny-app/.gitfilterspec <url>
    
    # 선택 사항: 페치하지 않은 객체가 누락되었음을 관찰합니다.
    git rev-list --all --quiet --objects --missing=print | wc -l
    

    경고:
    bash, Zsh 등과 같은 Git 통합 및 자동으로 Git 상태 정보를 표시하는 편집기는 종종 전체 리포지토리를 페치하는 git fetch를 실행합니다. 이러한 통합을 비활성화하거나 재구성해야 할 수 있습니다.

부분 클론 필터링 제거

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

  1. 필터에 의해 제외된 모든 항목을 가져와서 저장소가 완전한지 확인합니다. git sparse-checkout이 사용되었다면, 이를 비활성화하기 위해 git sparse-checkout disable을 사용하세요. 더 많은 정보는 disable 문서를 참조하세요.

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

    # 누락된 객체 표시
    git rev-list --objects --all --missing=print | grep -e '^\?'
    
    # '?' 문자 없이 누락된 객체 표시 (GNU grep 필요)
    git rev-list --objects --all --missing=print | grep -oP '^\?\K\w+'
    
    # 누락된 객체 가져오기
    git fetch origin $(git rev-list --objects --all --missing=print | grep -oP '^\?\K\w+')
    
    # 누락된 객체 수 표시
    git rev-list --objects --all --missing=print | grep -e '^\?' | wc -l
    
  2. 모든 것을 재팩킹합니다. 예를 들어 git repack -a -d를 사용하여 수행할 수 있습니다. 이 작업을 수행하면 .git/objects/pack/에 다음 세 파일만 남아야 합니다:
    • pack-<SHA1>.pack 파일.
    • 해당하는 pack-<SHA1>.idx 파일.
    • pack-<SHA1>.promisor 파일.
  3. .promisor 파일을 삭제합니다. 위의 단계에서는 단 하나의 pack-<SHA1>.promisor 파일만 남아 있어야 하며, 이 파일은 비어 있어야 하고 삭제해야 합니다.

  4. 부분 클론 구성을 제거합니다. 부분 클론 관련 구성 변수가 Git 구성 파일에서 제거되어야 합니다. 일반적으로 다음 구성만 제거해야 합니다:
    • remote.origin.promisor.
    • remote.origin.partialclonefilter.