Home | Info | Research | Blog | Repos | Messages | Contact Me

 


"CVS에서 Subversion으로 바꾸기, 좋을까(http://cwryu.tistory.com/17)"라는 글이 많은 사람들에게 인용되고 있고 마치 전문가의 글인것 처럼 전달되면서 편협된 정보를 전달할 우려가 있어, 제가 이에 대한 반박을 하고자 합니다.

그놈 CVS가 subversion으로 전환한 이후 얼마가 지났으나 사실 큰 장점을 못 느끼는 게 사실이다.  애초에 subversion은 cvs와 같은 모델의 vc를 만들면서 cvs의 단점을 보완하는 게 목적이었고, 사용법부터 시작해서 크게 다르지 않다.  흔히 cvs와 비교해 장점이라고 하는 것들을 살펴보면:
1. renaming, file property 따위의 versioning

안정된 프로젝트일 수록 디렉토리 이름을 바꾸는 일은 그리 많지 않다.  (과거에 회사에서 오타가 섞인 이름마저 끝내 바꾸지 못했던 기억이 있다.)

바꾸어 말하면 안정된 프로젝트까지 가기에는 여러가지 바뀔게 많다는 소리인데, 이런 상황에서는 어쩌란 말인지? 거기다 오타가 섞인 이름을 끝내 바꾸지 못했다는 것을 당연하다는 듯이 이야기 하는 것도 정말 어처구니가 없습니다.

버전 관리 시스템을 사용한다는 것은 잘못된 것은 수정하고 그 기록을 남기기 위해서 사용하는 것입니다. CVS에서 이름 바꾸기가 잘 되지 않는다고 잘못된 것을 방치하는 것은 주객이 전도된 상황이 아닌가요?

이 주장은 단점도 아닌데(아주 당연한 기능인데) 단점을 만들기 위해 근거를 끼워 맞춘것에 불과합니다.

2. atomic commit/tag

CVS의 commit/tag가 atomic이 아니라고 해서 문제가 될 상황도 별로 많지 않다.  오히려 (사람이 직접 신경 쓰지 않으면 해결할 방법이 없는) 논리적인 충돌이 더 많이 발생한다.

문제가 될 상황이 별로 많지 않다는 것은 한번이라도 문제가 생길 수 있다는 소리이며, 커밋과 태깅을 하다가 중간에 짤리면 그것을 수정하기 위해 엄청난 시간과 노력이 소비된다는 것을 알아야 합니다.

Subversion은 커밋과 태깅이 atomic 해서 이런 문제가 전혀 발생하지 않으므로 여기에 소비되는 시간과 노력을 절약할 수 있습니다.

논리적 충돌은 곧 버그를 의미하며 이것을 안고치면 계속 버그로 남아있을 텐데 당연히 신경을 쓸 수 밖에 없습니다. 그리고 이런 이유로 atomic 커밋이 별 장점이 되지 않는다고 주장하는 것은 문제의 핵심을 벗어난 것입니다.

atomic 커밋, 태깅의 핵심은 이것을 지원하지 않음으로 인해서 생기는 문제가 어떤 것이냐는 것입니다.

3. lightweight branching

이 부분은 서버의 로드와 관련된 것이므로, 알기 어렵다.  분명히 장점이다.

알기 어려우면 왜 적었는지 모르겠습니다. 제가 다시 설명하자면, Subversion은 태깅 및 브랜칭을 할 때 내부적으로 링크만 생성하는 것이기 때문에 서버측의 로드는 거의 제로에 까깝습니다.

4. diff/revert에 네트워크 연결이 필요없다

이것만은 확실히 좋다는 걸 느낀다.  cvs는 diff를 할 때마다 해당 파일의 전체 내용을 전송받는데, 유럽에 있는 gnome cvs 서버에서 이 내용을 받는 건 만만치 않은 일이다.  심심풀이 해커도 그리 느끼는데 업으로 삼는 사람들은 더더욱 좋다고 생각할 듯.

서버가 멀리있는 사람 뿐만 아니라 내부 네트워크에서도 이런 차이가 쾌적한 개발 환경을 제공해 준다는것을 간과하고 있습니다.

subversion은 cvs와 비교해 분명한 장점이 있으나 멀쩡히 안정적으로 잘 돌아가는 닫힌 프로젝트의 vcs를 cvs에서 svn으로 바꾸는 일은 별로 추천하지 못하겠다.  옮겨가는 데 별로 무리도 없지만 얻는 장점도 별로 없기 때문이다.  (gnome처럼 vcs 이용자가 워낙 많고 세계 여기저기에 퍼져 있는 경우라면 위의 3/4 항목으로 큰 이득을 볼 수도 있겠지만)

