web-dev-qa-db-ja.com

トランクから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"
269
ojblass

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

copyが使用する操作であることを正しく推測しました。それはSubversionがこれらのファイルの履歴を追跡することを可能にし、そして(私が仮定する)それらをはるかに効率的に保存することを可能にします。

私の経験では、プロジェクト全体、つまりルートチェックアウト場所からのすべてのファイルのコピー(「スナップショット」)を作成するのが最善です。こうすることで、特定の時点でのプロジェクト全体の状態を正確に表現したものとして、スナップショットを独立させることができます。

「the book」のこの部分 は、コマンドの一般的な使用方法を示しています。

183
unwind

つかいます:

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"
413
victor hugo

@victor hugoで述べたように、 "正しい"方法はsvn copyを使うことです。ただし、注意点が1つあります。このようにして作成された "tag"は、真のタグではなく、指定されたリビジョンの正確なコピーになりますが、それ自体は異なるリビジョンになります。あなたのビルドシステムがどういうわけかSVNリビジョンを利用するなら(例えば、あなたがビルドする製品のバージョンに 'svn info'で得られた数を取り入れる)、あなたはタグから全く同じプロダクトをビルドすることができません結果は元のコードの代わりにタグのリビジョンを持ちます。

設計上、svnには本当に適切なメタタグを作成する方法はありません。

13

これを使うだけです:

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 Essentials 、および SVN Essentials 2

12
AgilePro
11
Gromer

@victor hugoと@unwindは正しいので、victorの解決策ははるかに簡単です。しかし、あなたのSVNプロジェクトの見た目には注意してください。外部ライブラリを参照している場合、外部参照を持つディレクトリにタグを付けても、外部のリビジョン参照(タグ、HEAD、または番号)は変わりません。

タグ付けのこの側面を処理するためのスクリプトを作成することは可能です、そのトピックに関する議論については、このSO記事を参照してください: 外部によるSVNチェックアウトのタグ付け

7
MOK9

Subversionリポジトリにタグを付けるもう1つのオプションは、次のように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;
                  }'

また、この方法で必要に応じてタグをシームレスに削除することができます。それで、タグは完全なメタ情報になります、そして私はそれが好きです。

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

URLパスを変更するだけです。このコマンドは新しいディレクトリ "tagDestination"を作成します。 2行目にエラーが発生した場合の詳細が表示されます。作成されていない場合は、svnenv変数を作成します。 (Cmd: - set、Powershell: - Get-ChildItem Env :)をチェックできます

0
Ashu