이전 회사에서 SVN을 사용할 때에는 main trunk에서 주로 작업을 했었다. 작은 팀이어서 각자가 담당하는 디렉토리를 다른사람과 공유할 일도 없고 하다보니 큰 문제는 발생하지 않았다. 일을 시작하기 전과 commit 하기 전에 svn update를 반드시 하기로 약속 했었고, 그런대로 잘 지켜 졌었던 것 같다.

영국에 온후로 윈도우 기반의 서버 개발을 하게 되었다. 회사에서는 오래전부터 써오단 Perforce라는 상용 버젼관리 툴을 사용해 오던 터라, SVN을 사용할 일은 전무 하였다. 그러다가 몇달 전, 새로운 프로젝트가 Linux 기반으로 결정됨에 따라서 다시 SVN과 함께 하게 되었다.

한국에서 하던것과 다른점 하나는, 무엇을 구현하던지 무조건 branch를 만들어서 하라는 것이었다. 개념이야 알고 있었지만 실제로 자주 써보지 않았으니 조금 막연하기도 하고, 한편으로는 코드 한두줄 고치는데도 branch를 만들어야 한다는게 비효율적인것 같았다. 하지만 내 예상외로, 프로젝트의 특성상 작은 코드라도 여러명이 함께 일하게 되는 경우가 상당히 잦았고, 그럴때마다 branch의 유용성을 실감하면서 지금껏 잘 쓰고 있다.

Branch를 만들어서 개발하고, 다시 Trunk에 merge 하는 과정은 단순한것 같으면서도 처음 시작할때는 그렇게 수월하지만도 않은것이 사실이다. 혹시나 이제 막 branch를 사용하려고 하는 사람들을 위해 간략히 정리해 보려고 한다.


1. Branch 생성

Branch를 생성하는것은 매우 간단하다. Trunk를 직접 복사하는 방법도 있으나 가장 효율적이고 확실한 방법은 아래와 같다.

$ svn copy svn+ssh://some_path/trunk \

           svn+ssh://some_path/branches/myBranch \

      -m "Creating my branch"


이렇게 생성된 branch는 checkout을 통해서 사용할 수 있다. 그리고 당연한 이야기지만 본인 말고 다른사람들은 사용할 리가 없으니 안전하다.

$ svn co svn+ssh://some_path/branches/myBranch



2. Branch에서 작업중

Branch에서 작업할 때에는 남들과 상관 없이 마음대로 commit 할 수 있어서 편리하다. 그런데 조금 귀찮은 것이 있다면, 주기적으로 Trunk의 변동 사항을 적용해 주는것이 좋다는 것이다. 미리미리 하지 않으면 나중에 둘이 함께 앉아서 resolving을 해야 하는 더욱더 귀찮은 상황이 발생할 수도 있으니 말이다.

Repositoy 설정이 잘 되어 있다면, Trunk의 변동 사항이 메일로 올것이다. 나는 그럴때마다 변동사항을 내 branch에 적용한다. 적용하는 방법은 간단히 아래와 같다.

$ cd myBranch
$ svn merge svn+ssh://some_path/trunk
  resolve conflicts
$ svn ci -m "Merging my branch with trunk" 


위와 같이하면, 현재 내 디렉토리에 다운로드 받아져 있는 Revision에 Trunk의 변동사항을 적용하게 된다. 이러한 과정을 Merge라고 부른다. 이때 Conflict 들이 발생할 수 있는데, 이를 모두 깔끔히 해결한 후 즉시 commit을 해두도록 한다.


3. Branch 작업 완료 후

Branch에서의 작업이 완료 되면, 이를 다시 Trunk에 적용해야 할것이다. 이부분이 가장 햇갈렸던 부분인데, 구글링을 하다보면 더더욱 햇갈린다. 적어도 나의경우에는 그랬다. 특히나 여러 사람에 의해 trunk에 많은 변경사항이 발생하여, 내 branch가 많이 달라져버린 경우라면 상당히 귀찮은 일들이 발생한다. 

여러가지 방법이 있지만 나의 경우에는 다음과 같은 과정을 통해 Merge into trunk를 수행한다.

첫째, (2) 과정을 수행한다. 이 과정을 Merge into trunk 하기전에 반드시 해두어야만 나중에 Auto resolving이 불가능한 tree conflict를 예방할 수 있다.

$ cd myBranch
$ svn merge svn+ssh://some_path/trunk
  resolve conflicts
