SVNのベストプラクティス-チームでの作業


98

私はSVNから始めています。基本的なコマンドを理解し、基本原則を理解しています。チーム環境でSubversionを使用するためのヒントやベストプラクティスがあるかどうか疑問に思っていました。

コードをコミットするときにかなり詳細なメッセージを追加することのメリットはわかりますが、他に注意すべき点はありますか?

すばらしい回答をありがとう-彼らはたくさん助けてくれました。

回答:


76

頻繁なコミットを奨励します。 バージョン管理に不慣れなチームメイトは、「正しく機能する」まで、コードをリポジトリから除外する必要があるように感じるかもしれません。できるだけ早く、頻繁に問題を見つけるようにコミットするように全員に教えます。機能するまでコードを保持する代わりに、チームメイトがトランクを壊す可能性のある機能のブランチを作成することを提案します。それは...につながります

分岐とタグ付けのプラクティスを確立します。 機能のブランチに加えて、チームメイトにブランチを使用して大きなバグを修正するように促します。作業の始めと終わりに主要なバグ修正にタグを付けます。プロダクション/ QAリリースのタグ(および場合によってはブランチ)を維持します。

トランクのポリシーを確立し、それに固執します。 たとえば、「トランクは常にエラーなしで構築する必要があります。」または「トランクは常にすべての単体テストに合格する必要があります」。トランクの基準をまだ満たしていない作業は、ブランチで行う必要があります。


1
ブランチとマージは、SVNの問題の1つです。他のVCSはそれをはるかにうまく処理しますが、私はSVNの分岐が多いプロセスを推奨しませんでした。
ブラナン2009年

7
@Branan WRONG。これは、ソース管理を適切に使用する方法がわからないためです。あなたがブランチするとき、あなたはあなたの仕事をし、トランクからブランチを更新し、トランクからブランチへの最新の変更を毎日または数回(あなたの選択)マージするので、結局あなたがしないようにする良い開発者として期待されています積み重なっているマージ地獄を持っています。私はPCのローカルで常に少なくとも4〜5のブランチを実行していますが、正しく実行しているので、この悪夢のような人々が話すことはありません...頻繁に更新して、人々がトランクにチェックインしている変更を反映しています。作業およびコードの追加
PositiveGuy

66

コードの変更に伴うフォーマットの変更をコミットしない

巨大なファイルの空白(Control+ K+ D)を再構築する場合は、問題ありません。フォーマットの変更は、実際の論理的な変更とは別にコミットします。ファイル内で関数を移動したい場合も同様です。実際の編集とは別に移動をコミットします。


2
だから私は一日中ファイルを編集し、今それをコミットする時、フォーマットをどのように分離するのですか?
ダスティンゲッツ

23
既存のコードでフォーマットの変更を行う場合は、最初にそれを実行してコミットし、次に新しいコードを追加するか、コードを編集します。または、最初に追加/編集し、コミットしてから、フォーマットの変更を行います。このように、追加/編集の差分は実際に意味があり、単に「すべてが今は違う!」とは言わない
lc。Jan

1
+1。無関係な変更により、関連する変更を確認するのにかかる労力が増加します。また、変更(たとえば、別のブランチ)のマージ/移植が困難になります。
Ates Goral

2
これは良い習慣ですが、誰かがこれを強制することができるとは思いません。Jason氏の言うとおり、優れた開発者は、ノイズを除去するための優れたdiffツール(亀のSVNに組み込まれているツール)を使用して空白を無視できることに気づくでしょう。
Ken Sykora

1
これは、コードレビューとチームメンバーへの教育を通じて実施できます。論理的な変更とコードの変更を区別するのは、レビュー担当者の負担ではないと思います。それは実装者の責任であるべきです。
マルケス

43

私が常に固執する主要な概念の1つは、関連するコードの変更をまとめコミットすることです。その結果、同じコミットで無関係なコードの変更をコミットしないください。つまり、1つのコミットで2つのバグを修正しないでください(同じ修正でない限り)。また、2つのコミットのそれぞれでバグ修正の半分をコミットしないでください。また、システムの無関係な部分に新しい拡張機能や何かを追加する必要がある場合に、他の作業に必要な場合は、拡張機能を個別に(最初に)コミットします。このアイデアは、だれかが単独で行いたい(または自分でロールバックしたい)と思われる変更は、個別のコミットであるということです。マージや壊れた機能をロールバックするときに、頭痛の種を大幅に節約できます。


4
これに+1。あなたがコミットしているとき、それはそのような痛みのようです。しかし、古いコードをレビューする場合、アトミックなコミットでいっぱいのリポジトリは貴重です。
ゴードンウィルソン

