2017-10-18 2 views
0

私はabという2つの異なるローカルgit reposを持っています。それらは両方ともホームディレクトリのprojectsフォルダにあります。私は両方のreposで特定のファイルを比較したい、それをfooと呼んで、そのdiffをaに適用しようと思います。2つの異なるgitリポジトリにあるファイル間でdiffを取得し、最初のrepoに適用します

私は差分を見て、それは私が適用する変更が含まれていることを確認することができa内部からgit diff ./foo ../b/foo > diff.diffを実行しますが、私はgit apply diff.diffを実行したとき、私はこのエラーを取得する場合:

fatal: invalid path './foo' 

私がしようとした場合私は差分を適用しようとすると、git diff ~/projects/a/foo ~/projects/b/foo > diff.diffを実行し、その後、私はこのエラーを取得する:

error: home/ryan/projects/a/foo: No such file or directory 

今、私はちょうど差分を適用するのと同じ効果を得るためにファイルをコピーすることができますが、そこには良い理由は、このISNです働いている?

+0

diffは1つのリポジトリ内でのみ使用できます。しかし、あなたは通常の 'diff'を実行することができます。 'diff'の出力を' git apply'で使うには、unidiff形式に 'diff -u'を使います。 – Mort

+0

私はちょうどそれを使って相対パスを使ってみましたが、diffを正常に作成しましたが、同様の 'No such file or directory'エラーが出ました。 – Ryan1729

答えて

1

レポaとレポbfooファイルを比較し、aをレポして変更を適用するには、あなただけのコマンドの下に使用する必要があります。

# In ~/projects/a (local repo a) 
git remote add repob ~/projects/b -f 
git diff master repob/master -- foo > diff.patch 
git apply diff.patch 

今レポbのバージョンにレポa変化foo 。そして、あなたがコミットしてプッシュすることができます。すべての

git add foo 
git commit -m 'change foo as the version in repo b' 
git push 
+0

たぶん私は何かが欠けているかもしれませんが、diffを作成してdiffファイル自体をリポジトリにコミットするように見えます。それはdiffを実際に適用しますか? – Ryan1729

+0

私の答えを更新しました。そして、実際には、repo 'b'からrepo' a'への変更 'foo'を適用します。 –

+0

私はリモートを追加する必要があることが奇妙に思うが、私はそれを試み、それは働いた!これはdiffを 'a'ディレクトリに残すので、代わりに'/tmp/diff.patch'を使いたいかもしれません。 – Ryan1729

0

まず、git diffはここで、あなたはあなたに何を買っていないだけでなく、プレーンdiff -uを使用する場合があります。このパッチが適用されない理由は、git-applyがdiffの一貫性のないファイルパスと混同されているためです。この問題を解決するには、作業ディレクトリを設定して、diffにファイルの両方のバージョンの相対パスが同じ深さになるようにする必要があります。ここでは、両方のプロジェクトディレクトリの共通の親ディレクトリにディレクトリを変更します。

cd ~/projects 
diff -u a/foo b/foo >a/diff.patch 
cd a 
patch -p1 <diff.patch 
git add ... commit ... etc ... 
関連する問題