깃허브 서버 구축 - gisheobeu seobeo guchug

Git 서버 구축하기

깃허브 서버 구축 - gisheobeu seobeo guchug

Git은 오늘날 가장 일반적으로 사용되는 버전 제어 시스템으로, 빠른 속도로 버전 제어 표준으로 자리잡고 있습니다. Git은 기본적으로 분산 버전 제어 시스템 형태를 지닙니다. 즉, 코드의 로컬 사본은 완전한 버전 제어 리포지토리(Repository)에 해당합니다. 이러한 모든 기능의 로컬 리포지토리 덕분에 오프라인으로 또는 원격으로 쉽게 작업할 수 있습니다. 작업한 파일들을 로컬로 커밋한 다음 리포지토리 복사본을 서버의 사본과 동기화합니다. 이 패러다임은 클라이언트가 코드의 새 버전을 만들기 전에 서버와 코드를 동기화해야 하는 기존의 중앙 집중식 버전 제어와는 다릅니다.

물론 아직까지도 기존의 SVN(Subversion)과 같은 중앙 집중식 버전 제어를 사용하는 개발자나 조직들이 많은 편입니다. 하지만 점차적으로 Git 패러다임을 도입하려는 움직임은 분명 많아지고 있습니다. 그렇다면 왜 Git을 도입하려는 것인지 아래의 질문을 통해 알아봅니다.

Git이 SVN 대비 가지는 장점은 무엇인가?
왜 많은 조직들이 SVN에서 Git으로 옮기려고 하는가?

처음에 Git을 단순히 사용하기만 할 때에는 위 질문들에 명확히 답할 수 없었습니다. 그도 그럴 것이 Git 리포지토리를 중앙 집중식으로 운영해서 마치 SVN을 사용할 때와 똑같이 운영했었기 때문입니다. 이렇게만 사용하면 사실 Git은 SVN 대비 장점을 가지기 힘듭니다. 게다가 Git은 개념적으로 SVN보다 어렵습니다. 많은 조직들이 여전히 SVN같은 중앙 집중식 소스 관리를 하는 이유는 바로 개념적으로 쉽고 직관적이기 때문입니다.

그런데 많은 오픈소스 프로젝트들이 Git을 사용하고 있고, 소위 잘나가는 개발사들은 서둘러 Git을 기반으로 한 소스 제어를 사용합니다. 거기에는 나름의 이유가 있고, 그 이유를 정확히 알아야 우리가 각 프로젝트에 최적인 방법으로 소스를 운영할 수 있습니다. 우리가 원하는 것은 결국 소스를 최신으로 유지하면서도 개발자들이 원하는대로 원하는 순간에 수정할 수 있는 방법을 찾는 것이고, 이를 달성하기 위해서는 분산 관리 방식의 장점을 정확히 이해하는 것부터 시작해야 할 것입니다.

SVN으로 작업할 때에는 소스를 중앙 저장소에 커밋(commit)하기 전에 대부분의 기능을 완성해놓고 커밋하는 경우가 많습니다. 왜냐 하면 커밋을 한다는 행위 자체가 중앙 저장소에 내가 만든 기능을 공개한다는 뜻이기 때문입니다. 그래서 개발자가 자신만의 버전 이력(version history)을 가질 수 없고, 커밋한 내용에 실수가 있게 되면 다른 개발자에게 바로 영향을 미치게 됩니다. 물론 브랜치(branch)를 별도로 구성하여 관리하는 방법도 있지만, 수백명의 개발자의 브랜치를 따로 만들어주고 관리하는 것은 굉장히 어렵습니다.

반면, Git에서는 개발자가 자신만의 커밋 이력(commit history)을 가질 수 있고, 개발자와 서버의 저장소는 독립적으로 관리가 가능합니다. 여기서 독립적으로 관리한다는 말은 개발자의 커밋이 바로 서버에 영향을 미치지 않는다는 것입니다. 개발자는 마음대로 커밋하다가 자신이 원하는 순간에 서버에 커밋 이력을 보낼 수 있으며, 서버의 통합 관리자는 관리자가 원하는 순간에 각 개발자의 커밋 히스토리를 가져올 수 있습니다.

통합 관리자가 각 개발자의 커밋 이력을 가져온다는 것은, 각 개발자가 완성한 커밋 이력에 대해서 통합 관리자가 차후에 아무때나 가져와 적용할 수 있다는 뜻입니다. 통합 관리자가 각 개발자의 커밋 이력을 가져오기 전에 이미 각 개발자는 자신의 저장소와 서버의 저장소 간 통합을 마친 상태이므로 통합 관리자는 별다른 어려움 없이 커밋 이력을 가져올 수 있습니다. 여기서 별다른 어려움이 없다는 말은 병합 충돌(merge conflicts)이 일어나지 않는다는 말입니다. 다른 말로 빨리감기 병합(fast-forward merge)이라고 합니다.

깃허브 서버 구축 - gisheobeu seobeo guchug

이렇게 Git은 서버 저장소와 개발자 저장소가 독립적으로 커밋 이력을 가져갈 수 있기 때문에 매우 유연한 방식으로 소스를 운영할 수 있으며, 이러한 유연성이 Git의 가장 큰 장점입니다. 이 유연성을 바탕으로 바로 우리의 목적인 "소스를 최신으로 유지하면서도 개발자들이 원하는 때에 원하는 만큼 수정할 수 있는 방법"을 달성할 수 있는 것입니다.

