LainyZine: 프로그래머 가이드 🐣

git clone 사용법: 원격 Git 저장소 복제

Git은 분산형 버전 관리 도구로, Linux 커널 소스코드를 관리하기 위해서 Linus Torvalds가 개발했습니다. Git으로 소스 코드를 관리하고 개발을 하려면 먼저 저장소를 초기화하거나 원격 저장소를 클론해와야합니다. 저장소를 초기화하는 방법은 아래 글에서 소개합니다.

이미 초기화된 원격의 저장소를 복제해와서 개발하는 경우, 복제 작업을 Git에서는 클론(clone)이라고 부르며 git clone 서브 명령어로 구현되어있습니다. 이번 글에서는 git clone 명령어의 사용법에 대해서 자세히 소개합니다.

git clone 명령어 기초와 GitHub 저장소 복제

혼자서 개발하는 경우에는 로컬에서 Git 저장소를 초기화해서 사용하면 됩니다만, 협업을 하는 경우나 인터넷에 소스 코드를 공개하는 경우 GitHub에 저장소를 만들고 이 저장소를 클론해서 작업하는 방식을 주로 사용합니다. GitHub 계정이 있는 경우 아래 페이지에서 저장소를 생성할 수 있습니다.

적절한 이름을 붙여서 저장소를 생성하면 아래와 같은 안내 페이지로 이동합니다. 여기서는 README.md 파일을 자동 생성하는 옵션에 체크하였습니다. README.md 파일 하나만 있는 저장소가 만들어졌습니다.

비어있는 lainyzine/git-clone 저장소

클론을 하려면 Git 저장소의 주소를 알아야합니다. 화면에서 Code 버튼을 클릭하면 Git 저장소 주소가 나타납니다. Git 저장소의 주소는 HTTPS와 SSH 방식으로 제공되며 다음과 같은 형식을 따릅니다. (메뉴에서 알 수 있지만, ZIP 압축 파일로 다운로드 받을 수도 있습니다.)

HTTPS와 SSH 형식의 GitHub 저장소 주소는 아래와 같습니다.

# HTTPS 형식
https://github.com/[USERNAME]/[REPOSITORY_NAME].git

# SSH 형식
git@github.com:[USERNAME]/[REPOSITORY_NAME].git

[USERNAME]은 GitHub 사용자 이름으로, [REPOSITORY_NAME]은 저장소를 생성할 때 지정한 저장소 이름이됩니다. 따라서 lainyzine/git-clone의 저장소 주소는 다음과 같습니다.

# HTTPS 형식
https://github.com/lainyzine/git-clone.git

# SSH 형식
git@github.com:lainyzine/git-clone.git

git clone 명령어 형식

저장소를 복제해오기에 앞서 git clone 명령어의 기본적인 사용법을 소개합니다.

git clone [REPO_URL] [DIR]

[REPO_URL]에는 클론해올 저장소의 주소를 지정해줍니다. [DIR] 인자는 저장소를 로컬에 복제할 위치를 지정합니다. [DIR] 생략 가능하며, 특별한 이유가 없다면 보통 생략합니다.

HTTPS 프로토콜로 Git 저장소 clone

먼저 HTTPS 형식으로 git clone을 해보겠습니다. Windows에서는 Git과 함께 설치되는 git bash, macOS나 Linux에서는 터미널을 사용합니다. 적절한 디렉터리로 이동한 후에 다음 명령어를 실행해줍니다.

$ git clone https://github.com/lainyzine/git-clone.git
Cloning into 'git-clone'...
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), done.

저장소 복제가 성공적으로 진행되었습니다. 디렉터리에 들어가보면 Git 저장소를 관리하는 .git 디렉터리와 README.md 파일이 생성된 것을 확인할 수 있습니다.

$ cd git-clone
$ ls -al
total 8
drwxr-xr-x   4 lainyzine  staff  128 Apr 25 14:41 .
drwxr-xr-x   3 lainyzine  staff   96 Apr 25 14:41 ..
drwxr-xr-x  13 lainyzine  staff  416 Apr 25 14:42 .git
-rw-r--r--   1 lainyzine  staff   11 Apr 25 14:41 README.md

SSH 프로토콜로 Git 저장소 clone

GitHub에 SSH 키 셋업이 되어있다면, SSH 프로토콜을 통한 저장소 클론도 바로 가능합니다. 디렉터리 충돌이 날 수 있으므로 다른 디렉터리로 이동해서 다음 명령어를 실행해보세요.

$ git clone git@github.com:lainyzine/git-clone.git

퍼블릭 저장소의 별도의 인증없이 클론이 되어야합니다만, SSH 키가 제대로 셋업되어있지 않다면 문제가 될 수 있습니다. 이 경우는 ‘트러블 슈팅: Permission denied’ 절을 참고해주세요.