2
機能ブランチの目的ではありません...機能ブランチで必要なだけコミットを実行してから、トランクにマージする準備ができたら、ロールバックはマージされたコミットを削除することを意味します。関連するコードをまとめるための+1 ...
farinspace

16

多くのことはすでに述べられており、ここにいくつかあります:

  1. ソース管理に必要のないファイル(構成、コンパイル済みファイルなど)がある場合は、それらを無視リストに追加します。このように、SVNに不明として表示されるファイルの空のリストを常に期待することで、追加を忘れたファイルに気づきます。

  2. コミットされた変更と理想的にはそのパッチに関する開発者メーリングリスト(またはこのターゲットに固有のメーリングリスト)にメールを送信するコミット後イベントを追加します

  3. バグトラッカーと統合して、コミットへの参照がバグ/機能リクエストに差分へのリンクとともに表示されるようにします。MantisBTのようなバグトラッカーはこれをサポートしています。

  4. 継続的インテグレーションCruiseControl.NETなど)、ビルドにはNAnt、ユニットテストにはNUnit / VS との統合を検討してください。このようにして、ユーザーがコードをチェックインするか、スケジュールされた間隔でコードがコンパイルされると、単体テストが実行され、開発者はプロセスのフィードバックを取得します。これは、リポジトリが壊れている(つまり、ビルドされない)場合に、チームの他のメンバーに警告することにもなります。


私たちが使用する習慣は、すべての構成ファイルがconfig.php.configなどの拡張子を変更し、このようにサーバー上に構成ファイルを保持することですが、すべてのチームメンバーは独自のファイルを持っています。フォームsvn versionのコピーを作成するよりも、構成ファイルに大きな変更があった場合
zidane

15

まあ、基本:

  • バージョンでQAを開始する前にタグを作成する
  • 危険な変更(つまり、大きなリファクタリング)の前にタグを作成する
  • コードを凍結するために、リリースされたバージョンのブランチを作成します。
  • コードの一部で作業を開始する前に更新し、コミットする前にもう一度更新することを人々が知っていることを確認してください。
  • SVNは、異なるユーザーによる同じファイルの複数のチェックアウトを許可します。発生する可能性のある競合を全員が解決するようにしてください。
  • 複数のユーザーに対して同じSVNアカウントを使用しないでください。ひどいことが起こるかもしれません。

7
私は自分のブランチとタグで反対のことをしています。ブランチはトランクからのフォーク用で、最終的にトランクとマージされます。タグはコードフリーズ用です。
steve_c 2009年

1
ブランチは変更可能なコピーです。タグは変更すべきではないコピーです。 svnbook.red-bean.com/en/1.2/svn.branchmerge.tags.html
matpie

私も似たようなことをしています。コードをQAまたはプロダクションにリリースすると、タグを付けて分岐します。このように、トランク上で行われる可能性のある新機能の開発に影響を与えない、そのリリースのバグ修正に対処するための読み取り専用マーカーとブランチがあります。
JamesEggers、2009年

Svnでは、同じユーザーが同じフォルダーを複数回チェックアウトすることもできます。そのため、現在の作業に関係のない変更を加える必要があるとわかった場合(つまり、緊急修正を求める顧客がいる、またはまったく関係のないバグを偶然見つけた場合)、もう一度チェックアウトして個別に修正します。
PMF 2013年

「タグ」はコードのフリーズに使用する必要があります。「タグ」ブランチを変更しようとすると、SVNクライアントは警告さえします。
Danijel

12

人々の答えは素晴らしいです。これの多くは、SVNのベストプラクティスについて svn user docに要約されています。
繰り返す:

  1. リポジトリ構造を設定します(トランク、ブランチ、タグが下にあるプロジェクトルートが必要です)。
  2. ブランチングに関するポリシー(プライベートブランチ、マイルストーン/リリース/バグごとのブランチなど)を選択し、それに従ってください-ブランチを少なくするよりも、ブランチを増やすことをお勧めしますが、プライベートブランチは必要ありません
  3. タグ付けのポリシーを選択します-タグは多いほど良いですが、最も重要なのはタグの命名規則を決定することです
  4. トランクにコミットするポリシーを選択します-トランクを可能な限り「クリーン」に保ちます。いつでも解放可能にする必要があります

これはかなり古いベストプラクティスであるため、CollabNetがこれ以上推奨することはないと思います。利用可能な新しいベストプラクティスはありますか?あなたが言及したものはSVN 1.0に戻ります
mliebelt

