옛 KLDP.net CVS 저장소 프로젝트를 git 로 변환하는 삽질 스토리 : 클리앙

안녕하세요. 원래 주말에 이걸 하려던게 아니었는데 말이죠.

NAS 정리하다 보니 이제는 없어진 gitorious 라는 kldp.net 같은 코드 호스팅 사이트에 올려 두었던  작은 프로젝트 코드를 발견 했습니다.  처음엔 이걸 제 소중한 HDD에 저장하느니 github 에 올려서 보관하는게 경제적이다 싶어 정리를 시작 했었드랬어요.  이건 원래 git 로 관리되던거라 쉽게 올리고 끝났는데...


제가 kldp.net에 올려 두있던 작은 코드도 있어서 이것도 github 에 저장해 보자고 마음 먹고 

한 30분 예상 하고 한 작업이 그만 두어 시간 걸리는 '삽질'이 되어 버렸습니다. (와이프 눈치 밥도 좀 먹었구요...)

원래 삽질의 추억은 어딘가 남겨야 제맛이라... 그 github wiki 에 남겨놨다가 ... 

Hoxy 저같은 분 계시면 참고 하시라고 클리앙에도 남겨 봅니다. (클리앙 글이 구글에서 잘 검색 되더라구요.)


암튼 콩글리시로 쓴 원문은 [여기]서 찾아 볼 수 있습니다. 

다 쓰고 보니 '죽은 자식 불알' 만지다가 '남의 자식 불알도(?옛KLDPnetCVS저장소프로젝트를git로변환하는삽질스토리클리앙)' 만져본 후기도 포함하고 있네요. ㅎㅎ 

각설 하고 글 복붙 해봅니다. 


---


소개

이 문서는 CVS 저장소를 KLDP.net에서 github/gitlab.com과 같은 git 기반 호스팅 서비스로 마이그레이션하려는 사람을 위해 다시 작성되었습니다. KLDP.net 아카이브 유지를 위해 애써주신 모든 분들께 다시 한 번 감사드립니다. 어느 날, 이해할 수 없는 이유로 code.google.com 아카이브에서 github 및 kldp.net으로 이전 코드 스니펫을 복원하고 싶었습니다. 쉬울 것 같지만 KLDP.net에서 CVS repo를 복원하는 데 약간의 딸꾹질이 있었습니다. 그래서, 나와 같은 싸움을 겪었거나 겪게 될 누군가를 위해 이 싸움의 기록을 남깁니다. :-)


KLDP.net의 샘플 프로젝트 - ExmanIDE

ExmanIDE는 KLDP.net CVS 호스팅 공간에서 2002년부터 2004년까지 유지해온 프로젝트 중 하나였습니다. 아카이브는 여전히 http://kldp.net/exmanide/ 에서 접근가능 합니다.

(정말 고전적인 Linux GUI 모양과 느낌이죵?!)


1단계 - 아카이브 가져오기

KLDP.net의 ExmanIDE 프로젝트는

  • CVS 저장소
  • Moniwiki (아마도 위키 템플릿 데이터만 있는 것 같습니다)
  • 릴리스 파일

이 문서는 CVS 저장소를 git으로 마이그레이션하는 방법에만 초점을 맞추고 있으므로 위키/릴리스 파일 복원은 여기서 언급하지 않습니다.


exmanide-scmroot.tar.gz 압축 해제

$ curl -O http://kldp.net/exmanide/exmanide-scmroot.tar.gz
$ tar -xvf exmanide-scmroot.tar.gz
$ cd exmanide/ExmanIDE
$ ls

exmanide/ExmanIDE 폴더 아래에 RCS 아카이브 파일인 *,v 파일이 표시됩니다. (CVS는 일종의 RCS의 프런트엔드입니다.)


2단계 - CVS 복원 도구 준비 (남의 자식 fireball도 만ㅈ...)

parsecvs

