[svn] 트렁크에서 SVN 태그를 올바르게 만드는 방법은 무엇입니까?

Subversion 에서 첫 번째 프로젝트를 만들고 있습니다. 지금까지

 branches
 tags
 trunk

나는 즉시 분기를 단수로 만들고 다시 시작해야한다고 생각합니다. 업데이트 브랜치 는 표준입니다.

트렁크에서 작업하고 다음과 같이 내용을 태그로 옮겼습니다.

mkdir tags/1.0
cp -rf trunk/* tags/1.0
svn add tags/1.0
svn commit -m " create a first tagged version"

내 직감은 이것이 완전히 잘못되었다고 말하고을 사용하여 파일 사이의 관계를 유지해야합니다 svn copy. 이 방법으로 만든 파일은 서로 관계가 없으며 Subversion 기능을 놓치지 않을 것입니다. 나 맞아?

개별 파일에 svn copy를 사용해야합니까?

mkdir tags/1.0
svn add tags/1.0
svn copy trunk/file1 tags/1.0
svn copy trunk/file2 tags/1.0
svn copy trunk/file3 tags/1.0
svn commit -m " create a first tagged version"

전체 디렉토리에서 svn copy를 사용해야합니까?

svn copy cp -rf trunk tags/1.0
svn commit -m " create a first tagged version"



답변

tags 폴더에 파일을 추가하는 것이 “올바르지 않다”는 것이 맞습니다.

당신은 그것이 copy사용할 연산 이라고 정확하게 추측했습니다 . Subversion은 이러한 파일의 기록을 추적하고 훨씬 효율적으로 저장할 수 있습니다.

내 경험상 전체 프로젝트, 즉 루트 체크 아웃 위치의 모든 파일을 복사 ( “스냅 샷”)하는 것이 가장 좋습니다. 이러한 방식으로 스냅 샷은 특정 시점에서 전체 프로젝트 상태를 실제로 표현할 수 있습니다.

“책”의이 부분은 명령이 일반적으로 사용되는 방법을 보여줍니다.


답변

사용하다:

svn copy http://svn.example.com/project/trunk \
      http://svn.example.com/project/tags/1.0 -m "Release 1.0"

속기:

cd /path/to/project
svn copy ^/trunk ^/tags/1.0 -m "Release 1.0"


답변

@victor hugo가 지적했듯이 “적절한”방법은 svn copy를 사용하는 것입니다. 그래도 하나의 경고가 있습니다. 이러한 방식으로 생성 된 “태그”는 실제 태그가 아니며 지정된 개정의 정확한 사본이지만 다른 개정 자체가됩니다. 따라서 빌드 시스템이 어떻게 든 svn 개정을 사용하는 경우 (예 : ‘svn info’로 얻은 숫자를 빌드하는 제품 버전에 통합) 태그에서 정확히 동일한 제품을 빌드 할 수 없습니다 ( 결과는 원래 코드의 태그 대신 태그의 개정을 갖습니다).

svn에는 실제로 적절한 메타 태그를 만들 수있는 방법이 없습니다.


답변

이것을 사용하십시오 :

svn  copy  http://svn.example.com/project/trunk
           http://svn.example.com/project/branches/release-1
           -m  "branch for release 1.0"

(물론 한 줄에 모두 있습니다.) 항상 전체 트렁크 폴더와 내용의 분기를 만들어야합니다. 물론 트렁크의 하위 부분을 분기하는 것이 가능하지만 이는 결코 좋은 방법이 아닙니다. 이제 분기가 트렁크와 똑같이 작동하기를 원하며,이를 위해서는 전체 트렁크를 분기해야합니다.

내 블로그 : SVN EssentialsSVN Essentials 2 에서 SVN 사용에 대한 자세한 요약을 참조하십시오.


답변


답변

@victor hugo와 @unwind가 정확하며 victor의 솔루션이 훨씬 간단합니다. 그러나 SVN 프로젝트에서 외부는 조심하십시오. 외부 라이브러리를 참조하는 경우 외부 참조가있는 디렉토리에 태그를 지정할 때 외부의 개정 참조 (태그, HEAD 또는 번호)가 변경되지 않습니다.

태그 지정의 이러한 측면을 처리하는 스크립트를 작성할 수 있습니다. 해당 주제에 대한 설명은 다음 SO 기사를 참조하십시오. SVN 체크 아웃에 외부 태그 지정


답변

Subversion 저장소에 태그를 지정하는 또 다른 옵션은 다음과 같이 svn : log 속성에 태그를 추가하는 것입니다.

   echo "TAG: your_tag_text" > newlog
   svn propget $REPO --revprop -r $tagged_revision >> newlog
   svn propset $REPO --revprop -r $tagged_revision -F newlog
   rm newlog

최근에 이것이 태그를 지정하는 가장 “올바른”방법이라고 생각하기 시작했습니다. 이 방법으로 “svn cp”에서와 같이 추가 개정을 만들지 않고 “svn log”출력에서 grep을 사용하여 모든 태그를 쉽게 추출 할 수 있습니다.

   svn log | awk '/----/ {
                      expect_rev=1;
                      expect_tag=0;
                  }
                  /^r[[:digit:]]+/ {
                      if(expect_rev) {
                          rev=$1;
                          expect_tag=1;
                          expect_rev=0;
                      }
                  }
                  /^TAG:/ {
                      if(expect_tag) {
                          print "Revision "rev", Tag: "$2;
                      }
                      expect_tag=0;
                  }'

또한 필요한 경우 태그를 완벽하게 삭제할 수 있습니다 . 따라서 태그는 완전한 메타 정보가되고 좋아합니다.