따라서 SVN과 다르게 Git은 굉장히 다양한 방식으로 소스를 관리할 수 있으며, 오픈소스 프로젝트에서 많이 사용하는 방법들에는 다음과 같은 것들이 있습니다. (링크를 방문하면 보다 더 자세히 볼 수 있습니다.)

Git 서버쪽(Remote) 설치 및 설정

Git 서버쪽 설치

CentOS 7.4 기준으로 설명합니다. 먼저 패키지 관리자인 yum의 저장소 정보를 업데이트 해줍니다.

[root@localhost ~]# yum update <엔터>

그리고, Git 패키지 검색 후 설치를 시작합니다. 이미 설치가 된 상태이더라도 그 사이 버전업이 되었을 수도 있으니 무조건 설치를 시도합니다.

[root@localhost ~]# yum list git <엔터>
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
Execluding mirror: data.nicehosting.co.kr
 * base: ftp.daumkakao.com
 * epel: mirror.dmmlabs.jp
. . . . .
Available Packages
git.x86_64                                      1.8.3.1-12.el7_4

[root@localhost ~]# yum install -y git <엔터>
. . . . .
Package git-1.8.3.1-12.el7_4.x86_64 already installed and latest version
Nothing to do

위에서 Available Packages로 나올 경우, 신규로 설치해야 한다는 뜻입니다. Installed Packages로 나올 경우, 이미 Git이 서버에 설치되어 있다는 뜻입니다. 이 경우에는 맨 하단에 '이미 설치가 되어있다. 아무것도 할 것이 없다'라는 문구가 출력됩니다.

Git 서버쪽 설정

Git의 설치가 끝나면 Git을 위한 CentOS 신규 계정을 생성합니다. 여기서는 git 이름의 계정을 생성합니다.

[root@localhost ~]# useradd -d /home/git git <엔터> => 계정생성, 홈디렉토리 연결
[root@localhost ~]# passwd git <엔터> => 계정의 암호를 설정
Changing password for user git
New password: 비밀번호 입력 <엔터>
Retype new password: 비밀번호 입력 <엔터>
passwd: all authentication tokens updated successfully.

이제 생성한 git 계정으로 로그인하고, Git  저장소 전용 디렉토리를 생성합니다. 그 다음 생성한 디렉토리를 Git에서 저장소(repository)로 사용할 수 있도록 초기화를 시켜줍니다. 여기서는 다음과 같은 저장소를 만든다고 가정합니다.

대표 프로젝트명

하위 프로젝트명

실제 경로

마이 프로젝트

마이 웹사이트(PHP+CI)

/home/git/repos-myproject/mywebsite.git

마이 강의실(Node.js)

/home/git/repos-myproject/mylecture.git

위의 내용을 기준으로 다음과 같이 작업합니다.

[root@localhost ~]# su - git <엔터>
[git@localhost ~]$ mkdir repos-myproject <엔터>
[git@localhost ~]$ cd repos-myproject <엔터>
[git@localhost repos-myproject]$ git init --bare mywebsite.git <엔터>
Initialized empty Git repository in /home/git/repos-myproject/mywebsite.git/
[git@localhost repos-myproject]$ git init --bare mylecture.git <엔터>
Initialized empty Git repository in /home/git/repos-myproject/mylecture.git/
[git@localhost repos-myproject]$ ll <엔터>
total 8
drwxrwxr-x 7 git git 4096 Feb  7 15:33 mylecture.git<== 마이 강의실 저장소
drwxrwxr-x 7 git git 4096 Feb  7 15:33
mywebsite.git <== 마이 웹사이트저장소

Git 저장소의 종류

Git 저장소(repository)에는 bare-repository와 nonbare-repository 두 종류가 있습니다. 여기서 bare는 '벌거벗다'라는 뜻인데, 아래와 같은 차이가 있습니다.

bare-repository
실제 프로젝트 리소스 파일(디렉토리 및 *.php, *.html, *.js, *.css, *.jpg 등)이 아닌 추가/수정/삭제 및 작업의 추가 코멘트 등의 변경 이력(history)만 저장되는 저장소를 말합니다. 주로 Git의 원격(remote) 저장소에서 사용합니다. bare-repository를 신규로 만드는 명령어는 다음과 같습니다.
[git@localhost ~]$ git init --bare 저장소명.git

nonbare-repository
실제 프로젝트 리소스 파일들이 그대로 저장되는 저장소를 말합니다. 주로 Git의 로컬(local) 저장소에서 사용합니다. 다시 말해, 개발자의 작업PC의 디스크 공간이 대상이 되며, 개발자는 이 공간에서 직접 파일을 추가, 수정 및 삭제 등을 할 수 있습니다(아니면 다른 위치에서 편집한 파일들을 덮어쓰기 해도 됨). nonbare-repository는 별도의 명령어 옵션이 있는 것은 아니고, 원격 저장소에서 로컬로 복제본(clone)을 다운로드 받으면 바로 nonbare-repository가 됩니다.

위에서 신규로 추가한 git 계정은 오직 Git 저장소를 관리하는 목적으로만 사용되어야 하므로, 사용자 계정마다 자동으로 지정되는 bash-shell에서 git 명령어만 사용할 수 있게 해주는 git-shell로 바꿔주면 됩니다. root 권한으로 다음과 같이 몇 가지 작업을 해줍니다.

