Gitフォーマットパッチはsvn互換ですか?


96

git format-patchで作成したパッチをsvn互換にして、svnリポジトリに提出できるようにする方法はありますか?

私はgithubのsvnリポジトリで作業しており、変更をメインリポジトリに送信したいと思います。これを行うにはパッチを作成する必要がありますが、svnとは異なる方法でパッチを適用するgitフォーマットのため、パッチを適用できません。まだ発見していない秘密はありますか?

更新:現在、これを行うスクリプトまたはネイティブgitの方法はありませんが、手動でこれを行う方法について、今年の初めからなんとか投稿を見つけました。私は指示に従い、gitパッチをsvnで動作させることに成功しました。

誰かがスクリプトを書いてこれを達成し、gitプロジェクトに貢献できるとしたら、私は皆に大歓迎です。

http://kerneltrap.org/mailarchive/git/2008/1/15/570308/thread#mid-570308


動作しません...必要なすべての手順を投稿できますか?ありがとう!
Mauricio Scheffer、

1
アンソニーこんにちは。ニコラスの承認された回答を変更することを検討しますか?
Simon East

私はサイモンの提案を2番目に挙げます。ニコラススミスの答えを受け入れられたものにすることは、はるかに実用的であるため、すべての人にメリットがあります。
Albireo 2014年

回答:


90

私はいつもこれをGoogleにしなければなりませんが、(私にとって)完全に機能することがわかった方法は次のとおりです。

  • でパッチを作成します。git diff --no-prefix master..branch > somefile.diffマスター部分とブランチ部分はオプションであり、差分をどのように取得するかによって異なります。
  • どこにでも送って、で申し込みますpatch -p0 < somefile.diff

それは私にとって常にうまくいくようで、私が出会った最も簡単な方法のようです。


1
これは、Gitを使用してSVN互換のパッチを生成する標準的な方法です。答えとしてマークする必要があります。
mloskot 2014

--no-pagerのオプションではなくなりましたgit diff
naught101

それはもともとなし--no-pagerで投稿されました、それが編集で追加された理由はわかりません。それは--no-pagerとにかく私にとってはいつもうまくいきます。
ニコラススミス

2
特定の場合のみコミット:git diff --no-prefix 056a1ba5140 7d939289b80 >my.patch(ここで、私のために働いた056a1ba51407d939289b80SHA-1以前と特定のはgitのにコミットしています)。
Ed Randall

@LilásこれはSVNの問題です。SVNの差分/パッチは、削除されたファイルを処理することができませんでした
Toofy


17

以下は、最新のsvnチェンジセットと指定されたコミットに対してdiffを作成するためのヘルパースクリプトです。http//www.mail-archive.com/dev@trafficserver.apache.org/msg00864.html

#!/bin/sh
#
# git-svn-diff
# Generate an SVN-compatible diff against the tip of the tracking branch
TRACKING_BRANCH=`git config --get svn-remote.svn.fetch | sed -e 's/.*:refs\/remotes\///'`
REV=`git svn find-rev $(git rev-list --date-order --max-count=1 $TRACKING_BRANCH)`
git diff --no-prefix $(git rev-list --date-order --max-count=1 $TRACKING_BRANCH) $* |
sed -e "s/^+++ .*/&    (working copy)/" -e "s/^--- .*/&    (revision $REV)/" \
-e "s/^diff --git [^[:space:]]*/Index:/" \
-e "s/^index.*/===================================================================/"

1
最新のsvnリビジョンで作業していない場合、REV値が正しくないことがわかりました。git svn info代わりに次のように使用するように修正しました: REV=`git svn info | grep 'Last Changed Rev:' | sed -E 's/^.*: ([[:digit:]]*)/\1/'`
Sebastien Martin

1
これはすごい!どうもありがとうございます。私は、フィッシュアイのるつぼに私のパッチをインポートするための仕事にそれのための1つの変更をしなければならなかった、そしてそれは、代わりにタブで「(改正」の前にスペースを置き換えることでした。
Zugwalt

10

SVNはおそらくの出力を理解できませんが、git diff -pブルートフォースに頼ることができます。

  1. レポのクローンを2つ作成する
  2. 1つのクローンで最新のものをチェックしてください
  3. 他のクローンのチェックアウトでは、svn上流に相当するものは何でも。事前に計画している場合は、独自のブランチにsvnアップストリームのコピーがあるか、最後のsvnバージョンにタグを付けています。事前に計画していない場合は、日付またはgitkを使用して、svnの状態に最も近いgit SHA1ハッシュを見つけます。
  4. 次にdiff -r、2つのクローンを実行して実際のパッチを計算します。

12
または、@ Nicholas-smithのアドバイスに従ってgit diff --no-prefix > somefile.diffgitリポジトリで実行し、svnユーザーに送信してpatch -p0 < somefile.diff、プロジェクトのルートでパッチを適用します。
DavidG 2013年

10

Subversion <1.6はパッチをサポートしていません。Subversion 1.7ではパッチを適用できるようで、統合されたdiffにgit / hg拡張がTODOリストに含まれています。


4

確かに機能のリクエストです 2008年の初めに

ライナス・トーバルズ氏は当時、次のように述べています。

そのため、「git diffを行わないでください」と言うにはより強力なものが必要であり、名前の変更の検出も最低限許可しないようにする必要があります。
率直に言って、現在のgitパッチ(TortoiseSVNなど)を受け入れないほど愚かなプログラムであれば、その最も重要な部分を無効にするだけでは十分ではありません。我々は有効にしないことを確認する必要がありますどの:むしろ重要な拡張子のを
ToirtoiseSVNはそれらを無視した場合でも、それらを無視して、それは差分を誤って理解し、それがすべてでは許されるべきではないことを意味します。

それが理由かもしれません

 git-format-patch: add --no-binary to omit binary changes in the patch.

2008年5月/ 7月にGit1.5.6で導入されました(ただし、テストしていません)


0

git bash runから、変更がコミットされ、ローカルのgitブランチの上にリベースされていることを確認します。

git show --pretty >> myChangesFile.patch


0

Nicholasが提供する受け入れられた回答は、a)バイナリファイルがdiffに存在する場合、またはb)Windows Gitで作業していて、スペースのあるディレクトリがある場合を除き、正常に機能します。これを解決するには、バイナリを無視するネストされたgit diffコマンドと、スペースをエスケープするsedコマンドを追加する必要がありました。書くのが少し面倒なので、エイリアスを作成しました:

[alias]
svnpatch = "!f() { git diff --name-only --no-prefix master...$1 | grep -Ev \"\\.sdf|\\.Doc|\\.dll|\\.zip|\\.exe\" | sed 's_\\s_\\\\\\\\ _g'  | xargs git diff --no-prefix master...$1 > $1.patch; echo "Created $1.patch"; }; f"

次に入力すると:

git svnpatch Feature123

...ブランチマスターのマージベースとブランチFeature123の違いを含むパッチファイルFeature123.patchが作成されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.