適切なパッチファイルを作成する時間をかけずに、オープンソースプロジェクトにいくつかの変更を加えました。
現在、プロジェクトのメンテナが新しいバージョンをリリースし、新しいファイルと編集されたファイルの間に、名前が変更されたファイルがたくさんあります。
変更を新しいバージョンに適用する最良の方法は何ですか?
私はdiff/patchの使用にまったく慣れていないので、gitでそれを実行できれば、もっと良いでしょう。
似ている2つのディレクトリa
とb
があり、b
をa
と同じにしたい場合は、パッチを作成して適用できます。と:
$ diff -ur b a > ba.diff
$ patch -i ba.diff
local
(upstream1.0のローカルバージョンを含む)、upstream1.0
、およびupstream1.1
のディレクトリがあるとします。変更を作成してupstream1.1
に適用するには:
$ diff -ur upstream1.0 local > my.diff
$ cd upstream1.1
$ patch -i ../my.diff
ドキュメントでパッチを確認し、上流のメンテナにgitを使用するように説得してください。 gitツールを使用してローカルリポジトリを操作できれば、作業ははるかに簡単になります。
プロジェクトがgitの下にあり、ローカルで変更をコミットしていない場合は、git diff > file.patch
を実行するだけで、パッチ可能な差分データを取得できます。ローカルで変更をコミットした場合は、git log
を実行して、自分の前でgit diff commit_string > file.patch
よりも先にコミットを見つけることができます。
プロジェクトがgitの下にない場合、または(タイトルが示すように)リポジトリを複製せずにソースをd/lする場合は、diff -urN original_dir new_dir > file.patch
を使用してパッチファイルを作成できます。どちらの場合も、後でパッチを適用してパッチを適用することができます。
ただし、gitはファイル名の変更も追跡できるため、変更を新しいバージョンにマージするためにgitツールの使用を検討してください。 git自体について多くを学ぶ必要がありますが、正しく理解するにはしばらく時間がかかります。おそらく、作業を始める前に作業内容をバックアップする必要があります。
Gitはファイルの名前の変更を検出するためのサポートを備えているので、運が良ければそれが役立ちます。以下は、あなたがすべきことのおおよそのドラフトです。
元のバージョンをインポートします。
tar zxvf open-source-project-0.1.tar.gz
mv open-source-project-0.1 open-source-project
cd open-source-project
git init
git add .
git commit -m "Initial checkin of open-source-project-0.1"
git tag open-source-project-0.1
これで、別のブランチで元の変更を適用できます。
git checkout -b mychanges
cp /somewhere/where/your/changes/files/are/* .
git diff
git add .
git commit -m "My changes"
git tag my_changes_001
次に、新しいバージョンに更新します。
git checkout master
tar zxvf open-source-project-0.2.tar.gz
mv open-source-project-0.2/* .
rmdir open-source-project-0.2
git add .
git commit -m "Update to open-source-project-0.2"
git tag open-source-project-0.2
これまでのところ、すべてがgitリポジトリにチェックインされています。ここで、変更をマージしようとします。
git checkout -b merge_test open-source-project-0.2
git pull . my_changes_001
幸運を...
ファイルを手動でマージする場合は、 KDiff を使用することをお勧めします。 file1.cがopen-source-project-0.1から、file2.cがopen-source-project-0.2から、file3.cが変更からのものであると仮定して、以下を実行します。
kdiff3 -o merged_file.c file1.c file2.c file3.c
ここで私に提案された何か、興味深い「差分」ソリューションを試すことができます。最初にプロジェクトの最新バージョンを複製します。ローカルの変更はありません。 .gitフォルダーがあることを確認します。次に、作業ツリー(.gitフォルダーを除くすべてのファイル)を複製されたリポジトリーにコピーします。ここで「git st」と入力すると、変更されたすべてが表示されます。 git stが実際に変更のないファイルを報告する場合は、スペースと行末(git config core.autocrlf ...)も並べ替える必要があります。
Git stリストの各ファイルについて、「git diff」と入力すると、変更が表示されます。
次に、git stがコミットしたいものになるまで、ファイルを1つずつ編集します。
パッチは非常にうるさいので、パッチの作成に依存しません。ほとんどの場合、「パッチを適用できません」というメッセージが表示されますが、上記のソリューションでは、ステージングされていない変更のリストが表示されるため、任意の順序で作業できます。
評判が低かったのでコメントできませんでした。新しい答えを追加します。上記の答えの1つを試しましたが、まだ空白行の問題がありました。以下の方法は私にとってもうまくいきました。
diff -uraBN upstream local > filename.patch
cd upstream
patch --dry-run -p1 -i filename.patch #highly recommended recommended
patch -p1 -i filename.patch
あなたはおそらくgit rebase
。おそらく単純なgit pull
はあなたがやりたいことをします。