사전 원격 저장소
개념

원격 저장소

gabury1

원격 저장소는 내 저장소 바깥에 따로 있는 같은 프로젝트의 저장소입니다. 여러 사람이 이 자리를 거쳐 서로의 작업을 주고받습니다. 내 저장소는 그 자리에 짧은 이름을 붙여 두고 그 이름으로 부릅니다.

상세

같이 여행을 다녀온 친구들이 각자 휴대폰에 그날 사진을 찍은 순서 그대로 담아 두고 있습니다. 만날 때마다 서로에게 없는 사진을 골라 보내 줍니다. 보내 줘도 내 휴대폰에서 그 사진이 없어지지 않습니다.

원격 저장소는 같은 프로젝트의 이력을 담은, 내 작업 사본 밖의 또 하나의 저장소입니다. 거기 놓이는 것은 파일의 현재 모습만이 아닙니다. 커밋과 브랜치처럼 이력을 이루는 것이 같이 들어갑니다. 그래서 저쪽에서 받아온 것에는 "누가 언제 무엇을 고쳤나" 가 붙어 옵니다. 받아오는 것은 옮기는 것이 아니라 복사하는 것입니다. 내가 받아왔다고 저쪽 저장소에서 그 이력이 없어지지 않습니다.

내 저장소는 상대의 주소를 적어 두고 거기에 짧은 이름을 붙입니다. 그 뒤로는 긴 주소 대신 그 이름을 부릅니다. 이름으로 부르는 동작은 두 방향입니다. 저쪽 이력을 받아오는 방향, 그리고 내 이력을 보내는 방향입니다. 같은 이름에 읽을 때 쓸 주소와 쓸 때 쓸 주소를 따로 매달아 둘 수도 있습니다.

상대는 하나로 정해져 있지 않습니다. 이름을 여러 개 붙여 두고 저장소 여럿을 상대할 수 있습니다.

배경

여럿이 한 프로젝트를 고치면 각자의 기계에 각자의 이력이 쌓입니다. 옆 사람이 무엇을 언제 왜 고쳤는지는 그 사람 기계 안에만 있습니다. 파일을 통째로 복사해 건네는 방법이 있습니다. 그러면 파일은 옮겨져도 이력은 따라오지 않습니다.

그래서 이력째로 주고받을 상대와, 그 상대를 가리킬 주소가 필요해졌습니다. 버전관리를 중앙집중 방식으로 짜면 이 자리가 애초에 하나로 정해집니다. 저장소는 서버에만 있습니다. 각자는 거기서 작업 사본만 받아 씁니다. 이때는 "원격" 이라고 따로 부를 것도 없습니다. 저장소는 원래 저 멀리 하나뿐입니다.

분산 방식은 이 전제를 뒤집었습니다. 각자가 이력을 다 갖춘 저장소를 하나씩 들고 있습니다. 그러면 어느 쪽이 본체인지가 도구의 규칙으로는 정해지지 않습니다. 남는 구분은 "내가 지금 작업하는 저장소" 와 "내 저장소가 상대하는 저쪽 저장소" 뿐입니다. 그 저쪽 자리를 부르는 이름이 원격 저장소입니다.

flowchart TD
    subgraph C["중앙집중 방식"]
        S["저장소"] --- W1["작업 사본"]
        S --- W2["작업 사본"]
    end
    subgraph D["분산 방식"]
        R1["저장소"] <--> R2["저장소"]
    end

중앙집중 방식에서는 저장소가 하나이고 손에 남는 것은 작업 사본입니다. 분산 방식에서는 저장소끼리 마주 봅니다. 그 마주 보는 상대가 원격 저장소입니다.

예시

Git

복제해 온 저장소에는 origin 이라는 이름이 자동으로 붙습니다. -v 를 붙이면 그 이름에 묶인 주소가 같이 나옵니다. 읽을 때 쓰는 주소와 쓸 때 쓰는 주소가 따로 적힙니다.

터미널
$ git remote
origin
$ git remote -v
origin	https://github.com/schacon/ticgit (fetch)
origin	https://github.com/schacon/ticgit (push)

원격은 하나가 아니어도 됩니다. git remote add <shortname> <url> 로 이름을 더 붙입니다.

터미널
$ git remote add pb https://github.com/paulboone/ticgit
$ git remote -v
origin	https://github.com/schacon/ticgit (fetch)
origin	https://github.com/schacon/ticgit (push)
pb	https://github.com/paulboone/ticgit (fetch)
pb	https://github.com/paulboone/ticgit (push)