git-shell 위치 알아내기
[root@localhost ~]# which git-shell <엔터>
/usr/bin/git-shell<= 이 경로를 복사하여 기억해둡니다.

git-shell 활성화를 위한 디렉토리 생성하기
[root@localhost ~]# cd /home/git <엔터>
[root@localhost git]# mkdir git-shell-commands <엔터>
[root@localhost git]# chown git:git /home/git/git-shell-commands <엔터>

git 계정이 bash-shell이 아닌 git-shell만 쓰도록 설정하기
[root@localhost git]# vi /etc/passwd <엔터>

root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
.....
git:x:1001:1003::/home/git:/bin/bash

위의 git 계정의 맨 마지막 줄을 아래와 같이 변경하고 저장합니다.

git:x:1001:1003::/home/git:/usr/bin/git-shell

이제 git 계정이 정상적으로 git-shell만 사용하게 되었는지 체크해봅니다.

[root@localhost ~]# su - git <엔터> <= git 계정으로 로그인
Last login: Web Feb  7 16:53:40 KST 2018 on pts/2
git>exit <엔터>
[root@localhost ~]# _

'git>' 과 같은 git 전용 프롬프트가 나오면 정상적으로 설정된 것입니다. exit를 입력하여 빠져나옵시다.

Git 클라이언트쪽(local) 설치 및 설정

Git 클라이언트라 함은 개발자가 사용하는 작업용 데스크톱PC 위치(로컬)를 말합니다. Git 클라이언트는 Git 서버와 다르게 설치 및 설정 과정이 조금 복잡합니다. Git 클라이언트 환경에서는 다음과 같은 윈도우용 소프트웨어를 설치해야 합니다.

SourceTree
미국에 본사를 두고 있는 Atlassian(아틀라시안)이라는 회사에서 만든 무료 Git 클라이언트 소프트웨어입니다. 내부적으로 Mercurial(머큐리얼)의 TortoiseHg 및 PuTTY 도구들과 연동하여 Git을 GUI 방식으로 관리합니다.

SourceTree 설치하기

아래의 공식 웹사이트를 방문합니다.

깃허브 서버 구축 - gisheobeu seobeo guchug

그리고 [Download for Windows] 버튼을 클릭하면 곧바로 SourceTree 설치파일을 다운로드할 수 있습니다.

이제 다운로드한 SourceTreeSetup-2.4.7.0.exe(버전은 추후 변경될 수 있음) 파일을 더블클릭하여 설치를 시작합니다.

SourceTree는 .NET Framework 기반으로 개발된 소프트웨어이므로, 간혹 아래와 같은 웹페이지가 뜰 수도 있습니다. 이럴땐 .NET Framework를 다운로드하여 미리 설치해줍니다.

깃허브 서버 구축 - gisheobeu seobeo guchug

.NET Framework 설치를 마치면 재부팅하라고 나올 수도 있습니다. 한 번 재부팅을 해줍니다.

깃허브 서버 구축 - gisheobeu seobeo guchug

[동의합니다]를 체크하고 [계속] 버튼을 클릭합니다.

깃허브 서버 구축 - gisheobeu seobeo guchug

[My Atlassian으로 가기] 눌러서 계정을 새로 만들어도 되지만, Google Play Store 계정이 있다면 [기존 계정 사용]을 눌러서 구글계정으로 로그인해도 됩니다. (본인의 자유) 저는 그냥 [My Atlassian으로 가기]를 눌러서 계정을 신규로 생성하였습니다.

깃허브 서버 구축 - gisheobeu seobeo guchug

여기서는 [설정 건너뛰기]를 눌러 설치를 진행합니다.

깃허브 서버 구축 - gisheobeu seobeo guchug

설치를 모두 마치면 [시작메뉴]에 위와 같이 SourceTree 메뉴가 추가된 것을 볼 수 있습니다.

개발자PC별 인증키 생성하기

Git 인증에 대해 알아봅시다.

깃허브 서버 구축 - gisheobeu seobeo guchug

위 그림은 Git 원격 저장소 서버에 SSH 방식으로 접속하기 위한 절차를 나타냅니다. 위와 같은 절차는 다음의 내용으로 인하여 필수적으로 거쳐야 하는 단계가 되었습니다.

서버에 SSH 방식으로 접속 시, 비밀번호를 물어보지 않게 하는 방법

RSA 인증(authentication) 키를 만들어, 비밀번호를 입력하지 않고 자신의 계정으로 원격 서버에 접속하는 방법이 있습니다. 일단 이렇게 설정한 후, 외부 해커들이 여러분의 계정/사이트에 침입한다면, 그들 역시 비밀번호 없이 그 사이트에 접근할 수 있게 된다는 것을 주의해야 합니다! 이런 이유로 root로 이 일을 하면 절대 안됩니다.

자신의 컴퓨터에서 ssh-keygen을 실행하고, 비밀번호를 물으면 그냥 엔터를 칩니다. 그러면 개인 키와 공개 키가 생성됩니다.
다음으로, 공개 키 파일의 내용은 원격 사이트의 ~/.ssh/authorized_keys에 추가합니다.

이제부터는 비밀번호를 묻지 않고 원격 서버에 SSH로 로그인할 수 있습니다.