불행하게도 이 훌륭한 도구는 git 서비스 전국 시대 동안 잘못된 git 호스팅 서비스를 선택했습니다. parsecvs를 호스팅 했던 서비스도 이제 역사의 뒤편에 있습니다. 따라서 Gitorious Valhalla 에서 이 프로그램을 복원해야 합니다 . (참고: 이 문서의 작성자 또한 parsecvs 저자와 같이 센티멘탈해진 갬성의 tizen sdk 설치 프로그램 으로 알려진 tizen-toys 프로젝트에서도 동일한 실수를 저질렀습니다. ) https://gitorious.org/parsecvs/mainline.git/ 을 열고 최신 커밋의 스냅샷 tarball 링크를 찾습니다.


$ curl -O "https://gitorious.org/parsecvs/mainline.git/?p=parsecvs:mainline.git;a=snapshot;h=HEAD;sf=tgz"
$ tar -xvf parsecvsmainline-HEAD-bc94e9f.tar.gz
$ cd parsecvsmainline-HEAD-bc94e9f/


여하튼 이 도구는 'git' 코드베이스로부터 매우 깊은 의존성을 가지고 있습니다. parsecvs의 정확한 순간을 찾으려면 타임머신을 사용해야 합니다. 다행히 5번의 바이너리 검색과 빌드 삽질을 통해 필요한 git 브랜치의 올바른 버전을 찾아 놓은 시간 여행의 좋은 가이드가 있습니다. 저를 따라 보세용.


$ cd ..
$ git clone git://git.kernel.org/pub/scm/git/git.git
$ cd git
$ git checkout v1.7.0
$ make # this will build libgit.a for you and parsecvs
$ cd ../parsecvs
$ make # this will serve you the parsecvs program


이제 막 1개의 산을 통과했습니다. 심호흡을 하고 다음 장애물을 바라보세요.


3단계 - parsecvs를 사용하여 .git 빌드

kldp.net 프로젝트의 압축을 푼 폴더로 이동합니다. RCS 아카이브(개정 제어 시스템)인 많은 *,v 파일을 볼 수 있습니다. parsecvs 도구는 stdio에서 ,v 파일을 읽고 cvs 기록을 생성된 .git 폴더로 변환합니다.

$ cd ..
$ mv exmanide/ExmanIDE ExmanIDE-cvs
$ cd ExmanIDE-cvs
$ find -name '*,v' | ../parsecvsmainline-HEAD-bc94e9f/parsecvs -p 1024
---snip---
Save: master .................*... 15 of 17
Save: master ..................*.. 16 of 17
Save: master ....................* 17 of 17
$ ls .git

git으로의 CVS 복원 여정은 여기에서 완료됩니다. 행운을 빌며 결과를 확인합시다.


$ cd ..
$ git clone ExmanIDE-cvs ExmanIDE
$ cd ExmanIDE
$ git log


문제가 없나요? 운이 좋으십니다. 편한 의자에 앉아 YouTube를 시청할 준비가 되었습니다.  마지막 단계로 점프 할 수 있습니다. 안녕히 가세요!