등록한 이름으로 받아오면 저쪽 브랜치가 그 이름 아래로 들어옵니다. 공식 문서의 예에서는 staging 이라는 이름을 붙인 뒤 그 이름으로 받아옵니다.

터미널
$ git remote add staging git://git.kernel.org/.../gregkh/staging.git
$ git fetch staging
From git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging
 * [new branch]      master     -> staging/master
 * [new branch]      staging-linus -> staging/staging-linus
 * [new branch]      staging-next -> staging/staging-next

받아온 뒤 git branch -r 에는 origin/master 옆에 staging/master 가 같이 보입니다. 붙인 이름이 저쪽 브랜치를 담는 칸 이름이 되는 셈입니다.

Mercurial

설정 파일의 [paths] 절에 이름과 자리를 적습니다. 자리에는 주소도 디렉터리도 들어갑니다.

[paths]
my_server = https://example.com/my_repo
local_path = /home/me/repo

이렇게 적어 두면 hg pull my_server 로 받아오고 hg push local_path 로 보냅니다. default 는 특별한 이름입니다. 원본이나 상대를 지정하지 않고 명령을 쳤을 때 쓰이는 자리입니다. 복제하면 복제해 온 자리로 이 이름이 자동으로 채워집니다.

Subversion

저장소의 한 부분을 체크아웃하면 그 프로젝트의 작업 사본이 생깁니다. 아래는 주소를 직접 적어 체크아웃한 결과입니다.

터미널
$ svn checkout http://svn.example.com/repos/calc
A    calc/Makefile
A    calc/integer.c
A    calc/button.c
Checked out revision 56.

왼쪽 여백의 A 는 항목이 작업 사본에 더해지고 있다는 표시입니다. 손에 남는 것은 저장소의 /calc 디렉터리에 대한 개인 작업 사본입니다. 거기에 .svn 이 하나 더 생겨 Subversion 이 쓸 추가 정보를 담습니다.

Maven

버전관리 밖에서도 같은 말을 씁니다. Maven 은 저장소를 정확히 두 종류로 가릅니다. 로컬 저장소는 Maven 이 도는 컴퓨터 안의 디렉터리입니다. 원격 저장소는 그 밖의 모든 저장소입니다. file:// 이나 HTTPS(HyperText Transfer Protocol Secure)의 https:// 같은 여러 프로토콜로 접근합니다. 남이 차려 두고 자기 아티팩트를 내려받게 해 주는 저장소일 수도 있습니다. 회사 안의 파일 서버나 HTTP(HyperText Transfer Protocol) 서버에 올려 둔 사내 저장소일 수도 있습니다.

경계

같은 기계 안의 디렉터리 경로를 원격으로 등록하면 그것도 원격 저장소인가. 맞습니다.

Git 공식 문서는 원격 저장소가 내 기계 위에 있을 수 있다고 적습니다. "원격" 이라는 말이 그 저장소가 네트워크나 인터넷 저편에 있다는 뜻을 반드시 담지는 않습니다. 다른 자리에 있다는 뜻일 뿐입니다. 그런 저장소를 상대로도 푸시 · 풀 · 페치는 그대로 합니다.

주소 형식 목록에도 로컬 경로가 정식 항목으로 들어 있습니다.

/path/to/repo.git/
file:///path/to/repo.git/

두 형식은 대체로 같습니다. 앞의 것은 --local 옵션을 함께 준 것으로 칩니다. Mercurial 쪽도 같습니다. 이름에 매다는 자리로 주소와 디렉터리를 나란히 허용합니다.

그러니 가르는 선은 거리가 아니라 자리입니다. 내 작업 사본 밖에 따로 있는 저장소이면 원격 저장소입니다.

관련 항목

저장소를 상대로 하는 동작

복제 · 체크아웃 · 페치 · 풀 · 푸시 · 미러

원격을 가리키는 이름

origin · 업스트림 · 원격 추적 브랜치

원격 저장소를 이루는 구성 요소

커밋 · 브랜치 · 참조 · 서브모듈 · 아티팩트

원격 저장소와 헷갈리는 이웃

작업 사본 · 로컬 저장소 · 중앙 저장소 · 호스팅 서비스 · 베어 저장소

원격 저장소에 접근하는 전송 프로토콜

SSH(Secure Shell) · HTTPS · HTTP · 스마트 프로토콜

원격 저장소가 속하는 상위 분류

저장소 · 버전관리 · 분산 버전관리

원격 저장소를 바탕으로 하는 협업 방식

포크 · 풀 리퀘스트 · 통합 관리자 워크플로 · 트렁크 기반 개발

다른 이름: remote repository · 리모트