중요: 개인 키 파일에 읽기 권한이 있는 모든 사람은 원격 서버에 비밀번호 없이 접근할 수 있습니다. 이것은 어떤 사람이 자신의 로컬PC에 root로 접근할 수 있다는 것을 뜻합니다. 따라서 자신이 유일한 root가 아니라면 자신의 개인 키를 위한 비밀번호를 반드시 사용할 것을 권합니다.

SourceTree의 내장 Git-Bash 터미널 환경 설정하기

CentOS와 같은 리눅스와 유사한 콘솔 환경에서 명령어 기반으로 Git 원격 서버에 직접 ssh로 접속하여 소스관리를 할 수 있도록 설정할 수 있으며, 다음과 같은 순서로 작업해줍니다.

먼저 SourceTrree를 실행합니다. 그리고 상단의 [액션(A)]-[터미널에서 열기] 메뉴를 선택합니다.

깃허브 서버 구축 - gisheobeu seobeo guchug

그러면 아래와 같이 SourceTree에 내장된 Git Bash 쉘(git-bash.exe) 창이 뜨게 됩니다.

깃허브 서버 구축 - gisheobeu seobeo guchug

C:\Users\<본인_윈도우_계정명>\AppData\Local\Atlassian\SourceTree\git_local\git-bash.exe 실행화면입니다. Git Bash는 리눅스 운영체제에서 자주 사용하는 Bash 쉘 명령어를 윈도우 환경에서도 동일하게 사용할 수 있도록 해주는 윈도우용 Bash 쉘입니다.

아래의 명령어를 입력해봅니다.

$ ls -al ~/.ssh <엔터>
total 23
drwxr-xr-x 1 arumi 197609    0 2   7 15:56 ./
drwxr-xr-x 1 arumi 197609    0 2   7 17:48 ../
-rw-r--r-- 1 arumi 197609  612 2   5 15:52 known_hosts

실제 위의 경로는 윈도우 탐색기상에서 다음과 같습니다.

C:\Users\<본인_윈도우_계정명>\.ssh 폴더

리눅스처럼, 아래의 디렉토리로 이해하면 됩니다.
/home/<본인_리눅스_계정명>/.ssh 디렉토리

이제 Git 클라이언트 자격을 얻기 위해 RSA 기반의 본인의 개인 키(Private Key)와 Git 서버에 보내줄 공개 키(Public Key)를 OpenSSH 기반으로 생성해봅시다. 처음에 딱 한 번만 작업해주면 됩니다. 다음과 같이 입력합니다.

$ ssh-keygen -t rsa -b 4096 -C "Gildong Hong"
Generating public/private rsa key pair.
Enter file in which to save the key (/c/Users/arumi/.ssh/id_rsa): <엔터>
Enter passphrase (empty for no passphrase): 본인이 원하는 비밀번호 입력 <엔터>
Enter same passphrase again: 비밀번호 한 번 더 입력 <엔터>
Your identification has been saved in /c/Users/arumi/.ssh/id_rsa.
Your public key has been saved in /c/Users/arumi/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:Q3Ei6v+lha9deWJuVSyU+Ff/aul88nXK5J7xI/DZnDQ Gindong Hong
The key's randomart image is:
+---[RSA 4096]----+
|      . o .  . . |
|     . . +  . o .|
|    .   .    o .o|
|   .   .      o =|
|    .   S      +.|
|     .   o . ..E.|
|      . . o B.Oo=|
|       . * +.@=X+|
|        +.o..+X++|
+----[SHA256]-----+

C:\Users\<본인_윈도우_계정명>\AppData\Local\Atlassian\SourceTree\git_local\usr\bin\ssh-keygen.exe 실행화면입니다. RSA 키 정보는 생성할 때마다 계속 랜덤하게 바뀌므로, 처음 한 번만 작업하는 것이 좋습니다.

개인 키 및 공개 키는 개발PC의 하드웨어 및 운영체제 환경과 상관없이 독립적으로 생성되는 파일이므로, 추후 PC를 포맷하고 재설치하거나, 다른 PC에 복사해도 재사용할 수 있습니다.

실제 개인 키와 공개 키는 아래의 경로에 생성됩니다. (윈도우 10 기준)

키 구분

경로

개인 키(Private Key)

C:\Users\<본인_윈도우_계정명>\.ssh\id_rsa (확장자 없는 파일)

공개 키(Public Key)

C:\Users\<본인_윈도우_계정명>\.ssh\id_rsa.pub

참고로, ssh-keygen 명령어의 옵션을 잠깐 살펴봅시다.

옵션

설명

비고

-b 비트수

생성할 키 비트수 지정. 최소 768비트가 필요하며 따로 지정하지 않으면 기본 값으로 2048비트로 됨.

-C "코멘트"

주석 입력 가능. 서버에 따라 특별한 용도로 사용하기도 함.

"arumizz"
"Gildong Hong"
"" 등등

-t 암호화방식

어떠한 암호화 방식을 사용할 것인지를 지정

보통 rsa를 지정함

-f 파일명

저장할 키 파일명. 경로를 포함할 수 있음. 생략하면 생성 단계에서 추가로 물어봄.

"/d/secure/my"를 지정하면
D:\secure\my 파일과
D:\secure\my.pub 파일 생성

