2008-11-12 4 views
6

현재 CVS를 사용하고있는 회사에서 빌드 시스템을 유지 관리합니다. 이 빌드 시스템은 여러 프로젝트와 여러 CVS 저장소에서 사용됩니다.서브 버전에서 자동으로 태그 만들기

출시 이정표가있을 때마다 태그를 만듭니다. CVS, 이것은 쉽게 : 그것이 CVS 작업 디렉토리에서 실행되는만큼 관계없이 CVS 모듈 또는 저장소의 작품을 명령

$ cvs tag TAG_NAME 

.

Subversion에서 동일한 작업을 수행하기 위해 저장소 루트를 얻으려면 먼저 svn info의 출력을 구문 분석해야합니다. 물론

svn cp . $REPO_ROOT/tags/TAG_NAME -m"Created tag TAG_NAME" 

이 SVN 저장소 권장 "트렁크, 태그, 지점"디렉토리 구조를 가지고 있다고 가정 : 그럼 난에 태그를 생성 할 수 있습니다. 그래서 나는 아마 이것을 먼저 확인해야 할 것입니다.

수정 기호 번호를 기호 이름에 매핑하는 작업은 많은 것처럼 보입니다. 더 좋은 방법이 있습니까?

+0

svn cp에 --parents를 추가하면 tags 디렉토리가 존재하지 않을 때 생성됩니다. –

+0

흠, 여기 1.4 클라이언트에서는 작동하지 않는 것 같습니다. svn의 어떤 버전을 사용하고 있습니까? –

답변

5

나는 누군가가 호기심 경우,이를 구현하는 방법이다 개정은 실제적인 모든 목적을 위해 태그와 동일합니다. 불행히도, 그것은 정말로 관련이 없습니다; 내 사용자는 모듈 이름과 (다른) 버전 번호로 구성된 기호 이름을 원합니다.

2

CVS와 달리 태그는 서브 버전의 상징적 인 이름 그 이상입니다. 우리는 태그를 만들고 실제로 지점을 만듭니다. 아직 읽지 않았다면이 글을 읽을 것을 권장합니다. http://svnbook.red-bean.com/

5

커맨드 라인에서 svn을 거의 독점적으로 사용합니다. 그리고 나는 몬스터 URL을 타이핑하는 것을 매우 피곤합니다. 드디어 셸에서 사용하는 svnurl 스크립트를 작성했습니다. 그것은이 "프로젝트"형식 들린 것을 전제로 작동합니다

.../PROJECTNAME/trunk 
       tags 
       branches 

의 당신이 PROJECTNAME/지점/foo는의 작업 복사본에 어딘가에 가정 해 봅시다 :

svnurl -tl # gives a list of tags for the current project 
svnurl -tlu # the same as full urls 
svnurl -t 1.1 # the url for the tag 1.1 of the current project 
# analagous functions for branches 
svnurl -ru # the url of the "root" of the current working copy 
      # eg svn://.../PROJECTNAME/branches/foo 
svnurl -T # the url of the trunk of the current project 
svnurl -pn # the name of the current project, `PROJECTNAME` 
# ... 

사용법은 다음과 같은 :

$ svn cp $(svnurl -T) $(svnurl -t 1.1.1) # tag trunk as 1.1.1 

코드가 아름답지는 않지만 많은 키 입력을 저장하고 예상치 못한 방식으로 유용합니다. 관심이 있다면 기꺼이 공유 할 수 있습니다.

+0

고마워, 나는 분명히 한 번 들여다 보는 것에 흥미가있을 것이다. Windows 클라이언트를 지원해야하므로 직접 사용할 수 없지만 작동 방법을보고 싶습니다. –

+0

