나만의 git 서버 만들기 - (3) 원격저장소 생성하기

김지수·2021년 8월 31일
4

Q 왜 Local server에 원격저장소를 생성하려 하는가?

Ans. GitHub는 무료인 원격저장소인 대신에, Public으로 공개가 됨

  • Private으로 생성해도 팀 개발은 가능하지만, 최대 3명의 팀원만 사용 가능함 (2021.03 정책기준)
  • 따라서, 5인 이상이 작업을해야 하는 우리 실정에는 맞지 않았으므로, 연구실 서버에 원격 저장소를 생성하였음
  • 주로 참고한 문헌은 아래와 같으며, 매우 고맙게도 우리의 니즈와 맞았음
    https://github.com/left21wm/dev-sharing/tree/master/git

    “이 세미나는 소규모 비공개 작업 팀에게 가장 알맞은 내용일 거라고 생각한다. 우리가 그런 팀이니까.”

1. 원격저장소 생성방법

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

1) Bare 저장소(비어있는 저장소) 만들기

어떤 서버를 설치하더라도 일단 저장소를 Bare 저장소로 만들어야 한다. 여기서, Bare 저장소는 워킹 디렉토리가 없는 저장소를 의미한다. --bare 옵션을 주고 Clone 하면 새로운 Bare 저장소가 만들어진다. Bare 저장소 디렉토리는 관례에 따라 .git 글자가 이름에 붙는다.

a) 새로운 폴더를 원격 저장소로 만들기

>>> mkdir git-test && cd git-test
>>> git init
>>> git add.
>>> git commit -a
>>> git --bare init

이론상으로는 이 폴더가 새로운 원격저장소가 된다고한다. 그러나, git에 대한 기본지식이 없는 상태에서 시도하다보니 빌드에 실패했다.

따라서, 필자는 VSCode를 사용해서 repository를 초기화 시키고 해당 폴더(프로젝트)를 원격 저장소로 사용할 폴더로 활용하였다.

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

일단 원격 저장소를 둘 Server컴에 로컬에 있는 git 저장소를 통째로 Server컴으로 복사를 뜬다. 다른 컴퓨터에서 가져오는 방법으로는,

  • 1) git clone으로 폴더 통채를 가져오는 방법 (물론 다음에 기존의 remote는 끊어줘야 한다.)
  • 2) .git 까지 포함해서 ctrl C + V

위와 같은 기존의 저장소를 서버쪽 저장소로 가져왔으며 그때의 위치가 git-repos/inha_modules_ROS라고 가정하자. 이후, 원격 저장소로 사용할 폴더를 만들고 --bare 옵션을 사용하여 clone을 뜬다. 여기서 --bare옵션은 위에서 설명한 것과 같이 원격 저장소를 만드는 옵션이다.

>>> mkdir /git-repos/inha_modules_ROS.git
>>> git clone --bare /git-repos/inha_modules_ROS /git-repos/inha_modules_ROS.git

이러면 원격 저장소 생성완료이다!
이제, inha_modules.git 디렉토리에는 복사한 Git 디렉토리 데이터만 들어있다.

--bare 저장소 (비어있는 저장소)

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

2) Bare 저장소에 SSH 접속권한 부여

Bare 저장소는 이제 만들었으니까 서버에 넣고 프로토콜을 설정한다. kass@192.168.0.13 라는 이름의 서버를 하나 준비하였다. 그리고 그 서버에 SSH로 접속할 수 있게 만들고, Git 저장소를 /git-repos/git 디렉토리에 저장할 것이다. (SSH server를 만드는 방법은 다른 글에서 소개하겠다. 다만, 여기서 192.168.0.13은 고정 DNS(IP) 주소를 의미한다.)

a) 읽기 권한 부여

서버에 /git-repos/git 디렉토리를 만들고, 아래와 같이 Bare 저장소를 복사한다.

 >>> mkdir git-repos/git && cd git-repos
 >>> scp -P 10022 -r inha_modules_ROS.git kass@192.168.0.13:~/git-repos/git

이제 다른 사용자들은 SSH로 서버에 접근해서 저장소를 Clone 할 수 있다. (단, 사용자는 /git-repos/git 디렉토리에 읽기 권한이 있어야 한다.)

-P 옵션

