λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
πŸ‘¨‍πŸ’» web.dev/ops

SVN 을 μ΄μš©ν•œ ν˜•μƒκ΄€λ¦¬ PART.1 - SVN μ΄λž€?

by HandHand 2022. 3. 1.

SVN 을 μ΄μš©ν•œ ν˜•μƒ 관리

πŸ“Œ svn? git?

비ꡐ적 μ΅œκ·Όμ— κ°œλ°œμ„ μ ‘ν•œ κ°œλ°œμžλ“€μ—κ²ŒλŠ” μƒμ†Œν•œ SVN 에 λŒ€ν•΄μ„œ μ•Œμ•„λ³΄λŠ” ν¬μŠ€νŠΈμž…λ‹ˆλ‹€.

ν˜„μž¬ μΌν•˜κ³  μžˆλŠ” νšŒμ‚¬μ—μ„œλŠ” λ³΄μ•ˆμ„± 이슈둜 ν•œλ™μ•ˆ Git 을 μ‚¬μš©ν•˜μ§€ λͺ»ν•˜κΈ° λ•Œλ¬Έμ—

이λ₯Ό λŒ€μ‹ ν•΄μ„œ SVN 으둜 ν”„λ‘œμ νŠΈ 버전관리λ₯Ό μ§„ν–‰ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

 

처음 μ ‘ν•΄λ³΄λŠ” 버전관리 μ‹œμŠ€ν…œμ— λŒ€ν•΄μ„œ μ•Œμ•„λ³΄κ³  이λ₯Ό 잘 ν™œμš©ν•  수 μžˆλŠ” 방법을 μ •ν•˜κΈ° μœ„ν•΄μ„œ

찾아보고 μ •λ¦¬ν•œ λ‚΄μš©λ“€μ„ κ³΅μœ ν•˜λ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€. πŸ˜„

 

πŸ“Œ κ·Έλ ‡λ‹€λ©΄ SVN은 λ¬΄μ—‡μΈκ°€μš”?

μ•„νŒŒμΉ˜ μ„œλΈŒλ²„μ „(Subversion) 은 ν”„λ‘œμ νŠΈ 버전 관리λ₯Ό μœ„ν•΄ μ‚¬μš©ν•˜λŠ” ν˜•μƒκ΄€λ¦¬ νˆ΄μž…λ‹ˆλ‹€.

또 λ‹€λ₯Έ ν˜•μƒκ΄€λ¦¬ νˆ΄μ΄μ—ˆλ˜ CVS 의 λ‹€μŒκ³Ό 같은 ν•œκ³„μ μ„ κ·Ήλ³΅ν•˜κΈ° μœ„ν•΄ κ°œλ°œλ˜μ—ˆμŠ΅λ‹ˆλ‹€.

 

πŸ’‘ CVS 의 ν•œκ³„μ μ€?

1. CVS μ €μž₯μ†Œμ˜ νŒŒμΌλ“€μ€ 이름을 λ³€κ²½ν•  수 μ—†μŠ΅λ‹ˆλ‹€.
2. CVS μ—μ„œλŠ” λ””λ ‰ν† λ¦¬μ˜ μ΄λ™μ΄λ‚˜ 이름 변경을 ν—ˆμš©ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
3. μœ λ‹ˆμ½”λ“œλ‘œ 된 νŒŒμΌμ΄λ¦„μ„ μ œν•œμ μœΌλ‘œ μ§€μ›ν•©λ‹ˆλ‹€.

 

SVN 은 ν΄λΌμ΄μ–ΈνŠΈ μ„œλ²„ λͺ¨λΈ 을 λ”°λ₯΄λ„둝 κ΅¬ν˜„λ˜μ–΄μžˆμœΌλ©°,

μ„œλ²„λŠ” μž‘μ—…ν•˜λŠ” 컴퓨터 ν˜Ήμ€ λ³„λ„μ˜ 컴퓨터에 ν• λ‹Ήν•˜μ—¬ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

