2009-11-29 16 views
20

私のSCMで、インポートやメソッドのシグネチャの変更(変数の名前変更など)などのコンフリクトが発生するたびに、より迷惑なコードを処理できる言語認識のdiff /マージメソッド共有プロジェクトで起こりうる小さな変更。 Unix環境で動作する、よりスムーズに競合を処理するものはありますか?Java対応のマージコマンド

+2

良いアイデア。 – Asaph

+0

「低吊りの果物」のケースはとても簡単なので、誰かが私がこの質問を始めようと思っていたに違いないと思います。 – Marcus

+0

http://stackoverflow.com/questions/523307/semantic-diff-utilities – Marcus

答えて

5

私は、このようなツールが存在するとすばらしいことに同意しますが、私が認識しているものはありません。各SCMのマージアルゴリズム(git、hg、bzr、svnなど)は、単純なプレーンテキストである最低公倍数で動作するため、何も存在しないと私が信じる理由があります。これらのSCMツールが言語の構文と意味を実際に理解するためには、言語を解析する機能を含める必要があります。これは、SCMがJava、C#、Python、Ruby、Groovy、C、C++などの解析機能を含むためには、あまりにも大きな作業であるように思えますが、これらの言語のそれぞれがバージョン(例えば、Java genericsは1.5まで存在しませんでした)。したがって、SCMには、ソースコードが書かれている言語の言語とバージョンを検出する機能や、設定されている機能を含める必要があります。

言語依存のマージ機能は、サードパーティのマージツール(例えば、.gitconfigのマージ>ツール設定、.hgrcのui>マージ設定)にあります。このツールは、プロジェクト内の任意の.javaファイルがJava 1.6で記述されていることを知り、その後、JDKの解析機能を使用してASTを生成し、その変更がコンテキスト内で有意義であったかどうかを深く分析しますその言語。

+0

はい、それは私が "マージコマンド"を意味するものです。しかし、そのようなことがあるかどうかという疑問はまだあります。 – Marcus

0

最初の場所での競合を避けるために、インポート順序や書式設定などのためにチームの誰もが同じIDE設定を共有しているかどうかを調べるとよいでしょう。

+0

これは実際に問題を解決するものではありません。たとえば、いくつかのJavaコード "import a; import e;"を考えてみましょう。 "import b;"を追加するとします。あなたは "import c;"を適切なアルファベット順に追加します。マージする時間が来たら、マージ競合が発生します。インポートをアルファベット順に行うことに同意すると、正しいマージが何であるかについてあいまいさはありませんが、ツールはコーディング規約を認識していないためマージ競合を生成します。 – Phil

+0

マージするのが最も一般的でないのは、コードの追加が同じ場所で他のコードの追加と衝突するようです。これには一般的な解決策があるはずです。マージのスタイルは、すべての構文で十分に機能します。 (既定のマージとして、すべての挿入を含むように既定では、マージが特定のブロックまたは範囲で発生します)。 –

2

私は全く同じものを探しています。 ものがない場合、私は1つになることがあります...ツール・ベンダーは、おそらくこの種のセマンティック言語対応のマージに対処すべきであるマージ:)

今のところ、貧乏人のトリックとして、I時々3つのファイル(を前処理EclipseのCode Cleanup/Organize Imports/Order Membersを通してそれらを供給することによって、標準的なフォームに変換することができます。

これは限られていますが、これはうまくいきます。前回は〜200までの競合の数を2に減らしました。これをスクリプトにまとめ、gitのマージツールにプラグインする予定です。

また、インポートの両側を保持し、進行中のことと実行予定を説明するコメントを追加する、Java自動インポートの競合を自動作成しました: 'organize imports'。

+0

Javaのインポートの競合については、私は、競合するインポートセクション(またはすべてのインポート)を削除して、IDEにそれらを再挿入させることをお勧めします。あなたは明らかに、これが機能するために共通の輸入注文に同意する必要があります。インポートが一意ではない場合があります(例:java.util.Listとjava.awt.List)が、明らかな解決策がないケースはほとんどありません。 * – maaartinus

+0

これは私がやったことです(「スクリプトの自動読み込みでJavaのインポートの競合が発生しました」も参照してください) )。とにかく明確化のおかげで – inger

1

git rebaseはこの問題を解決していませんか? 任意の変数の名前変更は、関連するコミットで考慮されます。 git rebaseを使用すると、上流のコミットと同期することができます。あなたが頻繁にrebase(毎日ish?)をしている限り、あなたはそんなに愚かな紛争を起こすべきではありません。もしあなたが本当の紛争であり、Javaの文法パーサによって解決できないのであれば。