パッチを変更ソースと同期したままにする

パッチを変更ソースと同期したままにする

ファイルFがF 'に変更されたときに正しく機能するように、ファイルFで動作する「パッチ」Pを生成する標準オプションはありますか?

したがって、P'(F') が P(F) と同じ変更を生成するように P を P' に変更するメカニズムがあるか、好ましくは F&F' に使用できるように弾性 P を持つようになります。

現在、私は正規表現の検索と置換を使用してこれらのパッチを作成していますが、このような作業を行う標準的な方法があるかどうかを知りたいと思います。

答え1

sed私はこのようなものを使用することを本当にお勧めしません。問題は、パッチが適用されても「ぼやけて」現れることが多いことです。つまり、一部のコンテキスト行が完全に一致しないことを意味します。これは通常、デフォルトの周辺コードがわずかに変更されたことを意味しますが、パッチが間違った場所に適用されたことを意味する可能性があります(これが起こったことを見たことがありますが、それは悪くもデバッグも簡単ではありません)。

また、パッチがきれいに適用されても、意味上、もはや意味がないかもしれません。ただし、これをキャッチするには、パッチ付きコードで行われた変更を理解する必要があります。

指定された理由により、少なくともぼかしに適用されるすべての項目を確認することをお勧めします(そして、表面的にオフセットに適用されるすべての項目も確認します)。基本的な3行以上のコンテキストを持つことも良い考えかもしれません。

大きな警告を念頭に置いて比較的簡単に行う1つの方法は、バージョン管理システム、おそらく次のような高度な分散システムを使用することです。mercurialまたはgit。 2つの間の選択に応じて意見が異なります。 MercurialはGitより前のCVSやSVNに似ており、おそらくより良い学習曲線も持っています(Whikle Gitは機能が豊富であると言われています)。

Mercurialには次のものがあります。Mercurial Queue (MQ) 拡張このような状況のためです。スティーブ・ロチェの作品です。ブログ投稿MQの使用に関する非常に良い紹介です。もう一つの良い内容は次のとおりです。MQガイドMozilla開発者サイト。

時々、patchutilsそれはまた便利かもしれません。

答え2

この問題をマージと呼びます。元のファイルAと2つの修正バージョンB、Cがあり、これら2つの修正を組み合わせたバージョンDを作成したいと思います。これは変更が独立している場合にのみ機能します。そうでない場合、マージは手動プロセスです。ソースコードへの同時変更のマージを処理することは、ソフトウェアエンジニアリングの一般的な作業です。

diff単純なケースでは、ソースファイルが変更された場合、結果のパッチはすでに機能します。このpatchユーティリティは少し「ぼかし」を可能にします。 A から B を比較し、その差の影響を受ける領域が A と C で同じである場合 (ただし、ファイルのオフセットが異なる場合がある) パッチがきれいになります。このアプローチBとCの変更された領域が同じ位置にない限り(数行で区切る必要がある)、Cに適用するとうまく機能します。

パッチが完全に適用されないと、マージが難しく、ドメイン固有の問題になります。たとえば、次の2つの変更を考えてみましょう。

A         B         C
a=2       a=3       b=2
x=a       x=a       x=b

2人間はBがに変更され、3Cがに名前が変更されたaパターンを見つける傾向があるので、bマージ結果はb=3、でなければなりませんx=b。ただし、自動化されたツールは2つの異なる方法で修正されているため、最初の行を競合としてマークできます。

BとCの両方に「合理的な作業」を実行するパッチを書くのは難しい(AI完成)問題です。実際の生活の中で多くの一般的なケースでは、diff -u A Bas-patchを使用すると、Cで目的のDが機能して生成されたり、パッチアプリケーションがクリーンでないというエラーで失敗する傾向があります。

関連情報