Posts

SVN SETTING

OS Setting

SVN을 설치할 서버의 운영체제는 CentOS 7 이다.
로컬 SVN을 설치할 운영체제는 Windows 10 이다.

CentOS

리누스 토발즈가 개발한 OS인 리눅스 Linux는 오픈소스이다보니 수많은 버전이 존재한다. 여기서 대표적인 버전이 레드햇 계열과 데비안 계열 (대표적으로 우분투 가 있다.) 이 있다.

CentOS는 Red Hat Enterprise Linux (RHEL)에서 브랜드를 제거한 배포본으로, RHEL과 다른 점이 없기 때문에 CentOS와 RHEL의 호환성은 아주 높다. 무료로 RHEL을 사용할 수 있다는 점에서 서버용 OS로 많이 사용되나 RHEL과 달리 사후 지원을 커뮤니티에서 제공한다.

RHEL : 레드 햇의 오픈 소스 운영체제로, CentOS와 마찬가지로 서버용 OS로 많이 사용되며, CentOS와 달리 기업에서 사후 지원을 제공한다.

SVN

SubVersion의 줄임말로, 중앙집중식 버전 관리 Tool이다. 서로 다른 개발자가 본인의 변경된 코드를 하나의 중앙 repository에 commit 하는 방식으로 운영된다. 로컬 repository와 원격 repository가 존재하는 git과 다르게 중앙 repo 하나만 관리하면 되기 때문에 이해하기 쉽고 직관적이다. 그러나, push를 하지 않으면 원격 repo에 반영되지 않는 git과 달리 commit이 중앙 저장소에 바로 반영된다는 위험성과 개발자 자신만의 version history를 가질 수 없다는 단점이 존재한다.

SVN Setting

필자는 서버에 SVN이 이미 설치된 상태여서 아래의 단계로 진행했다.

설치 명령어는 다음과 같다.

1
yum install subversion

1. SVN 서버에 Repository 생성

아래의 명령어를 사용해 설치된 SVN의 버전을 확인한다. 만약 버전의 내용이 나오지 않는다면 SVN이 설치되지 않은 것이다.

1
svn --version

svn version

해당 버전은 꽤 예전의 버전이지만 마음대로 변경할 수 없는 상황이여서 그대로 진행했다. 확인해보니 오늘 (24.07.04) 기준 가장 최신 버전은 1.14.0 이었다.

SubVersion 공식 홈페이지


SVN의 설치를 확인했으니 svn이 설치된 경로 아래에 repository를 생성한다. 필자의 서버에는 /svn/ 안에 이미 전에 생성된 저장소가 있어 찾는게 어렵지 않았으나, 대체로 /home/svn 경로 아래에 저장소를 생성하는 것 같았다. 저장소를 생성할 위치로 이동한 후, 아래의 명령어를 입력한다.

1
2
3
4
5
svnadmin create --fs-type fsfs 저장소_이름

or

svnadmin create 저장소_이름

저장소 디렉토리

저장소를 생성하면 하위 디렉토리에 위 사진과 같이 conf, db, hooks, locks, format, README.txt가 생성된다. 이 중 conf 디렉토리 내에 있는 authz, passwd, svnserve.conf를 수정해야 한다.

1
2
3
4
5
# passwd
[users]
# harry = harryssecret
# sally = sallyssecret
user id = user password
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# authz
[groups]
# 그룹명 = 그룹에 해당하는 사용자
# harry_and_sally = harry,sally
# harry_sally_and_joe = harry,sally,&joe

# [/foo/bar]
# harry = rw
# &joe = r
# * =

# [repository:/baz/fuz]
# @harry_and_sally = rw
# * = r

[/] # 띄어쓰기 X
# 전체 저장소에 대한 권한
user id = 권한
# 필자는 user = rw 로 전체 저장소에 대해 모든 권한을 부여함
1
2
3
4
5
6
7
8
9
10
11
# svnserve.conf
[general]
...
anon-access = read  # 계정이 없는 사용자는 읽기만 가능
auth-access = write # 인증된 사용자에게는 쓰기 권한 부여
...
password-db = passwd # 계정 정보가 들어 있는 파일 설정
...
authz-db = authz     # 권한 설정 정보가 있는 파일 설정
...
# realm = My First Repository # 저장소 정보 (소개글)로, 생략 가능