πŸ“Œ SVN 은 쀑앙집쀑식 버전관리 μ‹œμŠ€ν…œμž…λ‹ˆλ‹€.

1

SVN 은 Git κ³Ό 달리 쀑앙집쀑식 버전관리 μ‹œμŠ€ν…œ(Centralized version control)μž…λ‹ˆλ‹€.

이 λ°©μ‹μ—μ„œλŠ” 각각의 κ°œλ°œμžλ“€μ΄ 본인의 μ½”λ“œ λ³€κ²½ 사항을 ν•˜λ‚˜μ˜ 쀑앙 repository 에

commit ν•˜λŠ” λ°©μ‹μœΌλ‘œ μš΄μ˜λ©λ‹ˆλ‹€.

이해가 μ§κ΄€μ μ΄λΌλŠ” μž₯점이 μžˆμ§€λ§Œ 쀑앙 μ„œλ²„μ— λ¬Έμ œκ°€ 생길 κ²½μš°μ—λŠ”

μ„œλΉ„μŠ€ μžμ²΄κ°€ μ€‘λ‹¨λ˜λŠ” ν˜„μƒμ΄ λ°œμƒν•  수 μžˆλ‹€λŠ” 점이 λ‹¨μ μž…λ‹ˆλ‹€.

 

2

 

반면 Git μ—μ„œλŠ” μœ„μ™€ 같이 쀑앙 repository λ₯Ό ν†΅μ§Έλ‘œ λ³΅μ‚¬ν•œ λ³„λ„μ˜ repository λ₯Ό

각 κ°œλ°œμžλ“€μ΄ 가지고 있으며, κ°œλ°œμžλŠ” λ³€κ²½ 사항을 ν•΄λ‹Ή 둜컬 repository 에 λ°˜μ˜ν•˜κ³ ,

μ΅œμ’…μ μœΌλ‘œ 이 변경사항을 쀑앙 repository 에 λ°˜μ˜ν•˜κΈ° μœ„ν•΄ pull request λ₯Ό μš”μ²­ν•©λ‹ˆλ‹€.

 

πŸ“Œ SVN μ—μ„œ μ‚¬μš©ν•˜λŠ” μš©μ–΄ 정리

Repository

server 의 역할을 ν•˜λ©° 개발자의 μ½”λ“œ 및 νžˆμŠ€ν† λ¦¬κ°€ κ΄€λ¦¬λ˜λŠ” κ³³μž…λ‹ˆλ‹€.

κ°œλ°œμžλŠ” repository λ‘œλΆ€ν„° λ‹€λ₯Έ κ°œλ°œμžκ°€ λ°˜μ˜ν•œ μ½”λ“œλ₯Ό μ—…λ°μ΄νŠΈ ν•  수 있고

μžμ‹ μ΄ μˆ˜μ •ν•œ 내역을 λ°˜μ˜ν•˜μ—¬ λ‹€λ₯Έ κ°œλ°œμžμ™€ κ³΅μœ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

Trunk

Trunk λŠ” ν”„λ‘œμ νŠΈμ˜ 쀑심이 λ˜λŠ” κΈ°λ‘₯ κ³Ό 같은 μ €μž₯μ†Œμž…λ‹ˆλ‹€.
μ΅œμ’… λ°˜μ˜λ˜μ–΄μ•Ό ν•˜λŠ” μ†ŒμŠ€μ½”λ“œ 버전을 주둜 Trunk μ—μ„œ μœ μ§€ν•©λ‹ˆλ‹€.

Tags

Tags λŠ” 진행쀑인 ν”„λ‘œμ νŠΈμ˜ νŠΉμ • 버전 μŠ€λƒ…μƒ·μ— μ˜λ―Έκ°€ μžˆλŠ” 이름을 뢙인 κ²ƒμž…λ‹ˆλ‹€.