GitHub SSH 키 셋업하지 않았다면 아래 글을 참고해서, SSH 키를 셋업하고 SSH 프로토콜로 git clone을 테스트해보세요.

클론한 저장소의 원격 저장소 위치 확인하기

GitHub에서 저장소를 클론하면 origin remote에 GitHub 저장소 주소가 저장됩니다. 이후에는 저장소 주소를 지정하지 않더라도 origin이라는 이름으로 원격 저장소의 내용을 fetch해오거나, 로컬 변경사항을 push할 수 있습니다. git remote -v 명령어로 클론한 저장소의 remote 정보를 확인할 수 있습니다.

$ cd git-clone
$ git remote -v
origin  git@github.com:lainyzine/git-clone.git (fetch)
origin  git@github.com:lainyzine/git-clone.git (push)

origin 주소로 GitHub의 lainyzine/git-clone 저장소가 등록되어 있습니다.

GitHub에 있는 오픈소스 프로젝트 git clone하기

내가 만든 프로젝트가 아니더라도, 오픈소스 프로젝트들은 GitHub 퍼블릭 프로젝트로 관리하기 때문에 앞에서 저장소를 복제한 것과 마찬가지로 git clone 명령어를 사용하면 됩니다.

예를 들어 go 언어로 된 공식 이더리움 프로토콜 구현체인 ethereum/go-ethereum 프로젝트를 클론해보겠습니다. 먼저 저장소 페이지를 찾아가서 Code 버튼을 클릭합니다. 모든 GitHub의 프로젝트는 이 방식으로 클론하기 위한 주소를 복사할 수 있습니다.

이 주소를 복사해서 git clone을 실행해줍니다. 프로젝트가 큰 편이라 이번에는 시간이 좀 걸립니다.

$ git clone https://github.com/ethereum/go-ethereum.git
Cloning into 'go-ethereum'...
remote: Enumerating objects: 98377, done.
remote: Counting objects: 100% (266/266), done.
remote: Compressing objects: 100% (194/194), done.
remote: Total 98377 (delta 103), reused 149 (delta 71), pack-reused 98111
Receiving objects: 100% (98377/98377), 154.21 MiB | 22.04 MiB/s, done.
Resolving deltas: 100% (64158/64158), done.

저장소 디렉터리로 이동해서 ls를 실행해보면 저장소가 잘 복제되었습니다.

$ cd go-ethereum
$ ls
AUTHORS             contracts           log
COPYING             core                metrics
COPYING.LESSER      crypto
.....

다른 저장소들도 이 방식으로 클론해오는 것이 가능합니다. 단, 코드를 보거나 로컬에서 수정하는 것은 가능해도, 쓰기 권한은 없기 때문에 직접 Push를 하는 등의 작업은 불가능합니다. GitHub에서는 오픈소스에 기여를 하려면 저장소를 포크하고 포크한 저장소에서 PR을 올리는 방식을 사용합니다.

GitHub Private 프로젝트 git clone하기

이번에는 Private 프로젝트를 clone하는 방법에 대해서 알아보겠습니다. 테스트를 위해 git-clone-private 저장소를 생성해두었습니다. 저장소 이름 옆에 Private 딱지가 붙어있습니다. 다른 사용자에게 권한을 부여하지 않는 한 이 저장소는 저장소를 생성한 사용자만 접근할 수 있습니다.

이번에도 Code 버튼을 클린 저장소 주소를 복사할 수 있습니다. 상식적으로 생각해보면, Private 저장소를 그냥 git clone했을 때는 복제가 되지 않아야합니다. 정말 그렇게 동작할까요? 이 저장소를 먼저 HTTPS로 클론해봅니다.

$ git clone https://github.com/lainyzine/git-clone-private.git
Cloning into 'git-clone-private'...
Username for 'https://github.com': lainyzine
Password for 'https://lainyzine@github.com':
remote: Invalid username or password.
fatal: Authentication failed for 'https://github.com/lainyzine/git-clone-private.git/'

퍼블릭 저장소는 바로 클론이 되었는데, 프라이빗 저장소는 잘못된 패스워드를 입력하면 Authentication failed 에러를 내며 클론에 실패합니다. 그럼 이번에는 ID와 Password를 제대로 입력해봅니다.

$ git clone https://github.com/lainyzine/git-clone-private.git
Cloning into 'git-clone-private'...
Username for 'https://github.com': lainyzine
Password for 'https://lainyzine@github.com':
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), done.