또한, svnserve 서비스를 사용할 수 있도록 /etc/sysconfig/svnserve 파일을 수정한다.

1
2
3
4
5
OPTIONS="-r /(저장소 경로)"

# 만약 저장소를 저장할 디렉토리를 repos로 정하고, repo의 위치가 svn 디렉토리 아래의 있다면 (== /svn/repos/(snvadmin으로 만든 저장소 (ex ) repo))) 아래처럼 작성한다.

# OPTIONS = "-r /svn/repos"

위의 설정을 모두 마무리했다면 아래의 명령어를 입력하여 svn 서비스를 시작한다.

1
systemctl start svnserve

IF ) ‘E000098: Can’t bind server socket: Address already in use’ ERROR 발생 시

2. IntelliJ에 SVN 연결

SVN을 다운로드 한 후, 경로를 IntelliJ에 입력한다. 경로를 입력할 때에는 반드시 svn.exe 까지 선택해야 하며, 두 번째의 체크박스는 지금은 선택하지 않아도 무관하다. 만약 에러가 뜬다면..

svn

이후 SVN 플러그인까지 install한다.

svn

다음으로 저장소를 등록한다. 다른 글을 보면 VCS 탭을 통해 들어가지만 필자는 SVN 탭을 통해 등록을 할 수 있었다. 이름만 다를 뿐, 크게 다른 점은 없는 것 같다.

svn

하단에 생긴 SVN Repositories 탭의 왼쪽 + 를 선택하여 저장소를 등록한다.

svn

서버의 도메인을 알고 있다면 https:// 로 시작하면 되고, 그렇지 않으면 svn://으로 시작하면 된다. 필자가 사용한 예시 경로는 아래와 같다.

1
svn:// (IP Address) /repo