1
@mliebelt-apacheバージョンへのリンクを更新しました。年齢に関係なく、リポジトリ構造、ブランチングポリシー、タグ付けポリシー、トランクコミットポリシーの選択のアイデアは、上記の本当に良い答えとともに、まだ健全です。
hromanko、2011年

ただし、「ブランチと必要なシステム」の説明はかなり骨の折れるものです。オフィス撮影のレシピのようですね。
naught101

10

私が守っているベストプラクティスをまとめたいと思います。

  1. バイナリをコミットしないでくださいNexusIvyArtifactoryなどのバイナリ用の個別のリポジトリが必要です。
  2. リポジトリ構造が必要です。個人的に私は次のリポジトリ構造を使用しています:

    /trunk
    /tags
        /builds
            /PA
            /A
            /B
        /releases
            /AR
            /BR
            /RC
            /ST
    /branches
        /experimental
        /maintenance
            /versions
            /platforms
        /releases
    
  3. ブランチタイプの特定のリストを使用します。私のリストは次のとおりです。実験メンテナンスバージョンプラットフォームリリース
  4. 特定のタイプのタグを使用します:(PAプレアルファ)、A(アルファ)、B(ベータ)、AR(アルファリリース)、BR(ベータリリース)、RC(リリース候補)、ST(安定版)。
  5. マージの必要性を最小限に抑えます。マージが可能/推奨される場合とそうでない場合には、ルールが必要です。
  6. バージョン番号。固執するために確立されたバージョン番号付けアプローチが必要です。通常、ソフトウェア構成管理計画などのドキュメントで説明されており、高レベルのプロジェクトドキュメントの一部です。個人的には、複雑なバージョン番号付けアプローチを使用しています。このアプローチによると、バージョンには次のパターンがあります:Nxx(メンテナンス/サポートブランチ)、NMx(リリースブランチ)、NxK(ビルド)、NMK(リリース)。
  7. できるだけ頻繁にコミットします。それが難しい傾向がある場合(たとえば、機能を実装し、コードをコンパイルするために行う変更が多すぎる場合)、実験的なブランチを使用する必要があります。
  8. トランクには最新の開発が含まれている必要があります。たとえば、アプリケーションの新しいメジャーバージョン(Nxx)をどこで開発するかを選択する場合、トランクまたはブランチで、常にトランクを優先して決定する必要があります。古いバージョンは、maintenance / supportブランチに分岐する必要があります。メジャーバージョンとその詳細(アーキテクチャ、互換性)の間に明確な違いがあることを前提としており、できるだけ早く出現します
  9. リリースブランチに対する厳格な「ビルドを中断しない」ポリシー。それまでの間、実験的な開発またはコードベースのいずれかでマージの問題を解決する必要がある場合は、トランクに対して厳密である必要はありません。
  10. svn:externalsを使用してください。プロジェクトのモジュール化、透過的なリリース管理手順の確立、さまざまな機能の分割と征服が可能になります。
  11. 問題追跡を使用ます。コミットメッセージ内の指摘参照を指摘できます。
  12. 空のコミットメッセージを無効にします。これは、プリコミットフックを使用して行うことができます。
  13. 継続的に統合するブランチを定義します。たとえば、trunkmaintenance、およびreleaseブランチに継続的インテグレーションを使用することを好みます。
  14. さまざまなタイプのブランチの継続的な統合ポリシーを確立ます。前に指摘したように、最も厳密な「ビルドを中断しない」ルールはリリースブランチに適用さますが、トランクメンテナンスブランチはときどき壊れる可能性があります。また、トランク/メンテナンスリリースブランチで実行される検査のリストにも違いがあります。

私のsubversionのベストプラクティスの概要は、私が使用するソフトウェア構成管理アプローチの主な原理を示す図の形で見つけることができます。


