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


282

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"

10
불행히도 나는이 경우에 모든 선택을하지는 않습니다 ... git은 꽤 마술입니다.
ojblass

답변:


186

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

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

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

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


15
이 책의 1.1 버전은 굉장히 구식입니다. 다음은 더 나은 링크입니다. svnbook.red-bean.com/nightly/en/svn.branchmerge.tags.html
Quinn Taylor

1
복사 된 파일은 추가 공간을 소비하지 않습니다
Carlos

424

사용하다:

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"

36
나는 이것을 대답으로 표시했다. 하나만 더 참고하십시오. 트렁크의 이전 버전을 가져 와서 "태그"할 수도 있습니다. 명령은 다음과 같습니다. svn copy -r 123 " svn.example.com/project/trunk " " svn.example.com/project/tags/1.0"-m "태깅 중이지만 이전 버전 (123)을 사용 중입니다."
granadaCoder

7
나는 svn : 커밋되지 않은 로컬 작업은 로그 메시지 또는 개정 속성을 사용하지 않으므로 -m 옵션 만 제거합니다.
Jonny

4
참고로 URL이 http 또는 https를 포함한 저장소와 일치하는지 확인하십시오.
Norman H

2
왜 첫 줄 끝에 \가 있습니까?
Fractaliste

1
@Jonny "-m"옵션없이 위의 명령을 실행할 수 없습니다. Mac에서 터미널을 사용하고 있습니다.
Abdurrahman Mubeen Ali 4:10에

14

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

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


4
"Last Changed Rev"를 사용할 수 있습니다 : echo "{ 'svnRev': \"`svn info | awk '/Last Changed Rev:/{print $4}'`\" }" >svnver.txt`
18446744073709551615

이러한 방식으로 (물론) 개정 번호가 다른 두 지점은 여전히 ​​동일한 소프트웨어 버전을 생성합니다.
18446744073709551615

1
그렇습니다. Last Changed Rev에 대해서는 맞습니다. 그러나 Subversion에 실제 태그가 없다는 사실은 바뀌지 않습니다.
Alexander Amelkin

@ 18446744073709551615 : awk다음 --show-item옵션을 사용하여 svn에서 바로 해당 정보를 사용하지 않고 해당 정보를 얻을 수 있습니다 .svn info --show-item last-changed-revision
Luchostein

12

이것을 사용하십시오 :

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 사용에 대한 자세한 요약을 참조하십시오.


트렁크에서 체크 아웃하고 스크립트를 사용하는 경우 어떻게 생겼는지 자세히 설명 할 수 있습니까?
aholbreich 2016 년

트렁크 폴더를 체크 아웃 한 경우 리포지토리의 http 주소를 사용해야합니다. 트렁크 폴더를 체크 아웃하는 것이 권장되는 패턴이므로 이것을 나타내는 답변을 업데이트했습니다.
AgilePro

이 답변은 허용되는 답변과 어떻게 다릅니 까?
Daniel W.


7

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

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


5

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;
                  }'

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


0
svn copy http://URL/svn/trukSource http://URL/svn/tagDestination -m "Test tag code" 
  $error[0].Exception | Select-object Data

URL 경로를 변경하기 만하면됩니다. 이 명령은 새로운 dir "tagDestination"을 작성합니다. 두 번째 줄은 오류가 발생한 경우 전체 오류 세부 정보를 알려줍니다. svn 생성 되지 않은 경우 env 변수를 작성하십시오. 확인할 수 있습니다 (Cmd :-set, Powershell :-Get-ChildItem Env :) 기본 경로는 "C : \ Program Files \ TortoiseSVN \ bin \ TortoiseProc.exe"입니다.


-4

이 시도. 그것은 나를 위해 작동합니다 :

mkdir <repos>/tags/Release1.0
svn commit <repos>/tags/Release1.0 
svn copy <repos>/trunk/* <repos>/tag/Release1.0
svn commit <repos/tags/Release1.0 -m "Tagging Release1.0"

1
이것은 분명히 잘못된 길입니다. 태그 (Release1.0)는 임의로 작성된 디렉토리가 아닌 소스 디렉토리 (트렁크)의 사본이어야합니다. 그렇게 한 경우 소스 디렉토리 자체의 히스토리가 손실되고 하위 노드 (파일 및 디렉토리)의 히스토리 만 유지됩니다.
Alexander Amelkin
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.