$ svn ci -m "Merging my branch with trunk before merging into trunk" 


둘째, 상위 디렉토리에서 Trunk를 하나 새로 checkout 한다. 이 때, 혼동되지 않도록 이름을 잘 짓는다.

$ cd ..
$ svn co svn+ssh://some_path/trunk temp_merge


셋째, repository path와 임시로 받아놓은 싱싱한 Trunk를 이용해 merge를 수행한다. 여기서 빨간 글씨로 써 져 있는 --dry-run은 merge command의 옵션중 하나인데, 이 옵션이 있으면 실제로 merge를 수행하지 않고 테스트만 해보는 것이다. 문제 없는 것 같으면 저 옵션을 제거하고 다시 실행하여 실제로 merge가 되도록 한다.

$ svn merge --dry-run svn+ssh://some_path/trunk \
            svn+ssh://some_path/branches/my_branch \
            temp_merge

if things look find for you

$ svn merge svn+ssh://some_path/trunk \
            svn+ssh://some_path/branches/my_branch \
            temp_merge  



Merge중에는 별의 별 이유로 별의 별 conflict들이 발생할 수 있지만, 첫째 과정을 제대로 수행했다면 conflict이 없어야 정상이다. 있으면 뭔가 이상한 것이니 첫째 과정을 다시 잘 수행하길 권한다. conflict 없는 깨끗한 복사본이 만들어지면, 이를 check in 한다.


$ cd temp_merge
Compile, check sanity... everything is ok? then, 
$ svn ci -m "Merging my branch into main trunk!"



Conflict를 해결하는 방법은 필요시에 적으려고 한다.


WRITTEN BY
RootFriend
개인적으로... 나쁜 기억력에 도움되라고 만들게되었습니다.

,
출처 : http://gyuha.tistory.com/417


xcode 4.0에서 git가 기본 저장소로 오면서 부터..
svn에서 git로 프로젝트를 전환하려고 하고 있습니다.
우선은 2개를 같이 쓰기 위해서..
하지만, 2개의 관리 툴이 서로를 add해 버리면, 난감해서 ^^;;
서로를 예외로 추가하는 방법을 정리 합니다.

둘다 global 설정을 건드려서 설정하는 방법입니다.

1. git 설정하기..

$ vi ~/.gitignore


이렇게 추가해 줍니다.
 
.svn
.DS_Store
build
xcuserdata

그리고, 

$ git config --global core.excludesfile ~/.gitignore


이렇게 실행해 줍니다.
확인해 보시면, 

$ cat .gitconfig 
[core]
    quotepath = false
    excludesfile = /Users/userid/.gitignore
[user]
    name = Gyuha Shin
    email = userid@mail.com

아.. 여기서, core나 user 정보는 기존에 입력해 놓은 자료입니다.

2. svn 설정하기

$ vi ~/.subversion/config


global-ignores를 찾아서 #으로 되어 있는 주석을 풀어 주시고, .git build xcuserdata등을 추가해 줍니다.

[miscellany]
global-ignores = *.o *.lo *.la *.al .libs *.so *.so.[0-9]* *.pyc *.pyo .DS_Store .git build xcuserdata

혹시.. ~/.subversion 폴더가 존재 하지 않으신 분들은.. 

http://mcchae.egloos.com/10610082

svn에서 한글 문제 없이 사용하기 글을 참고 해서.. 설치해 보세요. ^^;
맥에서 한글 파일명을 사용하시는 분들이 svn을 사용 할려면, 이건 해 줘야 합니다.
버전이 1.6.15 버전 까지는 위의 방법으로 패치해도 문제가 없는건 확인 했습니다.

WRITTEN BY
RootFriend
개인적으로... 나쁜 기억력에 도움되라고 만들게되었습니다.

,

출처 : http://lovian.tistory.com/2690059

이미 많은 사람들이 알고 있는것 같지만, 난 이제 알았으니까 기록해본다. :)

내 환경이
subversion 서버는 linux
프로젝트 서버는 linux
프로젝트 클라이언트는 windows/linux

이어서. 클라이언트 작업중에 혼선이 많다.
사실 vim 같은 녀석으로 작업을하면 알아서 잘 변환하여 보여주므로 상관이 없다.

그런데 워낙에 unix 환경에서 놀다보니 AIX 같은 특이 시스템에서는 CRLF(dos)도 되어 있는,
파일을 올바르게 분석하지 못하는 경우가 많다.