이제 Git Bash 쉘 창에서 아래와 같이 입력합니다.

$ eval $(ssh-agent) <엔터>
Agent pid 5608

eval은 git-bash 쉘의 내장 명령어이며, 이 명령어를 입력하면 SourceTree에 내장된 ssh-agent.exe 데몬이 프로세스에 등록되고 구동됩니다. ssh-agent.exe는 C:\Users\<본인_윈도우_계정명>\AppData\Local\Atlassian\SourceTree\git_local\usr\bin에 있습니다. ssh-agent 데몬이 구동된 상태이어야 ssh-add.exe 명령어로 개인 키를 검증하고 등록할 수 있습니다.

$ ssh-add ~/.ssh/id_rsa <엔터>
enter passphrase for /c/Users/arumi/.ssh/id_rsa: 설정했던 개인 키 비밀번호 입력 <엔터>
Identity added: /c/Users/arumi/.ssh/id_rsa (/c/Users/arumi/.ssh/id_rsa)

ssh-add.exe는 C:\Users\<본인_윈도우_계정명>\AppData\Local\Atlassian\SourceTree\git_local\usr\bin에 있습니다.

Git-Bash의 터미널 환경 설정이 모두 끝났습니다. 개인 키는 등록했으니, 공개 키(id_rsa.pub 파일)를 Git 원격 서버에 root 권한으로 등록해야 합니다. 파일을 업로드하는 것은 아니고, 파일의 내용을 복사하여 서버의 특정 파일에 반영하는 방식입니다.

아래의 경로에 생성된 공개 키를 메모장, EditPlus 또는 Notepad++ 등과 같은 편집기로 열고, 내용 전체를 마우스로 드래그하여 <Ctrl>+<C> 키를 눌러 복사합니다. (맨 끝에 공백 줄이 붙어있는 경우가 있는데, 공백 줄은 제외하고 복사할 것)

C:\Users\<본인_윈도우_계정명>\.ssh\id_rsa.pub

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDvMpIbb0MwDbb1IKK9aMSoIex0pJj/wir8ts/3TSyDDWEtjxfv
FNwv4CPtW5ciBPgTQldeUBPVWA9S4mqt8mGQdMUOlcuOlFyvDMEMNJAhsyhJmBr7BdSYBKZdZ9nCktTw9Qbe
1B9nhT3zF++RVbsplnnoOBwdqx......................................................t2hKG9gOoJZsmYqyKZ9QIUEesjNu/xUdyr
M1NzIdYBmEvycaBfGNMx9UtIgXqjmUgNHV9QQo7DG+iW1FtgqKr0IGxl4eJa/6MdteOGBzU1GZgasS03iNFh
coeF8M9udldVY2QSjkTCMnfw== Gindong Hong

공개 키가 너무 길이 여러 줄로 보이는 것이며, 실제로는 한 줄 짜리 코드입니다.

SecureCRT 등을 이용하여 원격 서버에 root로 접속하고, 다음과 같이 작업합니다. 처음 설정하는 경우에는 .ssh 디렉토리 및 authorized_keys(확장자 없음) 파일을 새로 생성해야 할 수도 있습니다.

작업 대상 파일 : /home/git/.ssh/authorized_keys

[root@localhost ~]# cd /home/git <엔터>
[root@localhost git]# mkdir .ssh <엔터> => .ssh 디렉토리가 없을 경우에만 생성
[root@localhost git]# cd .ssh <엔터>
[root@localhost .ssh]# vi authorized_keys <엔터> => 파일 존재 유무에 관계없이 열기

authorized_keys 파일을 신규로 작성하는 경우
위에서 복사한 공개 키 내용을 붙여넣습니다.
(<a> 키를 누른 후, SecureCRT에서는 마우스 우클릭으로 클립보드 내용이 자동으로 붙여넣기 됨)

authorized_keys 파일이 이미 있고, 기존의 다른 공개 키들이 저장되어 있을 경우
맨 밑 줄에 추가하는 형식으로 붙여넣습니다.
(추후, 여러 개발자들이 공동작업하게 될 경우 계속 이 파일에 공개 키 내용이 추가될 수 있음)

:wq=> 저장하고 종료

[root@localhost .ssh]# source ~/.bashrc <엔터> => 변경내역 실시간 반영하기

다시 Git 클라이언트쪽으로 넘어와서, SourceTree의 Git Bash를 띄우고, 실제 원격 저장소에 접속하여 특정 저장소 파일들을 가져와서 클론(복제)을 만들어봅시다.

Git 원격 저장소와 Git 로컬 저장소의 디렉토리 구조는 다음과 같이 자동으로 매칭되고 자동으로 생성됩니다.

저장소 구분

Git 원격 저장소 디렉토리

Git 로컬 저장소 디렉토리

마이 웹사이트 저장소

/home/git/repos-myproject/mywebsite.git

D:\WorkSpace\Project\git\mywebsite

마이 강의실 저장소

/home/git/repos-myproject/mylecture.git

D:\WorkSpace\Project\git\mylecture

위에서 Git 로컬 저장소의 mywebsite, mylecture 이름의 디렉토리는 자동으로 생성되므로, 미리 만들지 않아도 됨

예를 들어, D:\WorkSpace\Project\git 하위에 마이 웹사이트의 Git 원격 저장소의 클론을 만들고 싶으면 다음과 같이 입력합니다.

