web-dev-qa-db-ja.com

2つのフォルダーの差分からパッチファイルを作成する

適切なパッチファイルを作成する時間をかけずに、オープンソースプロジェクトにいくつかの変更を加えました。

現在、プロジェクトのメンテナが新しいバージョンをリリースし、新しいファイルと編集されたファイルの間に、名前が変更されたファイルがたくさんあります。

変更を新しいバージョンに適用する最良の方法は何ですか?
私はdiff/patchの使用にまったく慣れていないので、gitでそれを実行できれば、もっと良いでしょう。

38
karatchov

似ている2つのディレクトリabがあり、baと同じにしたい場合は、パッチを作成して適用できます。と:

$ 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ツールを使用してローカルリポジトリを操作できれば、作業ははるかに簡単になります。

54
William Pursell

プロジェクトが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自体について多くを学ぶ必要がありますが、正しく理解するにはしばらく時間がかかります。おそらく、作業を始める前に作業内容をバックアップする必要があります。

10
niry

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
4
hlovdal

ここで私に提案された何か、興味深い「差分」ソリューションを試すことができます。最初にプロジェクトの最新バージョンを複製します。ローカルの変更はありません。 .gitフォルダーがあることを確認します。次に、作業ツリー(.gitフォルダーを除くすべてのファイル)を複製​​されたリポジトリーにコピーします。ここで「git st」と入力すると、変更されたすべてが表示されます。 git stが実際に変更のないファイルを報告する場合は、スペースと行末(git config core.autocrlf ...)も並べ替える必要があります。

Git stリストの各ファイルについて、「git diff」と入力すると、変更が表示されます。

次に、git stがコミットしたいものになるまで、ファイルを1つずつ編集します。

パッチは非常にうるさいので、パッチの作成に依存しません。ほとんどの場合、「パッチを適用できません」というメッセージが表示されますが、上記のソリューションでは、ステージングされていない変更のリストが表示されるため、任意の順序で作業できます。

1
user58777

評判が低かったのでコメントできませんでした。新しい答えを追加します。上記の答えの1つを試しましたが、まだ空白行の問題がありました。以下の方法は私にとってもうまくいきました。

diff -uraBN upstream local > filename.patch
cd upstream
patch --dry-run -p1 -i filename.patch #highly recommended recommended
patch -p1 -i filename.patch
0
Aj700

あなたはおそらくgit rebase。おそらく単純なgit pullはあなたがやりたいことをします。

0
Tallak Tveide