이λ₯Ό μœ„ν•΄μ„œλŠ” ν•΄λ‹Ή 버전이 λ‹€λ₯Έ 버전과 κ΅¬λΆ„λ˜λŠ” λͺ…ν™•ν•œ 이름을 λΆ™μ΄λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€.

Branches

Branches λŠ” 개발 도쀑 ν”„λ‘œμ νŠΈ μ½”λ“œμ— μƒˆλ‘œμš΄ 가지λ₯Ό μΉ˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

배포된 λ²„μ „μ—μ„œ 버그λ₯Ό μˆ˜μ •ν•˜κ±°λ‚˜, μƒˆλ‘œμš΄ κΈ°λŠ₯을 μΆ”κ°€ν•  λ•Œ ν™œμš©ν•©λ‹ˆλ‹€.

Working Copy

Working Copy λŠ” repository 의 μŠ€λƒ…μƒ·μž…λ‹ˆλ‹€.

repository λŠ” λͺ¨λ“  κ°œλ°œμžκ°€ κ³΅μœ ν•˜μ§€λ§Œ μ§μ ‘μ μœΌλ‘œ μˆ˜μ •ν•˜μ§€λŠ” μ•ŠμŠ΅λ‹ˆλ‹€.

λŒ€μ‹  κ°œλ°œμžλŠ” 각자의 working copy 에 checkout ν•˜κ³  본인의 μž‘μ—…μ„ μ§„ν–‰ν•©λ‹ˆλ‹€.

Commit

Commit 은 κ°œλ°œμžκ°€ μž‘μ„±ν•œ μ½”λ“œμ˜ 변경사항을 본인의 working copy μ—μ„œ

쀑앙 repository 둜 λ°˜μ˜ν•˜λŠ” 것을 μ˜λ―Έν•©λ‹ˆλ‹€.

Commit μž‘μ—…μ€ atomic ν•˜κΈ° λ•Œλ¬Έμ— μ „λΆ€ μ„±κ³΅ν•˜κ±°λ‚˜ μ‹€νŒ¨ν•˜μ—¬ μΌλΆ€λ§Œ λ°˜μ˜λ˜λŠ” 일은 μ—†μŠ΅λ‹ˆλ‹€.

반영된 λ‚΄μš©μ€ λ‹€λ₯Έ κ°œλ°œμžκ°€ 본인의 working copy 둜 μ—…λ°μ΄νŠΈν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

πŸ“Œ SVN 을 ν™œμš©ν•œ 버전관리 νŠœν† λ¦¬μ–Ό

1️⃣ svn repository μƒμ„±ν•˜κΈ°

μš°μ„  예제λ₯Ό μœ„ν•œ 디렉토리λ₯Ό μƒμ„±ν•˜κΈ°μœ„ν•΄ λ‹€μŒ λͺ…λ Ήμ–΄λ₯Ό μž…λ ₯ν•©λ‹ˆλ‹€.

> svnadmin create --fs-type fsfs svn-example

 

2️⃣ svn repository 접근방식 μ„€μ •ν•˜κΈ°

repository 에 μ ‘κ·Όν•˜κΈ° μœ„ν•œ μ—¬λŸ¬κ°€μ§€ 방법이 μžˆλŠ”λ° 이번 μ˜ˆμ œμ—μ„œλŠ” κ°€μž₯ 기본적으둜

μ œκ³΅ν•΄μ£ΌλŠ” svnserve λΌλŠ” μ„œλ²„ ν”„λ‘œκ·Έλž¨μ„ ν™œμš©ν•˜κ² μŠ΅λ‹ˆλ‹€.

μš°μ„  인증에 μ‚¬μš©ν•  방법을 μ„€μ •ν•˜κΈ° μœ„ν•΄ svn-example/conf/svnserve.conf λ₯Ό μˆ˜μ •ν•©λ‹ˆλ‹€.

[general]
## ...
## ...
password-db = passwd # 이 λΆ€λΆ„ 주석을 μ œκ±°ν•©λ‹ˆλ‹€.

 