$ cd /d/WorkSpace/Project/git <엔터>
$ git clone ssh://:60022/home/git/repos-myproject/mywebsite.git <엔터>
Cloning into 'mywebsite'...
Enter passphrase for key '/c/Users/<본인_윈도우_계정명>/.ssh/id_rsa': 설정한 비밀번호 입력
warning: You appear to have cloned an empty repository.

비밀번호는 개인 키에 부여했던 비밀번호를 입력합니다.
맨 밑 warning 경고는 무시해도 됩니다. 아직 저장소에 개발자가 작업한 파일이 하나도 없다는 뜻입니다.
git URL을 지정하는 형식은 다음과 같습니다.
=> ssh://<리눅스계정명>@<서버주소(도메인 또는 IP)>[:SSH포트]<원격_저장소_전체경로>
만일 SSH 기본 포트인 22번을 사용하는 경우에는 [:SSH포트] 부분을 생략할 수 있습니다.

여기까지가 Git-Bash 터미널 환경을 설정하는 방법이었습니다. 하지만, 실제 개발자가 파일을 추가하거나, 수정 및 삭제, 이동 등의 작업을 할 때마다 일일이 명령어를 라인 단위로 타이핑하여 입력해야 하는 불편함이 있습니다.

그래서 이러한 일련의 작업을 좀 더 편리하게 그래픽 인터페이스 환경에서 일괄적으로 할 수 있도록 도와주고, 파일들의 변경 이력을 조회할 수 있는 도구가 바로 SourceTree GUI입니다.

이제 이 SourceTree GUI 환경을 설정하는 방법을 설명합니다.

SourceTree GUI에서 환경 설정하기

SourceTree GUI에서도 터미널 환경 설정 단계에서 생성한 개인 키와 공개 키 파일을 약간의 중간 변환 과정을 거쳐 사용할 수 있습니다. (물론 처음부터 SourceTree GUI 내에서 직접 개인 키와 공개 키를 생성할 수도 있습니다.)

우선 SourceTree를 실행합니다. 그리고 상단의 [도구]-[SSH Key 생성 또는 불러오기] 메뉴를 선택합니다.

깃허브 서버 구축 - gisheobeu seobeo guchug

그러면 SourceTree에 내장된 PuTTY Key Generator 도구가 실행됩니다. 이 도구에서는 기존에 이미 생성된 OpenSSH 기반의 개인 키(id_rsa)를 가져와서 변환할 수도 있고, 완전 새로운 개인 키와 공개 키를 직접 생성할 수도 있습니다. Git-Bash 터미널 환경에서 사용했던 ssh-keygen.exe와 유사한 도구라고 보면 됩니다. 아래에서 기존에 이미 생성한 개인 키 파일인 id_rsa를 가져오기 위해 [Load] 버튼을 클릭합니다.

깃허브 서버 구축 - gisheobeu seobeo guchug

C:\Users\<본인_윈도우_계정명>\AppData\Local\SourceTree\app-2.4.8\tools\putty\puttygen.exe 실행화면입니다.

아래의 창에서 C:\Users\<본인_윈도우_계정명>\.ssh 디렉토리를 탐색하였는데, 처음에는 id_rsa 파일이 보이지 않을 수 있습니다. 왜냐 하면 우측 하단의 파일 필터가 PuTTY Private Key Files (*.ppk)로 선택되어 있기 때문입니다. 걱정할 것 없습니다. 이 필터를 All Files (*.*)로 바꿔봅시다.

깃허브 서버 구축 - gisheobeu seobeo guchug

깃허브 서버 구축 - gisheobeu seobeo guchug

확장자 없는 id_rsa, 확장자 있는 id_rsa.ppk의 차이

id_rsa 및 id_rsa.pub 파일을 생성하는 ssh-keygen
ssh 패키지에 포함된 ssh-keygen 명령어는 SSH 프로토콜의 표준을 구현한 OpenSSH 기반으로 개발된 것입니다. 사실 ssh-keygen 기본 옵션을 사용하여 OpenSSH 기반으로 키를 생성하면 대부분의 서버에서 잘 작동하며, 개인 키와 공개 키를 분리된 2개의 파일로 생성해줍니다.

id_rsa.ppk를 생성하는 puttygen
PuTTY 패키지에 포함된 puttygen 명령어는 OpenSSH 기반의 ssh-keygen에 의해 생성된 개인 키와 공개 키를 1개의 통합된 PPK 파일로 변환해줍니다. 물론 다시 2개의 분리된 파일로 역변환 하는 것도 가능합니다. SourceTree와 같은 윈도우용 Git 클라이언트 도구에서는 OpenSSH 기반으로 생성된 확장자 없는 id_rsa를 이용하거나, 파일 1개로 통합된 PPK 파일을 이용하는 두 가지 설정을 모두 지원하지만, 실제적으로는 PPK 파일을 이용할 것은 권장하고 있습니다.

개인 키에 비밀번호를 설정한 경우, 아래와 같이 비밀번호를 물어보는 팝업창이 뜰 수 있습니다. 본인이 지정했던 비밀번호를 입력하고 [OK] 버튼을 누릅니다.

깃허브 서버 구축 - gisheobeu seobeo guchug

