2012년 9월 7일 금요일

SVN Ignore - 특정 서버에 독립적으로 속해있는 파일들을 svn update나 commit으로부터 보호


svn을 도입해서 버전별로 조금씩 다른 웹 사이트를 구성한다고 할 때, 어떻게 하면 될까?

dev staging production server 각각의 웹 사이트마다 고유의 독특한 설정값들이 담기는 파일들이 있는데, 이들 파일들은 svn repository와의 상호작용을 멈추게 하고 싶다. 어떻게?

물론, 가장 확실하고 안심할 수 있는 방법은, 그런 설정파일들은 따로 빼내어 svn 트리 밖에 놓는 것이다. 그렇게 되도록 프로그램을 짜는 것이, 가장 정확한 방법이다.

하지만, 세상 일이라는 게 어디, 그렇게 내 맘처럼 항상 정확하게 돌아가 주진 않는 법이다. 때론 샛길이거나 편법이라도 찾아야 한다.

우선, 레파지토리로부터 처음 checkout해서 내려받은 다음, 설정파일들은 꼭 필요하지 않더라도 약간 편집해서 새로 저장한다. 그러면, 일단 레파지토리로부터 svn update 명령을 수행할 때 영향을 받지 않는다. 하지만, 이건 미봉책이다. 만약 다른 곳에서 그 파일 내용을 레파지토리에 수정본으로 올리게 되면, 레파지토리의 파일이 더 나중의 변경 시간을 가지게 되므로, 그 이후에는 svn update 의 영향권에 놓이게 된다.

또 하나 지켜야 할 것은, 설정파일이 포함된 디렉토리 전체를 svn commit을 하지 말아야 한다. 아마도 다른 서버의 설정파일들에 svn update의 압박이 가해질 것이기 때문이다.

이런, 원시적인, 조심성 말고는 정말 방법이 없는 걸까? 어쩌면, svn의 어떤 속성값 들 가운데, ‘난 빼줘’를 지정하는 게 있을 법 하지 않을까?

있다. 바로 svn ignore 속성이다. 원래는, 백업 파일이나 임시 파일, 컴파일된 바이너리 파일들을 제외하기 위해 설정하는 속성이다. 이 속성을 활용하면, svn update svn commit으로 부터 ‘안전’하게 설정파일들을 보호할 수 있다.

ZF(Zend Framework)의 설정파일이 있는 application/configs 폴더에서 svn:ignore *’ 를 걸어보자.

$ svn propset svn:ignore '*' .
$ svn proplist                                                   <—혹시, 설정된 속성 있는지 리스팅
Properties on '.':
  svn:ignore

*’이 너무 심하다고 생각하면, *.ini’를 콕 찍어서 속성값을 설정해줘도 된다.

$ svn propset svn:ignore '*.ini' configs/
$ svn propget svn:ignore configs/
*.ini

만약, 설정이 맘에 안들면, 아래 명령으로, 수정할 수도 있다. 이 때, 갑자기 vi 편집기가 뜬다. 놀라지 말기를…

$ svn propedit svn:ignore configs/

, 그런데, 약간의 문제가, 있다… 이게 이 서버에서만 ignore 되면 좋은데, svn:ignore 속성이 레파지토리에 올라가면 어떻게 될까?

svn commit 을 해보니, 덜컥 아까 svn:ignore 속성을 줬던 디렉토리와 파일이 변경된 리스트에 올라와 있다. 흠… 이건, 좀더 실험이 필요하겠다.

[가장 무난하고 확실한 해결 방법: .default 파일을 사용]

보통 설정 파일들은, 데이터베이스 접속 암호와 같은 아주 비밀스런 정보를 담고 있다. 이 정보들이 그대로 svn 레파지토리에 올라가 있는 건 바람직하지 않다. 그래서 취할 수 있는 방법이 default 파일을 따로 만들어서 레파지토리에는 그걸 올리는 거다.

configs/database.ini 파일이 있다고 생각해보자. 이 파일은 데이터베이스 접속 암호를 담고 있다. 이건 레파지토리에 올리고 싶지 않다. svn:ignore 설정을 해서 제외해준다. svn propset svn:ignore database.ini configs/

새로 소스를 checkout 받으면 database.ini 파일은 없다. 레파지토리에 없으니까. 하지만, 프로그램을 작동시키려 하면, 데이터베이스 접속이 안된다. 이 때 잘 모르는 사람은 당황한다.

이런 문제를 해결하기 위해서, 일종의 템플릿 파일처럼 참조 가능한 파일을 만들어서 레파지토리에 올려둔다. database.ini.default 정도의 이름을 가지면 금방 알아볼 수 있겠다. 당연히 기본 골격은 database.ini 파일의 내용과 동일하고, 데이터베이스 접속 암호 같은 기밀 정보 부분은 설명 문구 정도로 채워두면 된다.

위와 같이 해두면, 새로 소스를 checkout 받을 때, configs/database.ini.default 파일이 내려온다. 이 파일을 복사해서 database.ini 파일을 만들고, 데이터베이스 접속 암호 부분을 실제에 맞게 수정한다. 이 때 svn update를 실행하면, 아무런 변화가 없다. 왜냐하면, 새로 만들고 변경한 configs/database.ini 파일은 이미 configs/ 폴더에서 svn:ignore로 설정되어 있어서 무시되기 때문이다.

작업 순서를 다시 설명하면, 아래와 같다.
1.  처음에 레파지토리에 올리기 위한 소스 코드를 준비할 때, database.ini 파일이 있다면 그걸 안전한 다른 폴더로 백업본을 하나 복사한다.
2.  database.ini 파일의 이름을 database.ini.default로 변경한다.
3.  database.ini.default 파일을 편집기로 열어서, 기밀 정보에 해당하는 부분은 설명 문구 등으로 대체한다.
4.  svn propset svn:ignore database.ini 를 실행한다.
5.  svn import 를 실행한다. 또는 이미 레파지토리에 연결된 폴더에서 라면, svn commit을 실행한다.

새로 checkout으로 내려 받아서 작업하는 순서는 아래와 같다.
1.  svn checkout 한다.
2.  database.ini.default 파일을 database.ini 파일로 복사한다. 이 때 복사하지 않고 파일 이름만 변경하면 안된다. database.ini.default 파일은 계속 남아있어야 한다. 만약, import 단계에서 백업으로 따로 보관해두었던 database.ini 파일이 있었다면, 그냥 그 파일을 가져와도 된다.
3.  database.ini 파일을 편집기로 열어서 필요한 내용을 수정한다.
4.  작업 끝~


--------------------------------------------------

블로그 보관함