쓰는 사람 입장에서 CVS가 불편하다면 닫힌 프로젝트라도 바꾸는 것이 당연하고, 얻는 장점도 별로 없는 것이 아니라, 인용글에서 제시한 1, 2, 3, 4번의 장점을  장점을 모두 얻을 수 있는데, 뭔 장점이 별로 없다는 것인지 모르겠습니다.

저는 CVS에서 Subversion 전환을 강요할 목적은 전혀 없습니다. 하지만 잘못된 정보가 전달되는 것을 막기 위해 이렇게 글을 썻음을 다시 한번 알려드립니다.



윈도우와 유닉스는 시간단위가 달라서 서로 호환이 안됩니다.

윈도우 시간은 64비트 정수에 1601년 1월 1일 부터 100나노 초 단위로 1씩 증가하고, 유닉스 시간은 32비트 정수에 1970년 1월 1일부터 1초 단위로 1씩 증가합니다.

특히나 윈도우에서 사용되는 C 표준함수(C Run-Time Library)들은 유닉스와 같이 1970년 1월 1일을 기준으로 날짜를 처리합니다.

그래서 윈도우 API와 C 표준함수를 섞어서 프로그램을 만들었을 경우 시간 단위가 맞지 않게 됩니다. 윈도우 API만 사용하거나 C 표준함수만 사용하여 프로그램을 만드는 것이 좋겠지만 섞어서 쓰게되는 경우가 있을 수 있습니다. 예를 들면 유닉스(리눅스)의 프로그램을 윈도우에 포팅한다거나 그 반대의 경우입니다. 이럴 때 두 시간 단위를 어떻게 변환하는지 설명하겠습니다.

윈도우 시간에서 유닉스 시간으로 변환
윈도우 시간은 1601년 부터 시작했고 유닉스 시간은 1970년 부터 시작했기 때문에 먼저 시작한 윈도우 시간이 훨씬 숫자가 큽니다. 윈도우 시간 단위(100나노 초)를 유닉스 시간 단위(1초)로 변환 한 뒤, 1601에서 1970년의 차이인 369년을 빼주면 됩니다.

유닉스 시간에서 윈도우 시간으로 변환
위와 반대로 유닉스 시간이 나중에 시작 했기 때문에 윈도우 시간보다 숫자가 작습니다. 유닉스 시간 단위(1초)에서 윈도우 시간 단위(100나노 초)로 변환한 뒤 1601년과 1970년의 차이인 369년을 더해주면 됩니다.

그럼 이제 실제로 계산을 해보겠습니다.

윈도우 -> 유닉스
윈도우 시간 / 10000000을 하면 유닉스 시간 단위인 1초 단위가 됩니다. 1초는 1000000000나노 초이기 때문에 윈도우에서는 1초가 10000000입니다. (100나노초가 최소 단위이므로)

여기에 369년을 뺍니다. 369년 x 365일 = 134685일이고 여기에 89일을 뺀 134774일을 빼야 합니다. 왜 89일이냐하면 1601년과 1970년 사이에 윤년이 계산상으로는 92개지만, 한 세기가 시작하는 해는 윤년이 아닙니다. 즉 1700, 1800, 1900년은 윤년이 아니므로 이 3개를 제외하면 실제 윤년은 89개가 됩니다. (윤년은 하루가 더 길기 때문에 때문에 89일이 됩니다.)

(참고로 한 세기가 시작하는 해라고 하더라도 400으로 나누어 떨어지는 해는 윤년이 아닙니다. 즉 1600년, 2000년은 윤년이 아닙니다.)

134774일을 초로 바꾸면 134774일 x 24시간 x 60분 x 60초 = 11644473600초가 되고 유닉스 시간단위로 변환한 값에 11644473600초를 빼면 됩니다.

유닉스 -> 윈도우
유닉스 시간에 11644473600초를 먼저 더한 값을 윈도우 시간 단위로 변환합니다. 유닉스 시간 * 10000000을 하면 100나노 초 단위인 윈도우 시간이 됩니다. (윈도우 시간으로 먼저 변환한 뒤 100나노초 단위인 116444736000000000을 더해줘도 됩니다.) 물론 변수는 64비트 정수형을 사용해야 하겠죠.

간단하게 하면 정리를 하면
윈도우 -> 유닉스 : 윈도우 / 10000000 - 11644473600
유닉스 -> 윈도우 : (유닉스 + 11644473600) * 10000000 혹은 유닉스 * 10000000 + 116444736000000000