그런 이유로 모든 소스 코드는 unix 타입으로 저장하기로 하였는데,
윈도우 개발에 큰 문제가 발생하였다.

빌드나 테스트에는 아무 지장이 없지만, 디버깅모드에 들어가면 LF(unix)로 되어 있는 소스는
현재 실행중인 소스코드의 라인을 올바르게 보여주지 못한다.

결국 CRLF 형식이 아니면, 윈도우에서는 죽을 만큼 괴로운 개발을 해야된다는 소리.

이 모든 불만을 해소하기 위해서 찾아낸 결과가

svn property이다.

현재 올라가 있는 파일에 대해서 속성을 거는 것으로,
svn:eol-style라는 녀석이 존재한다.
이 설정 값에 따라서 해당파일의 End Of Line 저장 형식을 선택할 수 있게된다.

native

This causes the file to contain the EOL markers that are native to the operating system on which Subversion was run. In other words, if a user on a Windows machine checks out a working copy that contains a file with an svn:eol-style property set to native, that file will contain CRLF EOL markers. A Unix user checking out a working copy which contains the same file will see LF EOL markers in his copy of the file.


Note that Subversion will actually store the file in the repository using normalized LF EOL markers regardless of the operating system. This is basically transparent to the user, though.


CRLF

This causes the file to contain CRLF sequences for EOL markers, regardless of the operating system in use.


LF

This causes the file to contain LF characters for EOL markers, regardless of the operating system in use.


CR

This causes the file to contain CR characters for EOL markers, regardless of the operating system in use. This line ending style is not very common. It was used on older Macintosh platforms (on which Subversion doesn't even run).



요 native가 핵심인 듯하다, subversion 클라이언트가 작동하는 시스템에 맞는 개행문자로 변환하여 가져온다는 소리로 들린다.

svn propset [FILE] 의 명령으로 각각의 파일 마다 적용해야 한다.
윈도우의 경우 (tortoise를 이용하다고 가정)탐색기를 이용하여 원하는 디렉터리 이하의 모든 h, c, cpp 파일을 검색하여 선택후,
등록정보 혹은 속성 메뉴로 들어가 subversion 탭에서 property 설정을 해주면 된다.

자, 이제 마무리,
이렇게 속성 설정하여 사용하는 중에 새로은 소스가 추가되면 또 이짓을 해야 할까?
그렇지 않다.

subversion 클라이언트의 설정에, 패턴을 적용하여 그에 맞는 파일이 추가되면 자동으로 속성을 정해주는 기능이 있다. 

linux

${HOME}/.subversion/config


windows
windows 7

notepad "%APPDATA%\Subversion\config"


이 파일에서 아래와 같이 설정 할 수 있다.

[miscellany]

### Set global-ignores to a set of whitespace-delimited globs

### which Subversion will ignore in its 'status' output, and

### while importing or adding files and directories.

# global-ignores = *.o *.lo *.la #*# .*.rej *.rej .*~ *~ .#* .DS_Store

### Set log-encoding to the default encoding for log messages

# log-encoding = latin1

### Set use-commit-times to make checkout/update/switch/revert

### put last-committed timestamps on every file touched.

# use-commit-times = yes

### Set no-unlock to prevent 'svn commit' from automatically

### releasing locks on files.

# no-unlock = yes

### Set enable-auto-props to 'yes' to enable automatic properties

### for 'svn add' and 'svn import', it defaults to 'no'.

### Automatic properties are defined in the section 'auto-props'.

enable-auto-props = yes


### Section for configuring automatic properties.

[auto-props]

### The format of the entries is:

###   file-name-pattern = propname[=value][;propname[=value]...]

### The file-name-pattern can contain wildcards (such as '*' and

### '?').  All entries which match will be applied to the file.

### Note that auto-props functionality must be enabled, which

### is typically done by setting the 'enable-auto-props' option.

*.c = svn:eol-style=native

*.cpp = svn:eol-style=native

*.h = svn:eol-style=native

 

이렇게 수정하면,
해당 subversion 클라이언트에서는 파일을 신규로 추가할때마다, 해당 패턴에 일치하는 경우, 여기서 설정해준 property가 자동으로 같이 등록된다. 


WRITTEN BY
RootFriend
개인적으로... 나쁜 기억력에 도움되라고 만들게되었습니다.

,