トランクから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 2009年

回答:


186

タグフォルダにファイルを追加するのは「正しくない」という点で正しいです。

あなたはそれ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
これを回答としてマークしました。もう1つ追加のメモ。トランクの以前のリビジョンを取得して「タグ付け」することもできます。コマンド:svn copy -r 123 " svn.example.com/project/trunk " " svn.example.com/project/tags/1.0 " -m " Tagging、ただし古いリビジョン(123)を使用しています。"
granadaCoder '18 / 10/18

7
私はsvnを取得します。ローカルの非コミット操作はログメッセージやリビジョンプロパティを取得しないため、-mオプションを削除するだけです。
ジョニー2013年

4
参考までに、URLがhttpまたはhttpsを含むリポジトリと一致していることを確認してください。
ノーマンH

2
なぜ最初の行の終わりに\があるのですか?
Fractaliste 2015年

1
@Jonny「-m」オプションなしで上記のコマンドを実行することはできません。Macでターミナルを使用しています。
Abdurrahman Mubeen Ali 2016

14

@victor hugoが述べたように、「適切な」方法はsvn copyを使用することです。ただし、注意点が1つあります。その方法で作成された「タグ」は、真のタグではなく、指定されたリビジョンの正確なコピーになりますが、それ自体は別のリビジョンになります。したがって、ビルドシステムが何らかの方法でsvnリビジョンを使用する場合(たとえば、「svn info」で取得した番号を、ビルドする製品のバージョンに組み込む)、タグから同じ製品を正確にビルドすることはできません(結果には、元のコードのリビジョンではなく、タグのリビジョンが含まれます。

設計上、svnには本当に適切なメタタグを作成する方法がないようです。


4
「Last Changed Rev」を使用することが可能です:echo "{ 'svnRev': \"`svn info | awk '/Last Changed Rev:/{print $4}'`\" }" >svnver.txt`
18446744073709551615

このようにして、(もちろん)リビジョン番号が異なる2つのブランチが同じソフトウェアバージョンを生成します。
18446744073709551615 2013年

1
はい、あなたはLast Changed Revについて正しいです、しかしそれはSubversionに実際のタグがないという事実を変えません。
Alexander Amelkin 2013年

18446744073709551615 @:あなたは使用を避けることができますawk使用してSVNから直接その情報を入手し、--show-itemオプション: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"

(もちろん、すべて1行です。)常に、トランクフォルダ全体とコンテンツのブランチを作成する必要があります。もちろん、トランクのサブパートを分岐させることも可能ですが、これはほとんど良い方法ではありません。ブランチがトランクとまったく同じように動作するようにしたい場合は、トランク全体をブランチする必要があります。

私のブログでSVNの使用法のより良い概要を参照してください: SVN EssentialsSVN Essentials 2


トランクからのチェックアウトのみを行い、スクリプトの中にいる場合の外観を詳しく説明してください。
aholbreich

トランクフォルダをチェックアウトした場合は、リポジトリのhttpアドレスを使用する必要があります。トランクフォルダーのチェックアウトが推奨されるパターンであるため、これを表すために回答を更新しました。
AgilePro

この回答は承認された回答とどのように異なりますか?
ダニエル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パスを変更するだけです。このコマンドは、新しいディレクトリ「tagDestination」を作成します。2行目には、エラーの詳細が発生した場合にその詳細が通知されます。作成されていない場合は、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 2015年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.