이제 μœ μ €κ³„μ •μ •λ³΄λ₯Ό μž…λ ₯ν•˜κΈ° μœ„ν•΄ passwd νŒŒμΌμ„ μˆ˜μ •ν•©λ‹ˆλ‹€.

[users]
# harry = harryssecret
# sally = sallyssecret
handhand = password

 

3️⃣ SVN μ„œλ²„ μ‹€ν–‰ν•˜κΈ°

λ‹€μŒ λͺ…λ Ήμ–΄λ₯Ό 톡해 svn μ„œλ²„λ₯Ό 데λͺ¬μœΌλ‘œ μ‹€ν–‰ν•©λ‹ˆλ‹€.

> svnserve -d -r svn-example

netstat λͺ…λ Ήμ–΄λ‘œ ν˜„μž¬ 데λͺ¬λͺ¨λ“œμ—μ„œ μ„œλ²„κ°€ μ—΄λ €μžˆλ‹€λŠ” 것을 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

> netstat -na | grep 3690
tcp4    0   0  *.3690       *.*            LISTEN

 

4️⃣ trunk, branches, tags 디렉토리 μƒμ„±ν•˜κΈ°

λ§ˆμ§€λ§‰μœΌλ‘œ svn mkdir λͺ…λ Ήμ–΄λ‘œ trunk, branches, tags 디렉토리λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€.

> svn mkdir svn://localhost/svn-example/trunk --username handhand
> svn mkdir svn://localhost/svn-example/branches --username handhand
> svn mkdir svn://localhost/svn-example/tags --username handhand

 

πŸ’‘ λ§Œμ•½ 이 κ³Όμ •μ—μ„œ λ§Œμ•½ λ‹€μŒκ³Ό 같은 였λ₯˜κ°€ λ°œμƒν•œλ‹€λ©΄...

svn mkdir λͺ…λ Ήμ–΄ μˆ˜ν–‰ μ‹œ λ‹€μŒκ³Ό 같은 였λ₯˜κ°€ λ°œμƒν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

svn: E205007: 둜그 λ©”μ‹œμ§€λ₯Ό κ΅¬ν•˜κΈ° μœ„ν•΄ μ™ΈλΆ€ ν”„λ‘œκ·Έλž¨μ„ μ‚¬μš©ν•  수 μ—†μŠ΅λ‹ˆλ‹€. SVN_EDITOR ν™˜κ²½λ³€μˆ˜λ₯Ό μ„€μ •ν•˜μ‹œκ±°λ‚˜ --message (-m) λ˜λŠ” --file (-F) μ˜΅μ…˜μ„ μ‚¬μš©ν•˜μ„Έμš”
svn: E205007: ν™˜κ²½λ³€μˆ˜ SVN_EDITOR, VISUAL, EDITOR 쀑 ν•˜λ‚˜λŠ” μ„€μ •ν•˜κ±°λ‚˜, 'editor-cmd' λ₯Ό ꡬ성화일에 λͺ…μ‹œν•΄μ•Όν•©λ‹ˆλ‹€

 

이 경우 본인이 μ‚¬μš©ν•˜κ³  μžˆλŠ” μ‰˜μ˜ μ„€μ • 파일의 맨 ν•˜λ‹¨μ— λ‹€μŒκ³Ό 같이 섀정을 μΆ”κ°€ν•΄μ€λ‹ˆλ‹€.

μ €μ˜ 경우 zsh 을 μ‚¬μš©ν•˜κ³  있기 λ•Œλ¬Έμ— zshrc λ₯Ό μ—΄μ–΄μ„œ λ‹€μŒ μ½”λ“œλ₯Ό μΆ”κ°€ν•΄μ€¬μŠ΅λ‹ˆλ‹€.

SVN_EDITOR=/usr/bin/vim
export SVN_EDITOR

 

이후 λ³€κ²½λœ 섀정을 μ μš©ν•˜κΈ° μœ„ν•΄ λ‹€μŒ λͺ…λ Ήμ–΄λ₯Ό μˆ˜ν–‰ν•΄μ€λ‹ˆλ‹€.