또한, IP 주소 뒤의 경로를 /svn/repos/repo로 하면 오류가 난다. (오류 메세지 : Error: URL 'svn://(IP 주소)/svn/repos/repo' doesn't exist) SVN 서버를 설정할 때, OPTIONS에서 /svn/repos를 설정해두었기 때문이다.

local에서 서버 repository의 정확한 정보를 알고 싶다면 아래의 명령어를 입력해보자.

1
svn info svn://(IP 주소)/repo

svn

해당 명령어를 사용하려면 svn이 로컬에도 설치되어 있어야 한다.

저장소를 등록하고 나면 SVN과 IntelliJ를 연동해야 한다. SVN (or VCS) -> Get From Version Control 창을 열어 Version Control과 Repository를 선택한다.

svn

이후 체크아웃1할 로컬 프로젝트를 선택한다. 필자는 사진과 달리 로컬 프로젝트의 최상위 디렉토리를 선택했다.

  • Destination : 저장 위치
  • Update/Switch to revision : HEAD - 가장 최신 리비전 / Specified - 특정 리비전 선택
  • Depth : 가져올 범위
    • infinity : 전체 범위
    • immediates : 해당 폴더 파일과 파일을 제외한 하위 폴더
    • files : 해당 폴더 파일만
    • empty : 해당 폴더만

svn

다음으로 SVN의 Working Copy 형식을 지정한다. 가장 최신 버전인 1.8을 선택하면 된다.

svn

이후 commit을 하고 나면 하단 탭에서 commit log를 확인할 수 있다.

svn

파일 상태 구분

각 파일의 색상으로 상태를 구분할 수 있다.

  • 파란색 : 수정된 파일
  • 노란색 : ignore 파일
  • 초록색 : add 파일
  • 하얀색 : remote == local 파일 (commit된 파일)
  • 주황색 : Unversioned 파일 (add 되지 않은 파일)
  • 빨간색 : conflict가 발생한 파일


인텔리제이 파일 상태 색상

Add and Commit

필자의 IntelliJ는 왼쪽 상단에 SVN 아이콘이 나타나지 않아 탭을 이용해 add와 commit을 진행해야 했다.

우선 Commit 하고 싶은 파일에 커서를 두고 우클릭을 한 뒤 Subversion -> Add to VCS로 해당 파일을 Add한다.
단축키는 Ctrl + Art + A 이다.

add

모든 add를 완료했다면 VCS (or SVN) -> Commit…으로 이동하여 Commit 창을 띄운다. 혹은 아래의 이미지처럼 우클릭으로 commit을 할 수 있다.
SVN 팝업 단축키는 Ctrl + `이다.

svn

commit 클릭 시 열리는 창에서 Add한 파일을 모두 확인할 수 있다. Commit 시에는 commit할 파일이 있는 경로의 디렉토리 모두 선택해야 한다.

commit

Commit Message와 설정을 마치면 Commit 버튼을 눌러 commit한다.

Update

SVN에 올라가 있는 파일을 pull 받기 위해서는 Update를 해야 한다.

프로젝트 전체 UPDATE특정 디렉터리 UPDATE특정 파일 UPDATE

Update 클릭하면 아래의 창이 뜬다.

  • 새 branch를 생성하고 싶다면, Update/Switch to specific url의 체크 박스를 선택하여 사용할 branch 이름과 해당 branch 이름으로 update하는 소스 코드를 저장할 경로를 설정한다.
  • 특정 리비전의 내용으로 동기화를 하고 싶다면 Update/Switch to specific revision의 체크 박스를 선택하여 원하는 리비전으로 변경한다. 변경하지 않으면 최신 (HEAD) 리비전을 가져온다.

OK를 눌러 서버의 저장소에서 클라이언트로 프로젝트 (or 디렉터리 or 파일)를 Checkout 받는다. 그러면 아래의 이미지처럼 update 전 / 후의 파일 목록 및 로그를 확인할 수 있다.

파일을 확인하고 이전의 것이나 필요 없는 것을 삭제한다. 필자는 .r9에 해당하는 파일을 살렸다.

IF - TortoiseSVN

만약 위의 단계를 CLI로 하기 어렵다면 TortoiseSVN을 설치하여 진행하는 것을 추천한다.

svn

설치가 완료되면 우클릭 시 다음의 설정이 추가된다.

svn

TortoiseSVN이 설치되면 7개의 프로그램이 깔린 것을 확인할 수 있다.

svn

TortoiseSVN은 프로그램을 선택해서 실행하는 식이 아닌, 이 프로그램을 실행할 디렉토리에서 우클릭을 하여 TortoiseSVN을 실행하는 식으로 실행해야 한다.

svn

아니면 위의 안내창이 뜬다.

착한흑곰 님 - [TortoiseSVN] TortoiseSVN is a shell extension.


Error List

E000098: Can’t bind server socket: Address already in use

1
Job for svnserve.service failed because the control process exited with error code. See "systemctl status svnserve.service" and "journalctl -xe" for details.

위의 에러가 발생하여 시키는대로 status를 확인했다.

1
2
3
4
5
6
7
8
9
10
11
12
[root@localhost~]# systemctl status svnserve.service
● svnserve.service - Subversion protocol daemon
   Loaded: loaded (/usr/lib/systemd/system/svnserve.service; disabled; vendor preset: disabled)
   Active: failed (Result: exit-code) since Thu 2024-07-04 16:36:11 KST; 45s ago
  Process: (옵션 내용) (code=exited, status=1/FAILURE)

Jul 04 16:36:11 localhost.localdomain systemd[1]: Starting Subversion protocol daemon...
Jul 04 16:36:11 localhost.localdomain svnserve[18302]: svnserve: E000098: Can't bind server socket: Address already in use
Jul 04 16:36:11 localhost.localdomain systemd[1]: svnserve.service: control process exited, code=exited status=1
Jul 04 16:36:11 localhost.localdomain systemd[1]: Failed to start Subversion protocol daemon.
Jul 04 16:36:11 localhost.localdomain systemd[1]: Unit svnserve.service entered failed state.
Jul 04 16:36:11 localhost.localdomain systemd[1]: svnserve.service failed.

즉, 주소를 이미 사용하고 있어서 오류가 난 것이다. 하지만 필자는,, 그 사실을 알지 못하고 포트가 열려있지 않아서 그런거라고 생각해 방화벽을 건드렸다.

1
2
3
4
5
sudo firewall-cmd --permanent --zone=public --add-port=3690/tcp

sudo firewall-cmd --reload

sudo firewall-cmd --permanent --zone=public --add-port=3690/tcp

순서대로 입력 후 Success가 뜬 것을 확인한 후 다시 svnserve를 start 했지만 여전히 에러가 떴다. 이제서야 문제점을 확인한 필자는 아래의 명령어를 순서대로 입력했다. 다만 fuser가 설치되어 있지 않아서 ps -el를 사용해야 했고, 하나하나 읽어가며 찾아야 했다.

fuser는 설치하는 것을 추천한다.

아무튼, 필자의 서버는 svn을 설치했던 적이 있는 서버이기 때문에 3690 port를 사용하지 않을 것이라고 생각해서 fuser로 날렸다. 만약 이미 3690을 사용하고 있다면 다른 포트 번호를 사용해야 한다.

bell22 님 - 프로세스/ps 명령어/pstack 명령어/kill 명령어

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
[root@localhost ~]# sudo fuser -n tcp 3690
sudo: fuser: command not found

[root@localhost ~]# ps -el
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
...
1 S     0 16999     1  0  80   0 - 40546 inet_c ?        00:00:00 svnserve
...

[root@localhost ~]# sudo kill 16999

[root@localhost ~]# sudo systemctl daemon-reload

[root@localhost ~]# sudo systemctl restart svnserve

[root@localhost ~]# sudo systemctl status svnserve
● svnserve.service - Subversion protocol daemon
   Loaded: loaded (/usr/lib/systemd/system/svnserve.service; enabled; vendor preset: disabled)
   Active: active (running) since Fri 2024-07-05 10:42:01 KST; 4s ago
  Process: 16319 (대충 옵션) (code=exited, status=0/SUCCESS)
 Main PID: 16320 (svnserve)
   CGroup: /system.slice/svnserve.service
           └─16320 (대충 옵션)

Jul 05 10:42:01 localhost.localdomain systemd[1]: Starting Subversion protocol daemon...
Jul 05 10:42:01 localhost.localdomain systemd[1]: Started Subversion protocol daemon.

실행 중이던 pid를 삭제하고 시스템 데몬을 재로드 한 뒤, svnserve를 다시 시작하니 무사히 active 되었다.

낄롱 님 - svnserve: Can’t bind server socket: Address already in use.

firewalld is not running

방화벽을 열기 위해 시도했을 때 위 에러가 발생했다. 필자는 아래의 순서대로 명령어를 입력했다.

1
2
3
4
5
systemctl start firewalld

sudo firewall-cmd --zone=public --list-ports

systemctl enable firewalld.service

참고한 블로그 : Migos 님 - FirewallD is not running 해결방법

Unable to connect to repository

필자도 같은 에러가 떴지만 방화벽도 다시 로그하고 데몬도 재로드하고 svnserve도 재시작하니 어느 새 사라져있었다. (이 과정에서 svnserve.conf나 passwd 등을 수정하고 체크 박스도 설정해서 그런 것 같다.) 참고한 블로그를 하단에 적어두겠다.

great-artist 님 - svn : Unable to connect to a repository at URL
에리스 님 - 당황스러운 SVN 서버오류

SVN으로 저장소를 연결해도 add / commit이 되지 않을 때

svn

Settings -> Version Control -> Directory Mappings에서 VCS를 SVN으로 변경하면 된다.
Setting 창 단축키 : Ctrl + Alt + S

SVN : E155004 - SVN locked

svn

해당 오류는 파일에 lock이 걸렸을 경우에 발생한다.

svn

파일이 있는 디렉터리나 lock이 걸린 파일을 CleanUp2 하면 문제 없이 Add 할 수 있다.


참고

wooyung 님 - [2023] Linux Subversion(SVN) 설치 및 구성하기

eugene.yi 님 - [SVN] Intellij - SVN 연동하기

1004lucifer 님 - [IntelliJ] svn: E170013, E230001 - SVN주소 HTTPS 관련 이슈 해결방법

SVN 설치 가이드(리눅스용)

Edward. K 님 - CentOS 7 에서 Subversion 설치 및 설정

버들도령 님 - IntelliJ에서 Subversion (svn) 설치 및 저장소 경로 설정 & Check Out 받기

갱님 - SVN update(up)

  1. SVN 서버에 있는 소스코드를 local로 가져오는 것을 말한다. ↩︎

  2. 이력 정보가 잘못되어 오류가 발생하거나 update / commit 명령어를 사용했을 때 에러가 발생할 경우를 해결하는 방법으로, 비정상적으로 SVN 액션이 종료되었을 때 이를 정리하기 위해 사용한다. ↩︎

이 포스트는 저작권자의 CC BY 4.0 라이센스를 따릅니다.