여기서 -P옵션은 SSH port를 할당해주는 명령어이다. (일반적으로는 SSH 접속은 22번 포트를 사용하고 있으나, 보안상의 이유로 필자의 연구실에서는 10022 포트를 열어 두었다. SSH 관련해서는 다른 글을 참고 바란다.)

-r 옵션

여기서, -r옵션은 SSH 접속권한을 부여하는 명령어 이다.

b) 쓰기 권한 부여

다만, 아직 쓰기 권한을 부여하지 않았으므로, 사용자는 push는 할 수 없다. 이 서버에 SSH로 서버에 접근한 사용자에게 쓰기 권한을 부여하기 위해서는 아래와 같은 조치가 필요하다.

>>> cd /git-repos/git/inha_modules_ROS.git && git init --bare --shared

--shared 옵션

git init 명령에 --shared 옵션을 추가하면 Git은 자동으로 그룹 쓰기 권한을 추가해준다

2. 원격저장소 접속

원격 저장소를 접속하는 방법은 다양하다. https, git, ssh등의 프로토콜을 지원하고 있다. 그러나, 앞선 일련의 과정에서 ssh 접속 관련하여 셋팅을 해오고 있으므로, ssh를 활용한 접속방법에 대해서 이야기 해보겠다.

1) 원격저장소 clone 해오기

앞선 과정을 통해, ~/git-repos/git/inha_modules_ROS.gitLocal server에 만들어 두었다. 그렇다면, Client 컴퓨터는 어떻게 접속해야 할까? 앞선 게시글에서 Server 컴퓨터에 SSH를 통해 접속할 수 있게끔 구성해 놓았고, SSH 접속용 ID를 kass라고 이미 정의하였다. (이때, 내부 IP는 192.168.0.13에, 접속 Port는 10022이라고 가정하자.)

>>> git clone ssh://kass@192.168.0.13:10022/home/kass/git-repos/git/inha_modules_ROS.git

git clone ssh://[user]@[ip 주소]:port/git 파일 저장위치

  • 처음 ssh 접속시 public key 등록할 것인지 물어보는데, 이때 그냥 yes하면 됨

이렇게하면 원격저장소의 데이터를 쉽게 당겨올 수 있다. Local에서 작업을 한 후, 작업 내역을 git push origin master등으로 git 명령어에 기반하여 통신하면서 작업을 하면 끝이다.

2) 팀원 모두가 같은 아이디로 접속??

위와 같이 모든 팀원이 동일한 ID(kass)로 원격저장소에 접속해서 clone하고 Local 작업내역을 Push한다면, 파일이 꼬이지는 않을까? 라는 의문이 들 수도 있을 것 같다.
정답은 상관 없다!이다.ㅎㅎ 어차피 git commit은 Client 컴퓨터의 git 자격증명을 바탕으로 업로드가 되므로, 전혀 상관이 없다.
(git 자격증명은 처음 git을 설치 후 셋팅하며, Client 컴퓨터에 저장되어 있다.)

  • git config --global user.name "myname",
  • git config --global user.email "mymail@email.com"

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

초 간단 뚝닥

이로써 동료들과 함게 일할 준비가 끝났다. 처음 서버에 SSH 셋팅을 하는것이 약간 까다롭지만, 그 이후에는 엄청 쉽다.

그러니까 Git 서버를 구축하는데 사람이 할 일은 정말 별로 없다. SSH로 접속할 수 있도록 서버에 계정을 만들고 Bare 저장소를 사람들이 읽고 쓸 수 있는 곳에 넣어 두기만 하면 된다.

[참고 문헌]
1. https://github.com/left21wm/dev-sharing/blob/master/git/02-remote-repo,checkout.md
2. https://git-scm.com/book/ko/v2/Git-%EC%84%9C%EB%B2%84-%EC%84%9C%EB%B2%84%EC%97%90-Git-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0#_getting_git_on_a_server

profile
Inha Univ. Naval Architecture and Ocean Engineering (NAOE) & Lab. of MAritime System COnTrol(MASCOT), Master's degree / keywards : Maritime Autonomous Surface Ships(MASS), Deep Learning, Reinforcement learning, Unity ML-Agents, Navigation & Guidance

2개의 댓글

comment-user-thumbnail
2021년 9월 7일

정말 최고에요!!

답글 달기
comment-user-thumbnail
2022년 9월 27일

잘 보고 갑니다

답글 달기