(참고로 나중에 Gitorious Valhalla도 사라질 경우를 대비해서 parsecvs 프로젝트의 클론 레포를 찾아 봤는데요. https://github.com/jeffgarrett/parsecvs 에서 클론 레포를 구할 수 있는 것 같습니다. 저는 Gitorious Valhalla에 안치된 parsecvs의 스냅샷 타르볼만을 테스트했기 때문에 이 클론 저장소가 작동하는지 확인할 수 없었습니다. 누군가가 나중에 이 문서를 읽고 github 복제 저장소에서 이 저장소를 테스트해 보시길 바랍니다.)


4단계 - 코드 및 버전 기록에서 깨진 한글(e.g 占쏙옙)을 변환합니다.

이유는 모르겠지만 이 오래된 프로젝트에 있는 대부분의 ,v 파일은 코드에 UTF-8과 EUC-KR 한국어 인코딩이 막 썪여 있었습니다. 아마도 이 프로젝트가 시작된 ko_kr.EUC-KR 시대에 코드를 작성했던 것 같습니다. 그런 다음 제 개발 환경 또는 kldp.net의 호스팅 시스템이 ko_kr.UTF-8 env로 전환된 걸 수도 있습니다.  아무튼 ,v 의 리비전 컨트롤 이력의 한글은 UTF-8로 작성되었고 코드 자체도 UTF-8과 EUC-KR 주석 문자열이 혼합되어 있었습니다. 최악의 상황에 직면한 것 같습니다. iconv 명령은 잘 작동하지 않습니다. 눈을 감고 왜 내가 지금 '占쏙옙'을 터미널을 통해 보고 있는지 알아내고자 했습니다. 당신이 이 문제에 직면한 경우라면 운이 좋으십니다. 이 문서를 읽고 있으니까요. (그게 아니면 저만 kldp.net 폐쇄가 발표되었을 때 코드 아카이브 복원에 게을렀던 유일한 사람이거나 약 15년 전에 한글 인코딩 변환 의무에 게을리 했던 걸 수도... 아놔... 왜 이제 이걸 하고 있지...)


혼합된 한국어 인코딩 파일을 UTF-8로 변환하기 위한 conv.py를 작성하십시오. ( chardet 을 사용하는 것이 더 나을 수도 있지만 이 quik and dirty 어프로치를 따를 수도 있습니다)


import sys
def conv_try(buf):
    try:
        return buf.decode('utf-8')
    except UnicodeDecodeError:
        return buf.decode('cp949')
    except:
        print('failed conversion')
        sys.exit(1)

b = open(sys.argv[1], 'rb').read()
buf = b''
out = ''
for x in b:
    buf += x.to_bytes(1, 'big')
    if x == ord('\n'):
        out += conv_try(buf)
        buf = b''
else:

    out += conv_try(buf)
sys.stdout.write(out)


자, 이제 이 여정을 위한 도구가 하나 더 생겼습니다. 해보시죵.

$ cd ..
$ mkdir ExmanIDE-conv
$ cd ExmanIDE-cvs # which has ,v files and .git as well
$ for FILE in *; do echo $FILE; python3 ../conv.py $FILE > ../ExmanIDE_conv/$FILE  ; done
--snip-- # you 'll see some error due to images folder. Ignore it as we are lazy
$ cd ../ExmanIDE-conv
$ find -name '*,v' | ../parsecvsmainline-HEAD-bc94e9f/parsecvs -p 1024
---snip---
Save: master .................*... 15 of 17
Save: master ..................*.. 16 of 17
Save: master ....................* 17 of 17
$ ls .git
$ git log


문제가 없나요? 아마 단말기에 한글이 잘 보이실 것 같습니다. 그러나 git 로그에 작성자 정보로 KLDP.net ID가 표시된다는 것을 깨닫고 계실 것입니다. 이 로컬 git repo는 이메일 문자열이 없기 때문에 github/gitlab 계정과 git 리비전 히스토리를 일치시키는 데 문제가 있습니다. 여기 제 팁이 있습니다.

$ git filter-branch -f --env-filter "
    GIT_AUTHOR_NAME='Your name'
    GIT_AUTHOR_EMAIL='Your email'
    GIT_COMMITTER_NAME='Your name too'
    GIT_COMMITTER_EMAIL='Your email too'
  " HEAD
$ git log

자 이제 문제가 없어 졌나요? 그럴 것 같아요. 이 변환된 로컬 git repo를 다시 확인해 보겠습니다.


아, KLDP.net CVS 저장소에 다른 기여자가 있는 경우에는 작동하지 않습니다. 'git rebase'를 이용한 수공예 작업이 필요할 것 같습니다. 나중에 여기에서 경험을 공유해 주세용.


한 가지 추가 팁 - ,v 파일(RCS)이 텍스트 형식 아카이브라는 것을 알고 계실 것입니다. 이는 .git 폴더로 변환되기 전에 개정 기록이나 코드를 수정할 수 있음을 의미합니다. 즐거운 시간 보내세요. 제 경우에는 코드에서 이전 이메일 주소를 gmail로 수정할 수 있었습니다.


마지막 단계 - github로 내보내기

$ cd ..
$ git clone ExmanIDE-conv ExmanIDE-git
$ cd ExmanIDE-git
$ git log # check if every log is okay for your info
$ git remote remove origin # remove 'origin' remote which is ../ExmanIDE-conv
$ git remote add origin git@github.com:your-github-account/your-github-projectname.git
$ git branch -M main # nobody use master/slave in 21c. let's use main instead
$ git push -u origin main


수고 하셨습니다. 40대 동지여 이제 푹 쉬세요!

사진게시판