여기에서 스크립트를 찾을 수 있습니다 : [[http://github.com/bpsm/svnurl/tree/master/svnurl.py][svnurl at github]]. – bendin

5

Subversion의 핵심 원칙이 누락되었습니다. 개정 번호 은 태그 인입니다. svn cp로 "태그"를 지정하면 더 긴 이름으로 특정 버전의 복사본을 만들고있는 것입니다. 그리고 CVS 태그와는 달리, 여러분 (또는 다른 개발자들)은 계속해서 "태그"를 개발할 수 있습니다. CVS 태그와 같은 정적 엔티티는 아닙니다 (물론, 실제로 CVS 파일을 변경하면 태그를 옮길 수 있습니다).

대부분의 svn 사용자는 CVS가 제시 한 방식으로 태그를 처리합니다. 그리고 (적어도 아파치에서는) DAV 서버가 어떤 태그 디렉토리 아래에서도 쓰기/체크 인을 허용하지 않도록 설정할 수 있습니다. 나는 이것을 시도하지 않았고, 태그 생성을 위해 http URL을 사용하지 못하게 할 수도있다. (호스팅 시스템의 쉘에서 파일 경로를 사용해야한다.) 그러나 실제적인 목적을 위해 릴리스 프로세스는 임의의 텍스트 문자열보다 특정 개정 번호에 더 관심을 가져야합니다. 후자는 출시 이후 변경 될 수 있습니다. 전자는 체크 아웃 할 때마다 항상 동일한 파일 세트에 대한 액세스 권한을 제공해야합니다.

[*] 비하인드 스토리를 만드는 방법은 언제나 있습니다. 예를 들어 주석을 수정해야 할 때 vi로 RCS 및 CVS 파일을 직접 편집하는 데 익숙합니다.그러나 몇 가지 심각한 svn-cleverness가 없으면 주어진 개정 번호는 꽤 일정해야합니다.

<!-- First, we need to get the svn repository root URL by parsing 
the output of 'svn info'. --> 
<exec executable="svn" failonerror="yes"> 
    <arg line="info"/> 

    <redirector outputproperty="svninfo.out" errorproperty="svninfo.err"> 
     <outputfilterchain> 
      <linecontains> 
       <contains value="Repository Root: "/> 
      </linecontains> 

      <tokenfilter> 
       <replacestring from="Repository Root: " to=""/> 
      </tokenfilter> 
     </outputfilterchain> 
    </redirector> 
</exec> 

<echo level="verbose" message="Root from svn info: ${svninfo.out}"/> 

<!-- Set the svn.root property from the svn info output, and append 
the module prefix if it exists. The module prefix allows multiple 
projects to use the same repository root. --> 
<condition property="svn.root" value="${svninfo.out}/${svn.module.prefix}"> 
    <isset property="svn.module.prefix"/> 
</condition> 
<!-- Note that the next line will have no effect if the property was 
set in the condition above, since ant properties are immutable. The 
effect is an "else", if the condition above is NOT true. --> 
<property name="svn.root" value="${svninfo.out}"/> 
<echo level="verbose" message="Root: ${svn.root}"/> 

<!-- Verify the tags directory exists. --> 
<exec executable="svn" 
     failonerror="no" 
     outputproperty="null" 
     errorproperty="svn.ls.error"> 
    <arg line="ls ${svn.root}/tags"/> 
</exec> 
<fail> 
Cannot find 'tags' subdirectory. 

${svn.ls.error} 

The subversion repository is expected to have 'trunk', 'branches', and 'tags' 
subdirectories. The tag '${tag}' will need to be manually created. 
    <condition> 
     <not> 
      <equals arg1="${svn.ls.error}" arg2="" trim="yes"/> 
     </not> 
    </condition> 
</fail> 

<!-- Finally, do the actual tag (copy in subversion). --> 
<exec executable="svn" failonerror="yes"> 
    <arg line="cp . ${svn.root}/tags/${tag} -m 'Created tag ${tag}'"/> 
</exec> 

나는 또한 내가 태그에 대한 CVS와 서브 버전의 차이점을 알고 있음을 지적하고자하고 파괴 것을 : 여기

+0

나는 그 모든 것을 이해하지만 그것은 적절하지 않습니다. 고객은 개정이 아닌 기호 태그 이름을 원합니다. 그건 바뀌지 않을거야. –

+3

svn이 바보 취급하는 방법. 왜 인덱스 화 된 파일에 튜플 수 rev-number tag-name의 목록을 가지고 사전으로 사용하는 것이 어려울까요? – user2427

+1

은 damian과 (과) 일치합니다. 개정 번호 자체는 단지 숫자이기 때문에 태그로 유용하지 않습니다. 또한 전체 트리가 개정 번호를 공유하기 때문에 개정 번호가 여러 분기 인 경우 도움이되지 않습니다. –

관련 문제