Android byDreamy postedOct 29, 2016

git 기초 - 원격 저장소 만들고 로그인하기, 소스 되돌리기

?

단축키

Prev이전 문서

Next다음 문서

ESC닫기

+ - Up Down Comment Print

https://github.com/left21wm/dev-sharing/blob/master/git/02-remote-repo,checkout.md



원격 저장소 생성하기

원격 저장소를 생성하려면, 서버로 사용할 컴에서 작업을 해야 한다.

SVN은 흔히들 저장소 하나를 만들고 각 폴더를 한 프로젝트로 사용했을 거다. git는 그럴 필요가 없다. 그냥 프로젝트 하나를 저장소 하나로 만들면 된다.

빈 원격 저장소 생성하기

비어 있는 원격 저장소를 생성한 다음, 로컬 컴퓨터에서 clone 받고 push를 하면서 시작하는 것도 방법이다. 그렇게 하려면 원격 프로젝트 저장소로 사용할 폴더로 가서 이렇게 --bare라고 옵션을 붙여서 명령을 내리면 된다. 원격 저장소로 사용할 폴더는 관례상 .git라는 접미사(suffix)를 붙인다. 알아 두자.

git --bare init

그러면 그 폴더가 원격 저장소가 된다. 접속을 어떻게 하는지는 뒤에서 다룬다.

이미 있는 프로젝트를 원격 저장소로 만들기

일단 원격 저장소를 둘 Server컴에 .git 폴더 없이 소스만 다 복사하든가, 아니면 로컬에 있는 git 저장소를 통째로 Server컴으로 복사를 뜬다. clone을 하든, .git까지 포함해서 scp를 하든 소스만 복사를 뜨든 뭐 알아서 하란 말이다. 물론 소스만 복사를 뜨면 기존 git commit history는 날아가 버리는 거겠지만.

복사 뜬 프로젝트가 git 저장소가 아니라고 가정하자. 그럼 우선 git 저장소로 만들어 줘야 한다. git init이라고 쳐서 저장소로 만들고, .gitignore에 무시할 파일들을 적어 주고, git add . 명령으로 모든 파일과 폴더를 git에 추가한 다음, git commit -a 명령으로 추적을 시작하자. 이러면 준비완료다.

만약 서버에 카피뜬 저장소가 이미 git 저장소라면 앞의 과정은 생략해도 되겠다.

여튼 방금 복사 뜬 서버쪽 저장소의 위치가 /git-repos/my-project라고 치자. 그럼 어떻게 할까? 일단 원격 저장소로 만들 폴더를 만든다.

mkdir /git-repos/my-project.git

이렇게 치면 폴더가 만들어지고... 다음으로 그냥 clone을 뜨면 된다. 단, 아래 명령어를 보면 알 수 있겠지만, --bare라는 옵션을 줘야 한다. 이게 원격 저장소를 만드는 옵션이다.

git clone --bare /git-repos/my-project /git-repos/my-project.git

이러면 원격 저장소 생성 완료.

아, 내 컴에 원격 저장소를 만든 다음 그걸 서버컴으로 통째로 복사해 옮기는 것도 방법이다.

--bare - 벌거벗은 저장소

원격 저장소와 로컬 저장소의 차이는 working copy를 갖고 있냐 없냐밖에 없다. 로컬 저장소의 .git 안에 있는 것들이 원격 저장소에선 밖으로 나와 있다. 그뿐이다. 그래서 bare, 벌거벗은 저장소인 거다.

원격 저장소 접속

와우 원격 저장소를 만드는 게 이렇게 쉽다니. SVN에 비해서 스트레스가 훨씬 적다. SVN은 저장소마다 인증 문제를 처리해야 해서 상당히 귀찮았단 말이다. 그런데 git는 ssh로 다 처리해 버리니, 저장소 그 자체를 만드는 게 상당히 간결해진 것 같다. 여튼, 저장소 로그인 문제는 뒤에 다루고 이번엔 어떻게 원격에서 접속할 것인지를 다룬다.

원격 저장소로 접속하는 방법은 다양하다. git는 httphttpsgitssh 프로토콜을 지원한다. 자세한 내용은 《Pro Git》을 참고할 것을 권한다. 여기서는 소규모 비공개 작업 팀에게 적합하다고 생각되는, ssh 접속만 다룬다.