아래와 같이 성공적으로 id_rsa 파일을 가져왔다는 메시지가 나오면 불러오기가 성공한 것입니다. [확인] 버튼을 누릅니다. (아래 대화상자의 내용은 이렇습니다. '외부 키(OpenSSH SSH-2 기반 개인 키 (PEM 구형 포맷))를 성공적으로 가져왔습니다. 이 개인 키를 PuTTY에서 사용하려면, [Save private key] 버튼을 클릭하여 PuTTY 전용 포맷으로 저장해야 합니다.')

깃허브 서버 구축 - gisheobeu seobeo guchug

깃허브 서버 구축 - gisheobeu seobeo guchug

위의 화면에서 좀 전의 메시지 내용대로 [Save private key] 버튼을 클릭하여 PuTTY 전용 포맷 파일로 저장해봅시다.

가급적이면 기존의 OpenSSH 기반의 id_rsa 파일이 저장되어 있는 .ssh 디렉토리가 아닌 임의의 다른 디렉토리에 저장하는 것을 권장합니다. 간혹 id_rsa 파일과 PuTTY용 파일이 같은 디렉토리에 있을 경우 충돌이 발생할 수도 있기 때문입니다. (그래서 저의 경우는 찾기 쉽게 D:\WorkSpace\Project\git 디렉토리에 저장하였습니다.)

깃허브 서버 구축 - gisheobeu seobeo guchug

PPK의 파일명은 본인이 인식하기 쉽고, 관리가 용이한 이름을 입력하면 됩니다.

추후, 다른 도메인 또는 IP 주소의 Git 원격 저장소가 여러군데 있을 경우 아래와 같이 종류별로 여러 개의 PPK 파일을 저장해두고 사용할 수도 있습니다.

깃허브 서버 구축 - gisheobeu seobeo guchug

이제 SourceTree에서 PPK 파일을 이용할 때 개인 키에 지정한 비밀번호를 자동으로 인증하도록 하려면 PuTTY의 Pageant 같은 SSH 관리도구를 이용하여 PPK 파일을 추가해야 합니다.

SourceTree에서 상단의 [도구]-[SSH 관리자 실행] 메뉴를 선택합니다.

깃허브 서버 구축 - gisheobeu seobeo guchug

아래와 같이 팝업창이 뜨면 개인 키에 지정한 본인의 비밀번호를 입력하고 [OK] 버튼을 누릅니다.

깃허브 서버 구축 - gisheobeu seobeo guchug

그러면 화면 우측 하단의 트레이아이콘 부분에 Pageant라는 PuTTY 인증 에이전트가 실행되는 것을 볼 수 있습니다.

깃허브 서버 구축 - gisheobeu seobeo guchug

트레이아이콘에서 마우스 우측을 클릭하여 [Add Key] 메뉴를 선택합니다.

깃허브 서버 구축 - gisheobeu seobeo guchug

그리고 좀 전에 변환하여 생성한 repos-xxxx.ppk 파일을 선택하고 [열기(O)] 버튼을 누릅니다.

깃허브 서버 구축 - gisheobeu seobeo guchug

선택한 개인 키의 비밀번호를 입력하고 [OK] 버튼을 누르면 개인 키가 등록됩니다.

깃허브 서버 구축 - gisheobeu seobeo guchug

현재까지 등록된 개인 키를 보려면, 다시 트레이아이콘에서 마우스 우측을 클릭하여 [View Keys] 메뉴를 선택합니다.

깃허브 서버 구축 - gisheobeu seobeo guchug

그러면 아래와 같이 현재까지 등록된 PPK 개인 키 목록을 볼 수 있습니다.

깃허브 서버 구축 - gisheobeu seobeo guchug

개인 키 등록을 마쳤으면, 이제 최종적으로 SourceTree GUI 내부의 환경을 설정합니다. 상단의 [도구]-[옵션] 메뉴를 선택합니다.

깃허브 서버 구축 - gisheobeu seobeo guchug

옵션 창의 [일반] 탭을 선택하고 다음과 같이 설정해줍니다.

깃허브 서버 구축 - gisheobeu seobeo guchug

상위분류

하위분류

설정값

기본 사용자 정보

이름

본인의 이름 입력

이메일 주소

본인의 이메일 주소 입력

SSH 클라이언트 설정

SSH 키

PuTTY PPK 파일 지정

SSH 클라이언트

PuTTY / Plink 선택

[V] SourceTree가 열릴 때 SSH 에이전트 자동 실행

체크

Repo Settings

프로젝트 폴더

로컬 저장소 클론을 모아둔 상위 디렉토리 지정

언어

자동

기본 텍스트 인코딩

utf-8

[Git] 탭을 선택하고 다음과 같이 설정해줍니다.

깃허브 서버 구축 - gisheobeu seobeo guchug

상위분류

하위분류

설정값

Git 버전
(회색 버튼이 현재 선택된 것임)

내장 Git 사용할 경우(권장)

[내장 Git 사용] 버튼 누르고,
[내장 Git 업데이트] 한 번 클릭해줌

시스템 Git 사용할 경우

윈도우용 Git을 따로 설치한 경우에는,
[시스템 Git 사용] 버튼 눌러줌

[Mercurial] 탭을 선택하고 다음과 같이 설정해줍니다.

깃허브 서버 구축 - gisheobeu seobeo guchug

상위분류

하위분류

설정값

Mercurial 버전
(회색 버튼이 현재 선택된 것임)