정상적으로 클론이 되는 것을 알 수 있습니다. 이 글을 따라하시더라도 lainyzine/git-clone-private에 대한 권한이 없기 때문에 클론하실 수 없습니다. 직접 프라이빗 저장소를 만들어서 테스트해보시기 바랍니다.

SSH 프로토콜을 사용하면 사용자 인증 역할을 기본적으로 포함하고 있기 때문에 GitHub에 대한 추가 인증 없이도 저장소를 클론할 수 있습니다. 프라이빗 저장소 작업이 많다면 SSH 키 방식이 더 편리합니다.

$ git clone git@github.com:lainyzine/git-clone-private.git

팁과 트러블 슈팅

Git 저장소를 클론할 때 유용한 팁들과 발생할 수 있는 문제들에 대해서 알아봅니다.

팁: 특정 브랜치(태그)만 클론하기

원격의 저장소를 클론할 때 --branch-b 옵션을 사용하면 특정 프랜치나 태그의 내용만 클론하는 것이 가능합니다.

git clone --branch [TAG] [REPO_URL]

특정 브랜치나 태그만 클론 받아 소스코드 탐색을 하는 경우 편리하게 사용할 수 있습니다.

팁: 얕은 클론(shallow clone)

Git 저장소를 클론하는 작업은 단순히 소스 코드의 파일을 복사하는 것은 아닙니다. Git 저장소에는 소스코드의 편집이력이 모두 담겨있기 때문에 프로젝트가 커지고, 참여자가 많아지고, 역사가 길어질수록 Git 저장소는 무거워집니다. 빠르게 현재 코드 탐색을 하는 게 목적이라면 얕은 클론(shallow clone)을 사용하면 편리합니다. 얕은 클론을 하면 모든 변경 이력이 아닌, 최신 변경만이 반영된 소스 코드만을 복제해옵니다.

얕은 클론을 사용하려면 --depth=1 옵션을 지정해줍니다.

$ git clone --depth=1 [REPO_URL]

앞서 클론해본 ethereum/go-ethereum 저장소로 테스트를 해보겠습니다.

$ time git clone https://github.com/ethereum/go-ethereum.git full-clone
.....
5.17s user 1.51s system 66% cpu 10.109 total

$ time git clone --depth=1 https://github.com/ethereum/go-ethereum.git shallow-clone
.....
0.38s user 0.41s system 32% cpu 2.430 total

Git 저장소 클론 시간이 확연히 줄어들었습니다.

트러블 슈팅: not an empty directory

git clone은 비교적 간단하게 사용할 수 있는 명령어입니다만, 예상치 못 하게 클론에 실패하는 경우가 있습니다. 다음과 같이 실패한 경우를 생각해보겠습니다.

$ git clone https://github.com/lainyzine/git-clone.git
fatal: destination path 'git-clone' already exists and is not an empty directory.

메시지를 읽어보시면 git-clone 디렉터리가 이미 존재해서, git clone 명령어가 실패합니다. 이는 git clone 할 때 명령어가 자동적으로 저장소 이름([REPOSITIORY_NAME]) 디렉터리에 복제를 시도하기 때문입니다. 이 문제를 해결하려면 이미 존재하는 디렉터리를 삭제하거나, 다른 디렉터리로 클론을 하면 됩니다. 아래와 같이 마지막 인자에 다른 디렉터리를 지정해주면 해당 디렉터리에 클론이 이루어집니다.

# lainyzine/git-clone 저장소를 git-clone-2 디렉터리에 복제
$ git clone https://github.com/lainyzine/git-clone.git git-clone-2

트러블 슈팅: Permission denied

git clone을 시도할 때 저장소에 대한 적절한 권한이 없다면, 복제에 실패할 수 있습니다. 단, lainyzine/git-clone 저장소는 퍼블릭 접근이 가능하기 때문에 누구나 클론이 가능합니다. SSH 프로토콜을 사용할 때 로컬 환경설정이 잘못 되어있으면 클론이 실패할 수 있습니다.

$ git clone git@github.com:lainyzine/git-clone.git git
Cloning into 'git'...
git@github.com: Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

이 때는 다음 명령어로 SSH 키 설정이 제대로 되어있는지 확인해봅니다.

$ ssh -T git@github.com
Hi lainyzine! You've successfully authenticated, but GitHub does not provide shell access.

SSH 키 설정이 제대로 되어있다면 Hi, 다음에 자신의 GitHub ID가 출력되어야합니다. 기대한대로 동작하지 않는다면 SSH 키 설정을 확인하거나 키 등록부터 다시 시작해보시기 바랍니다. 단, 간단한 작업을 위한 거면 HTTPS 프로토콜을 사용해도 무방합니다.

추천 문서

LainyZine은 쿠팡 파트너스 활동에 따른 수수료를 제공받습니다.