2009-03-18 14 views
47

私は2つのリポジトリに自分のプロジェクトを持っています。 1つはSVNの下、もう1つはGitの下にあります。 私はSVNで何かを変更するたびに、Gitリポジトリに同じことをしたいと思います。GitにSVN diffを適用するには?

私はSVNリポジトリに変更を加えて、リビジョン125を作りました。私のGitリポジトリにこれらの同じ変更を適用するにはどうすればいいですか?(私のGitリポジトリがリビジョン124で最新であると仮定して)

ありがとうございます。

答えて

46

は、私が実際にやった/を探していた:

cd /path/to/svn/repo 
svn diff -r 125 > /tmp/patch.diff 
cd /path/to/git/repo 
patch -p0 < /tmp/patch.diff 
+1

それはうまくいきませんでした! –

+1

申し訳ありませんが、これは本当に特定の状況でした。 ( – drozzy

+1

)git-svnは、svnのコミットをgitリポジトリにインポート(およびエクスポート)するより良い方法です。コミットメッセージと著者情報を保持し、多くのものに対処します(ここで説明していない外部の制約がある場合は、このスクリプトがあなたの状況に適しているかもしれません) – Rich

18

試してみてください。

svn diff | patch -d /path/to/git/repo -p0 

あなたが特定のリビジョンの差分をエクスポートする場合svn help diffを参照してください。

+1

を実行するのはなぜ-p0と、この作業が中断しているしないのですか? –

+0

http://linux.die.net/man/1/patchの-pnumを参照してください。特に、「-pを指定していません」という単語のページを検索してください。私はあなたがそれを指定しないと思う - patchはファイルパスを無視し、単にファイル名を使う。 – drozzy

2

も設定を検討可能性があります上記のようなパッチを使用してほかpost-commit hookはそう、あなたが何か新しいことをコミットし、このすべての時間を行う必要はありません。

5

なぜgit-svnのような人はいませんか?私は誰もそれについて知っていると仮定することはできません。

git-svn(とgit-hgとgit-cvsとgit-bzr afaict)があります。少なくとも付きのgit-svnのは、あなたは、単に行うことができます

git svn clone --stdlayout http://myrepo/root here 

使用して-s(--stdlayout)標準トランク/支店/タグ/レイアウトを前提としていますが、それを任意のどの方法(man git-svn)を持つことができます。

マッピングは双方向であるため、ネイティブ(git)リモートと同様にプッシュしてプルできます。質問はありません。

+0

コミット後の自動プッシュを行うためにpost-commitフックを自由に追加することができます:) – sehe

+0

これはdoesn Windows上でsvn-gitを使って私の仕事をすると 'git apply'が失敗するので、svn-style diffの相対パスを正しく解析できないからです。 –

+1

@the_mandrill erm ... 'patch -p1'(または-p0、またはそれを削除する必要があるもの)を使用しますか?あ、ちょっと待って。おいしい質問。ポイントは、あなたはsvnスタイルのdiffsを必要としないということです。 'git cherry-pick' – sehe

0

以下は私のために働いた。

出典:How to create and apply a patch with Git

まず、パッチにあるどのような変更を見てみましょう。このコマンドは、パッチを適用しませんが、唯一のあなたはそれをやるかについての統計情報が表示されていることを

git apply --stat fix_empty_poster.patch 

注意を適用するにgitで簡単にこれを行うことができます。好きなエディタでパッチファイルを調べた後、実際の変更内容を確認することができます。

次に、パッチがになることにどのくらい面倒であるか興味があります。 Gitでは、実際にパッチを適用する前にパッチをテストすることができます。

git apply --check fix_empty_poster.patch 

あなたはすべてのエラーを取得しない場合、パッチがきれい適用することができます。さもなければ、あなたはどんな問題に遭遇するのかを見るかもしれません

パッチを適用するには、git applyではなくgit amを使用します。この理由は、git amを使用すると、適用されたパッチからサインオフすることができるからです。これは後で参照するのに便利です。

git am --signoff < fix_empty_poster.patch 

Applying: Added specs to test empty poster URL behaviour 
Applying: Added poster URL as part of cli output 

いいえ、パッチは完全に適用され、マスターブランチは更新されました。もちろん、何も壊れていないことを確認するために再度テストを実行してください。

git logには、コミットメッセージに「Sign-off-by」タグが含まれていることがわかります。このタグはGithubと他の人がコード内でコミットがどのように終わったかについての有用な情報を提供するために読まれます。あなたはSVNでパッチを生成し、Gitリポジトリとそれを後から適用しようとしている場合

4

--git command-line optionを使用することを忘れないでください:

--git

は、設計されたのsvn diffのための特別な出力モードを有効にします人気のGit分散バージョンコントロール システムとの相互互換性のために。例えば

svn diff --git -r 125 > /tmp/patch.diff

+0

svn:無効なオプション: - ギフト – sloven

+0

@ニックあなたのsvnクライアントが古すぎると思います。 svn --versionの結果はどうですか? – bahrep

+0

svnバージョン1.6.13 – sloven

関連する問題