내장된 Mercurial 사용할 경우(권장)

[내장된 Mercurial 사용] 버튼 누르고,
[내장된 Mercurial 업데이트] 한 번 클릭해줌

시스템 Mercurial 사용할 경우

윈도우용 TortoiseHg를 따로 설치한 경우에는,
[시스템 Mercurial 사용] 버튼 눌러줌

전부 설정하였으면 최종적으로 [확인] 버튼을 누릅니다.

이제 SourceTree GUI에서 Git 원격 저장소에 접속하여 Git 로컬 저장소에 클론을 만들어봅시다.

깃허브 서버 구축 - gisheobeu seobeo guchug

항목

입력내용

소스 경로 / URL

ssh://git@mydomain.com:60022/home/git/repos-myproject/mywebsite.git
- CentOS 계정명 : git
- Git 원격 저장소 서버 주소 : mydomain.com
- SSH 접속 포트 : 60022
- 저장소 경로 : /home/git/repos-myproject/mywebsite.git

목적지 경로

D:\WorkSpace\Project\git\mywebsite

이름

mywebsite

소스 경로 / URL 항목을 잘못 입력하거나 SourceTree에서 원격 서버로 접속하지 못하는 경우는 아래와 같이 주소 입력칸 바로 아래에 표시됩니다.

깃허브 서버 구축 - gisheobeu seobeo guchug

유효한 소스 경로/URL이 아닙니다. 라는 문구가 표시됩니다. 이때에는 우측 [세부 사항...] 버튼을 눌러 오류에 대한 상세원인을 볼 수 있습니다.

정상적인 소스 경로 / URL일 경우 아래와 같이 표시됩니다.

깃허브 서버 구축 - gisheobeu seobeo guchug

모든 입력이 정상일 경우, 맨 하단의 [클론] 버튼이 활성화됩니다. [클론] 버튼을 클릭합니다. 그러면 원격 저장소에서 파일을 읽고, 로컬 저장소에 클론을 만든다.

깃허브 서버 구축 - gisheobeu seobeo guchug

탐색기를 열고 D:\WorkSpace\Project\git 폴더를 찾아보면 아래와 같습니다.

깃허브 서버 구축 - gisheobeu seobeo guchug

git 폴더 하위에 mywebsite라는 이름의 폴더가 자동 생성되고, 그 안에 로컬 저장소임을 나타내는 .git 폴더가 숨김속성으로 생성되어 있는 것을 볼 수 있습니다.

현재는 아무런 작업된 파일이 없어서 비어있지만, 이제 mywebsite 폴더 내에서 실제 개발할 소스코드 및 관련 파일들을 복사한 후에 이것을 원격 저장소로 올려보기로 합시다.

깃허브 서버 구축 - gisheobeu seobeo guchug

기존에 작업했던 소스코드들을 로컬 저장소 폴더 안으로 복사합니다.

그리고 다시 SourceTree GUI 화면으로 돌아옵니다. 그러면 다음과 같이 신규로 복사된 파일들의 목록이 표시됩니다.

깃허브 서버 구축 - gisheobeu seobeo guchug

스테이지에 올라가지 않은 파일 부분에 신규로 복사한 파일들의 목록이 출력됩니다. 여기서 스테이지는 Git 원격 저장소가 아니라 Git 로컬 저장소를 말합니다. (Git의 개념, 혼동하면 안됨)

위의 화면에서 [모두 스테이지에 올리기] 버튼을 클릭합니다.

깃허브 서버 구축 - gisheobeu seobeo guchug

스테이지에 올라간 파일 부분에 파일이 올라간 것을 확인할 수 있습니다. 아래에 작업 내역에 대한 간단한 설명을 입력하고, [V] -에 바뀐 내용 즉시 푸시(Push)를 체크합니다. 푸시에 체크하게 되면 Git 로컬 저장소에 올림과 동시에 Git 원격 저장소에도 같이 올리게 됩니다. 최종적으로 우측의 [커밋] 버튼을 클릭합니다.

깃허브 서버 구축 - gisheobeu seobeo guchug

깃허브 서버 구축 - gisheobeu seobeo guchug

커밋이완료되면 위와 같이 나옵니다. [닫기] 버튼을 누릅니다.

정상적으로 처리되었으면 아래와 같은 화면으로 바뀝니다.

깃허브 서버 구축 - gisheobeu seobeo guchug

좌측에 master라는 항목이 생깁니다. 그리고 우측에는 커밋된 파일들에 대한 상세한 정보 및 변경 이력 등을 조회할 수 있습니다.

추후 개발작업의 방향

SourceTree GUI 환경을 이용하여 Git 원격 저장소와 Git 로컬 저장소를 연동시킨 이후에는, 모든 개발에 관련된 작업을 이 Git 로컬 저장소 디렉토리 내에서 직접 하거나, 다른 위치의 디렉토리에서 작업하여 변경된 파일들만 Git 로컬 저장소에 개별적으로 덮어쓰기 또는 추가/삭제 등을 할 수 있습니다.

관리적 측면에서 어떤 방법이 본인에게 더 효율적인지는 각자의 판단에 맡기도록 하겠습니다.

by Arumizz

깃허브 서버 구축 - gisheobeu seobeo guchug

아르미즈(arumizz) 님을 이웃추가하고 새글을 받아보세요