じゃあ、チームで働いてるの?別の人が別のブランチを使用していますか?競合を回避するには?あなたは答えがチームワークをカバーしていません:(
DataGreed

2
Q:競合を回避するにはどうすればよいですか?A:マージの必要性を最小限に抑えTrunkは最新の開発を含める必要があります。できるだけ頻繁コミットします Q:異なる人々が異なるブランチを使用していますか?A:各ブランチは1人以上のユーザーが使用できます。ブランチタイプを区別することも重要です:実験、メンテナンス、リリース、それは競合を回避するのに役立ちます Q:答えはチームワークをカバーしていません A:一見すると思われるかもしれません。バージョン管理の使用は自動的にチームワークを意味します。さらに効率的にコラボレーションするのに役立つ一連のルールを(道路のルールとして)説明しました
代替

7

私が非常に便利だと思ったのは、svn:externalプロパティです。これは、他のリポジトリから独自のリポジトリにディレクトリを参照できることを意味します。それはあなたのコードとデータを整理する本当に素晴らしい方法を提供します。次に例を示します。

  1. 異なるモジュール/ライブラリのコード用に別のリポジトリがあり、使用しているもので参照している場合。これは、すべての実行可能ファイルのメタリポジトリを持つことができることを意味します。少数のモジュールのみを使用する小さな実行可能ファイルである場合、ツリー全体をチェックアウトする必要はありません。この効果は、モジュールごとにSVNリビジョン番号を取得することです。
  2. ライブラリのコンパイル済みバージョンなどの大きなバイナリデータをコードリポジトリに追加することは、一般的に悪い習慣と見なされますが、非常に便利です。使用するすべてのライブラリーのすべてのバージョンを別のリポジトリーに追加するだけで、2つの世界のベストを得ることができます。使用するライブラリのバージョンをコードリポジトリに参照します。コードリポジトリをチェックアウトすると、コードとバイナリの両方が取得されます。ただし、バイナリは大規模なリポジトリに保存され、ソースコードと同じくらい厳密にバックアップする必要はありません。ソースコードリポジトリは小さく、テキストのみが含まれます。

1
私はポイント2が好きです。svn:externalを使用するときにリビジョン番号を指定できるかどうかを指定できるため、一部のライブラリを特定のバージョンに「固定」でき、他のライブラリは最新バージョンを「追跡」できます。
j_random_hacker

「svn:external」の使用は最も強力な機能の1つであり、SVNの最も基本的な機能と言えます。それは絶対必要です。
Danijel

5

バグ追跡ソフトウェアとの統合を使用します。Bugzillaを使用している場合は、それを設定して、コメントが「Bug XXXX」で始まる場合、SVNコメントが、そのリビジョンへのSVN Webインターフェースへのリンクを含む、所定のバグへのコメントとして自動的に追加されます。


Tracはバグ追跡のためのsvn統合に優れており、タイムライン、コミットの差分、wikiなど
Doug Currie

Jiraはまた、問題に関連するコミットを追跡します
Dan Soap、

4

SVNの分岐およびマージツールと規則について学びます。

他のチームメンバーと作業するための最良の方法は、作業を完全な開発機能/修正に分割し、ブランチごとに個別の変更に取り組むことです。次に、変更がマージされて、完了した/準備ができた/マージすることが承認されたときにメインラインのブランチ/トランクにマージします。

このようにして、個人は他の変更と衝突することなく、(同じブランチまたは別のブランチのいずれかで)共通の目標に向かって作業できます。

あなたの走行距離は異なる場合があり、これはたった2人ほどの人にとっては行き過ぎかもしれません。


3

SVNとうまく統合できる優れたツールを使用している場合は、はるかに簡単になります。これらにより、変更内容を簡単に確認し、変更のすべてまたは一部をコミットし、作業コピーをSVNの最新バージョンに頻繁に更新できます。

私はお勧めトータスSVN(Windowsを使用している場合)とビジュアルSVN(あなたがVSを使用している場合)を。

また、変更がコミットされるたびに電子メールまたは同様の通知を受け取るように設定できるかどうかを確認します(通常は、コミットメッセージと変更されたファイルのリストも含まれます)。CVSDudeのようなサービスがこれを提供します。更新が行われたことを知ってから、作業コピーを更新する前に、その更新に何が含まれているかを理解しておくと役に立ちます。


3

分岐ポリシーなどに加えて。(1つのサイズですべてに対応できるわけではありません)、適切なコミットが必要です。

  • 可能な場合、コミットは単一の作業に関連している必要があります。バグ修正、新機能-コミットした変更に対する「ロジック」が必要です
  • コミットには、リポジトリ履歴を閲覧してコミットを見つけるのに役立つ説明コメントが必要です。ほとんどの人は、最初に、コミット全体と以下の詳細なアカウントを説明する単一の文章を書くことを勧めます
  • 可能であれば、コミットをバグ追跡システムに関連付けてください。トラック、レッドマイン他。バグからコミットへ、またはその逆へのリンクを作成できます。これは非常に便利です。


2

マージの競合を修正する前に、変更についてチームに相談するか、少なくとも差分を注意深く確認してください。マージされたコードをレビューして、追加がマージで失われていないことを確認するよう依頼してください。


2

壊れたコミットを減らすことがわかったのは、適切なプリコミットスクリプトを用意することです。たとえば、変更がコミットされる前に任意の単体テストを実行できます。これにより、コミットが少し遅くなりますが、誰かのつま先を踏んだり、謝罪したりする必要がないため、時間を節約できます。もちろん、大規模な開発チームと非常に頻繁なコミットがある場合、これを管理するのは非常に難しくなります。


コミット前のスクリプトの場合は+1。いい案。それを実行せずにコミットしようとすると、gitが手にスマックを与える方法があるのだろうか?
naught101 2012年

2

バグトラッカーとの統合とコミットポリシーの適用の例の1つは、Tracのsvn pre / post-commitフックスクリプトで、コミットメッセージがバグトラッカーのチケットを参照していない場合はコミットを拒否し、既存のコメントを追加できます。メッセージの内容に基づくチケット(つまり、コミットメッセージには「Fixes#1、#2 and#8」のようなものが含まれる場合があります。ここで、#1、#2、#8はチケット番号です)。


2

SVNを使用するためのベストプラクティス:

  1. 最初にオフィスに来てEclipseプロジェクトを開いたとき、最初のステップはプロジェクトを更新することです。

  2. 更新後、作業を​​開始します。コーディングが終了したら、それを適切にチェックし、アプリケーションが例外なく適切に実行されるかどうかを確認します。コードが正常に機能していることを確認したら、コードをコミットします。

注:コードをコミットするときは、直接コミットしないでください。サーバーと同期し、コミットする必要があるものをすべて確認します。注:フォルダ全体を一度にコミットしないでください。要件に応じてファイルにいくつかの変更を加えたか、ローカルシステムの一部のファイルを削除した可能性があるためです。ただし、サーバーでは設定が異なります。したがって、ファイルを個別にチェックして、コードをコミットします。

  1. 競合ファイルを直接コミット/更新しないでください。

  2. いつオーバーライドして更新するのですか?

    ローカルでの変更が不要で、サーバーコピーを完全に更新したい場合。上書きして更新すると、ローカルの変更が反映されなくなることに注意してください。

    注:1日以上更新せずにプロジェクトを維持しないでください。また、何日もコミットせずにコードを保持しないでください。

  3. 全員が同じコンポーネントで作業していることを伝え、彼らが毎日行った変更について話し合います。

  4. 何らかの理由がない限り、プロパティと構成ファイルをコミットしないでください。サーバーとクラウドでは設定が異なるためです。

  5. ターゲットフォルダをSVNにコミットしないでください。SVNリポジトリで維持する必要があるのは、ソースコードとリソースフォルダのみです。

  6. コードを紛失しても、慌てる必要はありません。SVN履歴から以前のコピーを取り戻すことができます。

  7. プロジェクトをディスクの複数の場所にチェックアウトしないでください。1か所でチェックアウトして作業します。



1

SVN自体は良い出発点であり、他のポスターのいくつかは、ベストプラクティスに関するいくつかの素晴らしい提案を提供しています。

私が追加する唯一のことは、継続的インテグレーションプロセスを推進するためにCruiseControlまたはTeamCityでSVNを接続する必要があるということです。これにより、ビルドのメールが送信され、誰かがビルドを壊したときに全員に通知されます。

それはあなたのプロセスをフォローしている人とフォローしていない人の早い段階で非常に分かります。多少の摩擦につながる可能性がありますが、あなたのチームは長期的にはうまくいくでしょう。


1
CruiseControlは私のチームを何度も救ってくれました。
ゴードンウィルソン

1
  • コミットごとの正確なコメント

  • (メインライン)ビルドを壊さないでください!

  • 論理ユニットが変更されるとすぐにコミットする

  • バックアップツールとしてSubversionを使用しない

  • 少しの分岐/マージ

詳細については、SVNのベストプラクティスをご覧ください。


0

ブランチでDEV作業を行う

  1. ブランチへの頻繁なコミット
  2. ブランチへの離散/モジュールコミットここを参照
  3. トランクを頻繁に更新/マージします。再ベースせずにブランチに座ってはいけません

コミュニティトランク

  1. 常に構築/作業する必要があります
  2. コミットごとに1つの問題ここでも参照ほとんどの場合、一度に1つずつバックアウトできます
  3. リファクタリング/空白の変更を論理的な変更と混同しないでください。チームメイトは、コミットから実際に行ったことを抽出するのに苦労するでしょう

増分、モジュール化、個別化、簡潔化してコミットを行うほど、あなた(または他の可能性のある人)が次のことを簡単に行えるようになります。

  • 変更を段階的に取り消す
  • 大量の空白や変数名の変更をふるいにかけることなく、実際に行ったことを視覚的に理解します。
  • コミットメッセージは、メッセージの長さに対する実行された作業の比率が低いほど、意味が大きくなります。

0

これをコメントテンプレートに使用します。

[タスク/ストーリーxxx] [マイナー/メジャー] [コメント] [フォローアップコメント] [バグのURL]

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.