> soruce ~/.zshrc

 

5️⃣ 디렉토리가 μ˜¬λ°”λ₯΄κ²Œ μƒμ„±λ˜μ—ˆλŠ”μ§€ ν™•μΈν•˜κΈ°

svn list λͺ…λ Ήμ–΄λ₯Ό ν†΅ν•΄μ„œ μœ„ 디렉토리듀이 λ¬Έμ œμ—†μ΄ μƒμ„±λ˜μ—ˆλŠ”μ§€ ν™•μΈν•©λ‹ˆλ‹€.

> svn list svn://localhost/svn-example                              
branches/
tags/
trunk/

 

6️⃣ SVN ν”„λ‘œμ νŠΈ μƒμ„±ν•˜κΈ°

μƒμ„±λœ repository 둜 μ΄λ™ν•œ λ’€ ν”„λ‘œμ νŠΈ μž‘μ—…μ„ μœ„ν•œ 곡간을 μƒμ„±ν•©λ‹ˆλ‹€.

> cd svn-example
> mkdir workspace

 

그리고 ν”„λ‘œμ νŠΈ 진행을 μœ„ν•œ μœ„ ν”„λ‘œμ νŠΈλ₯Ό svn repository 에 μ˜¬λ¦¬λŠ”λ°,

이 μž‘μ—…μ„ import 라고 ν•©λ‹ˆλ‹€.

> svn import workspace svn://localhost/svn-example/trunk --username handhand

 

7️⃣  SVN ν”„λ‘œμ νŠΈ κ°€μ Έμ˜€κΈ°

repository 에 등둝을 마친 ν”„λ‘œμ νŠΈλ₯Ό 이제 λ‹€λ₯Έ κ°œλ°œμžλ“€μ΄ 가져와 μž‘μ—…μ„ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

이 과정을 checkout 이라고 ν•˜λ©° λ‹€μŒκ³Ό 같은 λͺ…λ Ήμ–΄λ‘œ μˆ˜ν–‰ κ°€λŠ₯ν•©λ‹ˆλ‹€.

> svn co svn://localhost/svn-example --username handhand workspace
A    workspace/branches
A    workspace/tags
A    workspace/trunk
A    workspace/trunk/example.js

 

8️⃣ SVN 변경사항 λ°˜μ˜ν•˜κΈ°

이제 μ„œλ‘œ λ‹€λ₯Έ μ‚¬λžŒμ΄ λ³€κ²½ 사항을 κ°€μ Έμ˜€λŠ” 방법을 κ°€μ •ν•˜κΈ° μœ„ν•΄μ„œ

sam κ³Ό david λΌλŠ” κ°€μƒμ˜ κ°œλ°œμžλ“€μ˜ μž‘μ—… 곡간을 μƒμ„±ν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

이 두 개발자 λͺ¨λ‘ λ™μΌν•œ repository μ—μ„œ μž‘μ—…ν•˜κΈ° λ•Œλ¬Έμ— μœ„ μ €μž₯μ†Œλ₯Ό checkout ν•©λ‹ˆλ‹€.

> mkdir sam
> svn co svn://localhost/svn-example --username handhand workspace

> mkdir david
> svn co svn://localhost/svn-example --username handhand workspace

 

이후 sam 은 λ‹€μŒκ³Ό 같이 test.js 에 μƒˆλ‘œμš΄ μ½”λ“œλ₯Ό μΆ”κ°€ν•©λ‹ˆλ‹€.

// test.js

console.log('hello svn!')

 

그리고 svn status λͺ…λ Ήμ–΄λ‘œ ν˜„μž¬ 버전관리 μƒνƒœλ₯Ό 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

> cd sam/workspace
> svn status
M       trunk/test.js

 

μˆ˜μ •λœ 파일 λ‚΄μš©μ„ λ°˜μ˜ν•˜κΈ° μœ„ν•΄μ„œ λ‹€μ‹œ commit 을 μˆ˜ν–‰ν•©λ‹ˆλ‹€.