아까 /git-repos/my-project.git를 Sever컴에 만들었다고 치자. Client컴은 여기에 어떻게 접속해야 할까? Server컴엔 원래 ssh로 접속할 수가 있었다고 가정하자. ssh 접속용 ID는 left21wm이라고 하자. 그리고 Server컴은 소규모 팀답게 IP가 192.168.0.100이다. 그러면 Client컴 쪽에서 아래처럼 clone을 하면 된다.

git clone left21wm@192.168.0.100:/git-repos/my-project.git

이럼 끝이다. 이렇게 clone을 해왔다면, 그 다음부턴 지난 세미나때 배웠던 것처럼 git add .과 git commit으로 로컬에 작업 내역을 저장하고 git push origin master 명령어로 서버와 통신하면서 작업을 하면 끝이다.

팀원 모두가 left21wm 아이디로 접속한다고?

그렇다. left21wm 아이디로 팀원 모두가 접속하면 된다. 어차피 git commit은 내 컴퓨터에 내 자격증명을 바탕으로 하는 것이다. 내 자격증명은 첫 번째 세미나에서 git config --global user.name "myname"와 git config --global user.email "mymail@email.com"로 했었다. commit한 사람은 바로 이 자격증명으로 기록된다. 어디에? 내 컴퓨터의 저장소에 말이다.

git push를 하게 되면 내 컴에 기록된 commit history를 서버 컴에 밀어넣게 된다. commit한 사람의 이름이 바뀌지는 않는다. ssh 접속은 원격 git 저장소에 로그인하는 게 아니라, 원격 Sever컴에 로그인하는 것이다. Sever컴에 로그인한 다음 git commit history를 push하는 것이다. jpg를 카피한다고 jpg 안에 있는 EXIF 태그가 변경되는 게 아닌 것처럼, git를 push한다고 git commit history 안에 있는 작성자가 변경되지는 않는다는 말이다.

평소에 사용하는 ssh 계정을 사용해도 되지만 git 전용 계정을 만드는 것도 좋다

Server컴에 git 전용 계정을 만들고, 해당 계정은 git 명령어만 사용할 수 있도록 설정하는 것은 보안에 도움이 될 것이다. 사용자를 만드는 방법은 다음과 같다.

sudo adduser git

이 명령 내리면 패스워드 입력하라고 나온다. 그건 입력하면 되고. Full Name도 입력하라고 한다. 뭐 대충 입력해 준다. 그런데 갑자기 룸 넘버 묻고 전화번호 묻고 막 이런다. 룸 넘버부터는 그냥 다 엔터치면 된다. 성실히 적고 싶으면 적든가.

여튼 이렇게 터미널에서 사용자를 만드는 건 무지하게 쉽더라.

물론 저장소의 소유자를 방금 만든 저 git 계정으로 돌리는 걸 잊지 말기 바란다.

sudo chown -R git:git /git-repos

만약 git 계정이 /git-repos 폴더에 읽기 권한만 있고 쓰기 권한이 없다면 쓰기는 할 수 없게 된다. ssh로 간단한 권한 조정은 이렇게 할 수 있는 것이다. git 계정은 읽기 쓰기를 다 할 수 있도록 설정하고, git-readonly 같은 계정을 또 만들어서 저장소를 읽기만 할 수 있게 해 두는 식으로 말이다.

자, 여튼간에 그러면 앞으로는 Client컴에서 이렇게 clone하면 되겠다.

git clone git@192.168.0.100:/git-repos/my-project

git 계정은 git 명령어만 사용할 수 있도록 해볼까

git 명령어만 사용할 수 있도록 설정을 하려면 아래 절차를 따른다. 일단, Server컴에 들어가서, git-shell이 어디에 있는지 찾는다. 아래 명령어로 찾으면 된다.

which git-shell

which는 전역에서 사용하는 명령어의 실제 위치를 알려 주는 명령어다. 내 우분투 서버는 이런 결과를 출력한다.

/usr/bin/git-shell

자, 이걸 기억해 놓고 다음으로 넘어가자. 이렇게 치자.

sudo mkdir /home/git/git-shell-commands
sudo chown git:git /home/git/git-shell-commands

위 명령어는 git-shell을 활성화하기 위해 필요한 폴더를 만들고 해당 폴더를 git 계정 것으로 만드는 명령이다. (물론 git 계정으로 로그인해서 폴더를 만들면 권한 부분은 신경 안 써도 된다.)

이제 git-shell을 쓸 준비가 됐으니, git 계정이 사용할 쉘을 git-shell로 바꾸는 작업을 하자.

