2008-09-16 30 views
25

私は早期に頻繁にチェックインするチームでプロジェクトに取り組んでいます。個々のチェックインは、変更を行う開発者(可能であればテストを含む)を満足させるために完了しますが、作業の方向性がわずかに変化し、以前のコミットを元に戻して別の方法で行う必要があります。または、後のコミットでスタブコードが記入されます。コードレビューに関連する変更を抽出します

コードレビューの時間が来ると、同じバグトラッキングID番号でタグ付けされた一連のコミットがあります。そのような変更のリストを簡単に取得できます。レビュー担当者が変更を1つずつ調べると、同じレビューの一部として後でコミットBによって取り消されたり変更されたコミットAがあることがあります。これにより、レビューをより困難にすることができます。

変更の間、1人の開発者しかファイルを処理していなかった場合、ファイルの元の状態とファイルの最終状態の間でdiffを実行するのは簡単です。この問題は、別の開発者が、同じファイル内で、または同じ機能内でさえ関連のない変更を行った場合に発生します。

このような状況にどう対処しますか?ファイルに一連のパッチを適用すると、最初のバージョンと最後のバージョンの差分を道徳的に同等にすることができますが、それらのパッチのサブセットのみを含むツールはありますか?

私はそれを考えると、最初の関連する変更の前からgitで一時的なブランチを作成し、レビューに関連する変更をチェリーで選ぶことができました。うまくいけば、解決しなければならない余りにも多くの紛争はないでしょう(もしあれば、そのロット全体を一度に見直すべきです)。他のアイデア?

詳細情報:これは、1回の変更で複数のファイルにアクセスする大きなレガシーシステムです。これらのファイルは大きすぎるほど重大であり、変更された可能性があることを示すことなく、最終製品をレビューするには大きすぎます。

答えて

16

ワン(subversionの用語を使用しますが、同様のアプローチがあまりにも、他のシステムで動作するはずです)アプローチ:

ちょうど最初の変更前のリビジョンで作業コピーをチェックアウト。その後、すべての関連するコミットを作業コピーにマージします。

これで、関連する変更だけでベースと異なる作業コピーが作成されました。これを直接確認するか、レビューのためにパッチを作成することができます。

ベースリビジョンの後に無関係な変更が、見直された変更と重複する場合、マージの競合が発生する可能性がありますが、これはまれなものです。私は最後のレビューから、タグに対する差分によるコードレビューを実行しますあなたの要件を考えると

ビューのSubversionの観点から
+0

ありがとう、これは私たちの状況にとって最も確かなアプローチのようです。 –

+0

