내가 고친 파일 하나를 올렸는데 커밋 목록에 파일이 여섯 개 찍혔다. 나머지 다섯은 내가 안 건드린 화면 파일이었다.
Table of contents
Open Table of contents
커밋 목록에 여섯 개가 찍혔다
개발용 서버 한 대에 작업 사본이 하나만 있었고 그 한 벌을 여러 명이 동시에 열어 고치고 있었다.
svn commit 에 경로를 안 적었다. 경로를 생략하면 현재 디렉터리를 재귀로 훑어 바뀐 것 전부가 대상이 된다. 내가 바꾼 것이 아니어도 원본과 다르면 대상이다.
svn commit -m "상품 목록 정렬 수정"
도구는 소유자를 모른다
SVN 은 누가 고쳤는지를 모른다. 작업 사본의 .svn 안에 있는 원본과 다른지만 본다. 소유자 정보라는 것이 애초에 없다.
딸려 간 다섯 개는 아직 작업 중이었다. 반쯤 고친 JSP, System.out.println 이 남아 있는 파일, 저장만 하고 열어 보지도 않은 것이 섞여 있었다.
커밋 메시지는 상품 목록 정렬 수정인데 내용은 화면 다섯 개 변경이다. 기록만 보면 내가 그 화면들을 고친 것으로 남고, 나중에 그 부분에서 문제가 나면 이력을 따라가다 내 커밋에 닿는다.
되돌리기가 간단하지 않았다
되돌리려니 걸리는 것이 있었다. svn merge -c -142 . 로 역머지하면 되는데, 그 파일들은 아직 작업 중이라 작업 사본과 어긋난다. 그쪽에서 svn update 하는 순간 방금 쓴 내용이 덮인다.
어느 파일이 내 것인지 구분할 방법도 없었다. 커밋 시점에는 여섯 개가 그냥 바뀐 파일일 뿐이다. 결국 svn diff 로 파일 하나씩 대조해 가려냈다. 작업 사본을 공유한 대가였다.
svn commit ProductList.jsp -m "..." 처럼 경로를 적으면 그것만 대상이 된다. 여러 개면 나열해야 해 귀찮아 보이지만 무엇이 올라갈지가 명령에 보인다. 올리기 전에 svn status 를 한 번 보는 것도 넣었다. 변경 표시가 붙은 것 중에 내가 안 건드린 것이 있으면 그 자리에서 드러난다.
공유하고 있던 것들
근본 원인은 명령이 아니라 구조였다. 한 벌을 공유하면 누가 무엇을 바꿨는지가 파일 상태에 안 남는다. 각자 자기 작업 사본을 갖고 있으면 내 사본에서 바뀐 파일은 전부 내가 바꾼 것이 된다.
작업 사본만 공유물이 아니었다. MySQL 도 한 벌이었다. 한쪽에서 ALTER TABLE 을 치면 다른 쪽 화면이 그때 깨진다. 코드는 각자 것인데 스키마는 공유라 어긋나는 것이다.
공유하는 것을 적어 보니 SVN 작업 사본과 MySQL 과 업로드 폴더 셋이었다. 셋 다 누가 언제 바꿨는지가 안 남는 자리다.
정리
svn commit에 경로를 안 적으면 현재 디렉터리를 재귀로 훑는다- SVN 은 소유자를 모르고
.svn안 원본과 다른지만 본다 - 작업 중인 중간 상태가 올라가면 이력상 내가 고친 것으로 남는다
- 되돌리기는 그 파일 작업이 진행 중이면 어긋난다. 예방이 싸다
- 올리기 전에
svn status로 무엇이 바뀌어 있는지 본다 - 커밋 명령에 경로를 적으면 무엇이 올라갈지가 명령에 보인다
- 작업 사본을 사람마다 따로 두면 이 상황 자체가 안 생긴다
- 공유하는 것을 목록으로 적어 보면 작업 사본 말고도 더 나온다