아래 명령어로 사용자 계정 문서로 들어간다.

sudo nano /etc/passwd

보통 터미널 에디터로 vim을 쓰던데, 터미널 세대가 아닌 나는 nano가 더 편하더라. 여튼간에 자신이 편한 에디터를 사용하면 된다.

그리고 다음과 같이 git:로 시작하는 줄을 찾는다.

git:x:1000:1000::/home/git:/bin/bash

마지막 줄의 /bin/bash가 해당 계정이 사용할 쉘 프로그램을 명시해 주는 부분인 거 같다. 이 부분은 사용하는 시스템마다 다르니까 이 부분이 다르다고 당황해 하지는 말자. 《Pro Git》의 예제에는 이 부분이 /bin/sh라고 나온다.

자, 이제 이 부분을 아까 which git-shell 해서 나왔던 결과로 교체해 준다. 나 같은 경우는 /usr/bin/git-shell이라고 나왔으니까 그렇게 바꿨다. 여튼 그래서 결과적으로 위의 줄은 아래처럼 바뀔 것이다.

git:x:1000:1000::/home/git:/usr/bin/git-shell

이제 저장하고 나온 다음 아래 명령어로 git 계정에 접속해 보자.

su git

아마도 결과가 버전에 따라 다른 것 같은데, 두 가지 경우 모두 성공이다. 내가 테스트해 본 버전이 두 개고, 굳이 변천사 같은 걸 찾아 볼 필요는 없는 것 같아서 테스트한 버전만 적는다.

1.8.1.2 버전에서

git> 라고 표시되면 성공! 한 번 ls 명령어를 쳐 보자. unrecognized command 'ls'라고 나온다면 확실히 성공인 거다.

1.7.0.4 버전에서

fatal: What do you think I am? A shell?

이런 메세지가 나오고 로그인이 안 된다. 해석하면, "치명적 오류: 내가 쉘이라고 생각하니?" 정도 되겠다. 역시 이런 메세지가 나와도 성공이다.

22번 외의 포트

ssh의 기본 포트는 22다. 그런데 보안 때문에 22번 포트를 사용하지 않는 경우도 있다. 그런 경우엔 아래처럼 사용하면 된다. 포트를 52222번을 사용한다고 가정하자.

git clone ssh://git@192.168.0.100:52222/git-repos/my-project

이러면 된다. 포트가 22번이 아닌 경우엔 앞쪽에 ssh://라고 프로토콜을 밝혀 줘야 하더라.

Client컴에서, 내 git 저장소가 어느 원격 저장소에 연결돼 있는지 보려면 아래처럼 써 준다.

git remote -v

그럼 쭉 나온다. 뭐 사실 기본적으로 git help라고 치면 git 명령어 바로 다음에 칠 수 있는 명령어들이 나오고, git help remote하는 식으로 치면 해당 git 명령어를 사용하는 방법이 상당히 자세히 나오니까 궁금한 거 있으면 그냥 help 쳐 보면 된다.

소스 되돌리기

SVN에서 checkout은 원격 저장소에 있는 것을 최초로 받아 오는 것이다. update는 원격 저장소와 자신의 working copy를 합치는 것이고, revert는 원격 저장소의 것으로 내 working copy를 되돌리는 것이다.

git에서는 최초로 원격 저장소에 있는 것을 받아 오는 것은, clone이다. 한 working copy를 받아 오는 게 아니라 저장소를 통으로 복사해 오기 때문에 clone이란 표현이 적절해 보인다. 그리고 pull이 원격 저장소 (개념을 좀더 쉽게 하기 위해 내 멋대로 말을 만들면, '다른 저장소')에 있는 것을 '땡겨' 와서 내 저장소와 합치는 것이고, checkout은 원격 저장소로 내 저장소를 덮어 쓰는 것이다. (checkout은 branch에서도 사용하는데, 여기선 패스.)

명령어 정리

갑자기 좀 쌩뚱맞지만 몇 가지 명령어를 SVN과 비교해서 정리하면 이렇다.

  • SVN : git
  • checkout : clone
  • update : pull
  • revert : checkout
  • commit : push


나눔글꼴 설치 안내


이 PC에는 나눔글꼴이 설치되어 있지 않습니다.

이 사이트를 나눔글꼴로 보기 위해서는
나눔글꼴을 설치해야 합니다.

설치 취소

Designed by sketchbooks.co.kr / sketchbook5 board skin

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5