[Jefromi](http://stackoverflow.com/a/3512492/165495) - 次のコマンドは、単一の著者からの変更をブランチに抽出します: 'git cherry-pick $(git log --pretty =%H --author = Alice first_commit..second_commit) ' - – Casebash

8

変更を行うには、分岐する必要があると思います。 my post hereを参照してください。

+1

私たちは、開発者が解決策を開発するのに何週間もかかる「ビッグバン」問題を回避するために、増分開発をトランクにコミットすることを選択しました。もちろん、これはレビューの後ですが、コミットを頻繁に行うと統合テストに役立ちます。 –

+0

一度にすべてを落とすことによって、どういう意味ですか? –

+0

開発者がブランチ上の作業項目を処理している場合、残りのチームから分離されます。それは支店で完璧な仕事かもしれませんが、それがトランクに統合されると、統合の問題の可能性があります。トランクへの頻繁なコミットは、そのような問題を早期に特定するのに役立ちます。 –

0

ちょうどファイルの最後の状態を見てください。

(。各変更のための分岐は面倒くさあるそれをしないでください。)

+0

残念ながら、私たちは、数千人の巨大な珍しいソースファイルを持つレガシーシステムに取り組んでいます長い行の。ファイルの現在の状態を見て、何が起こったのかを判別することは現実的ではありません。なぜなら、レビューアはファイルの残りの部分を見ていない可能性が高いからです。ディフィングが必要です。 –

3

それはあなたが持っている場合は、のIntelliJ IDEAにかなりうまくそのツールこれを行うことができ判明:

選択バージョンをコントロール|変更ビューを表示します。

左側では、リポジトリを選択して、レビューするすべてのリビジョンをクリックします。

右側のペインには、選択したリビジョンの影響を受けるすべてのファイルのリストが表示されます。 「差分」を選択すると、選択したチェンジセットの内部の変更が表示されます。

+0

最新のIntelliJ IDEA(Community Edition 9.0.1)をインストールしましたが、これは本当に良い機能のようです。 *ほとんど*私たちがレビューのために必要とするすべてを行います。左側のペインで複数の隣接していないコミットを選択すると、右側のペインにある変更の影響を受けるファイルだけが表示されます(これはうまくいきます)。ただし、関連するdiffを個々のファイルに表示すると、最初に選択したコミットと最後に選択したコミットの差分が表示されているように見えます。したがって、これには同じファイルに触れる介入コミットからの変更が含まれます。 –

+0

私はもはや転覆を使用していませんが、私はそれが絡み合った他の歴史なしでdiffを得ることは可能であると少なくともUSEDは思う。しかし、もう一度(gitを使って)私はまだそのビューの意味的価値について完全には分からない。それは、まるでコードが真空中に暮らしているかのようなものです。しかし、これは別の議論です – krosenvold

0

言語文法でパラメータ化されたツールについては、http://www.semdesigns.com/Products/SmartDifferencer/index.html を参照し、言語要素(識別子、式、ステートメント)のデルタを生成するツールについては、コミット内で発生する内部リワークは表示されません。 、ブロック、メソッド、...)挿入、削除、移動、置換、または一貫してその識別子を置換します。このツールは、空白の再フォーマット(例えば、異なる改行またはレイアウト)および意味的に区別できない値を無視する(例えば0x0Fおよび15が同じ値であることを知っている)。

これは、基本的に異なる理由で行われた2セットの変更を解消しません。 しかし、それはあなたが点検しなければならないデルタのサイズを最小限に抑え、それは確かに 助けます。

あなたはファイルが何千行もあると言います。これはCOBOLのようです。 C#、PHP、Java、C++ ...およびCOBOL用のスマート差分ツールがあります。これらのツールのほとんどはWebサイトにあります。

+2

"ファイルは何千行もありますが、これはCOBOLのようです。"何? 3000行の長い.cppファイルは見たことがありませんか? –

+0

確かに私はいくつか書いたことがあります。実際、誰もが発明したすべての言語で書かれた巨大なファイルを見ています(APLではないかもしれませんが...)しかし、OPは "大きなレガシーシステム"と彼のファイルの*すべて*がかなり大きかったので、 。私が間違っていると思った場合、多くの害はありませんでしたが、私はちょうどCOBOLの解決策があるとOPが理解していることを確かめたかったのです。 –

+0

問題のシステムは実際にAdaで書かれています。残念ながら、あなたが引用したSmart Differencerはそれをサポートしていないようです。私たちはすでに、顧客ごとに支店があり、支店間で定期的に(チームによってではなく他の人によって)移植されているため、競合を減らすためにテキストによる変更を最小限に抑えようとしています。したがって、CMのスペシャリストは、テキストの変更を最小限に抑えることができます。 –

1

。すなわち2つのタグの間の差異。

1

ソース管理システムを切り替えることができれば、真剣にgit(または水銀や他の同様のツール)を検討するかもしれません。

各開発者はそれぞれ独自のローカルリポジトリを作成します。

彼らが作業しているバグごとに、ブランチが作成されます。

変更が完了したら、rebaseコマンドを使用して履歴を再生して、変更を一貫性のあるチェックポイントにまとめます。

開発者は、レビュー用にリベースされたチェンジセットを送信します。

変更をそのまま受け入れることができます。チェリー・ピックを使用して保持したい項目を取得したり、リベースしてグループ化されていないコミットを分割したりすることができます。

+0

この方法論はどこかもっと詳しく説明していますか?私はもっ​​と学びたいです。 –

0

patchutilsパッケージには、「2つのインクリメンタルパッチから累積された統合パッチを作成できる」combinediffツールが含まれています。

1

私はあなたが提案したことをかなり行うでしょう。レビューブランチを作成します。そのブランチにチェリーピッキングを行うために変更がレビューされている開発者を入手してください。頭部の枝の根を差し引く。

私はおそらく、特定のバグトラッキングIDタグに一致するすべてのチェックインを取得し、それらをおおよそのスクリプトにまとめてチェリーピッキングを実行する小さなツールを作成します。私は間違いなくユーザーに、このスクリプトを実行する前にこのスクリプトを編集する機会を与えたいと思います。

ブランチでレビューを行います。ブランチを編集します。チェリーは編集内容をトランクに戻します。あなたがもうそれをしたくない場合は、レビューブランチを破棄してください。

0

.NET開発者の場合は、このような場合にはNDepend code diff capabilitiesが便利です。免責事項:私はこのツールの開発者の一人です

基本的にNDependはコードベースを分析し、コードのスナップショットを作成して保持することができます。 2つの異なる時間に撮影された2つのそのようなスナップショットを比較することができます。

from m in Application.Methods where m.CodeWasChanged() select m 

あなたは、あなたのコードのクエリを絞り込むと尋ねることができます。その後、NDependの書き込みと同じように簡単に...コードが変更された新しいメソッド/クラス、削除メソッド/クラス、メソッド/クラスを求めるためにcode query over LINQ (CQLinq)を書き込むことができます特定のプロパティのために、のようなメソッドの名前は、単語抽出が含まれており、コードの30の以上の行があるとします。また、

from m in Application.Methods 
where m.CodeWasChanged() && m.NameLike("Extract") && m.NbLinesOfCode > 30 
select m 

、NDependのでき plug to any text diff toolを。ユーザーは、変更されたメソッドまたはクラスの2つのバージョンを比較できます。

もう一つの優れた機能は、NDependをRedGate Reflectorに接続し、メソッド/クラスの2つのバージョンを逆コンパイルし、これら2つのバージョンをテキスト差分ツールで比較することです。 この機能は、というシナリオで特に役に立ちます。これは、実際に巨大なソースファイルにネストされていても、単一のメソッドまたはクラスに対してのみコード差分を実行するためです。

はまた、クエリを自分で書く避けるために、変化によってパネル検索はあなたのためのdiffの上にそのようなコードのクエリを生成します。この独創的なアプローチを助けることができる

NDepend Search by Changes Panel

希望。

関連する問題