> svn commit -m "modify test.js"
전솑쀑         trunk/test.js
파일 데이터 전솑쀑 .done
Committing transaction...
μ»€λ°‹λœ 리비전 7.

 

이제 david 의 μž‘μ—… κ³΅κ°„μ—μ„œ μˆ˜μ •λœ λ‚΄μš©μ„ κ°€μ Έμ˜΅λ‹ˆλ‹€.

μ΄λŠ” update ν˜Ήμ€ up λͺ…λ Ήμ–΄λ₯Ό ν†΅ν•΄μ„œ μˆ˜ν–‰ κ°€λŠ₯ν•©λ‹ˆλ‹€.

> svn up
Updating '.':
U    trunk/test.js
μ—…λ°μ΄νŠΈ 된 리비전 7.

 

πŸ“Œ κ·Έλ ‡λ‹€λ©΄ 효율적인 SVN 버전 관리 방법은?

SVN 으둜 버전관리 μ‹œμŠ€ν…œμ„ μ‚¬μš©ν•  경우 μ–΄λ–€ λ°©μ‹μœΌλ‘œ μ €μž₯μ†Œλ₯Ό 관리할 지 선택이 ν•„μš”ν•©λ‹ˆλ‹€.

큰 ν‹€μ—μ„œ λ‹€μŒκ³Ό 같이 두 가지 방법이 μžˆμ„ 수 μžˆμŠ΅λ‹ˆλ‹€.

trunk, branches, tags λ₯Ό μ΅œμƒμœ„ λ””λ ‰ν† λ¦¬λ‘œ ν•˜κΈ°

3

 

각 ν”„λ‘œμ νŠΈλ₯Ό μ΅œμƒμœ„ λ””λ ‰ν† λ¦¬λ‘œ ν•˜κΈ°

4

ν”„λ‘œμ νŠΈ 성격에 따라 λ‹€λ₯΄κ² μ§€λ§Œ 적은 인원과 규λͺ¨κ°€ 크지 μ•Šμ€ ν”„λ‘œμ νŠΈμ—μ„œλŠ”

μœ„μ™€ 같은 ꡬ쑰둜 μ§„ν–‰ν•˜λ”λΌλ„ 큰 λ¬Έμ œκ°€ 없을 것 κ°™λ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€.

ν•˜μ§€λ§Œ ν˜„μž¬ μ œκ°€ νšŒμ‚¬μ—μ„œ μ§„ν–‰ν•˜κ³  μžˆλŠ” ν”„λ‘œμ νŠΈμ˜ 규λͺ¨μ—μ„œλŠ” μœ„μ™€ 같은 κ΅¬μ‘°λ§ŒμœΌλ‘œλŠ”

관리가 μ–΄λ ΅λ‹€κ³  νŒλ‹¨μ΄ λ“€μ–΄ 쒀더 ꡬ체적인 μ „λž΅μ΄ ν•„μš”ν–ˆμŠ΅λ‹ˆλ‹€.

이λ₯Ό μœ„ν•œ κ³ λ―Όκ³Ό μ΅œμ’…μ μœΌλ‘œ κ²°μ •λœ 관리 방법은 λ‹€μŒ ν¬μŠ€νŠΈμ—μ„œ λ§Œλ‚˜λ³΄λ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€. 😁

참고 자료

μ•„νŒŒμΉ˜ μ„œλΈŒλ²„μ „ - μœ„ν‚€λ°±κ³Ό, 우리 λͺ¨λ‘μ˜ 백과사전

SVN μ΄λž€

Centralized vs Distributed Version Control Systems

SVN Tutorial

svn trunk, tags, branches κΈ°λ³Έ 디렉토리 λ§Œλ“€κΈ°

SVN Tutorial λ¬Έμ„œ

λ°˜μ‘ν˜•

πŸ’¬ λŒ“κΈ€