Git format-patchで作成されたパッチをsvn互換にして、svnリポジトリに送信できるようにする方法はありますか?
私はgithubでsvnリポジトリに取り組んでおり、メインリポジトリに変更を送信したいと考えています。これを行うにはパッチを作成する必要がありますが、gitはsvnとは異なる方法でパッチを適用するため、パッチを適用できません。まだ発見していない秘密はありますか?
UPDATE:現在、これを行うスクリプトまたはネイティブgitの方法はありませんが、手動で達成する方法について、今年の初めから投稿を見つけることができましたこの。私は指示に従い、gitパッチをsvnで動作させることに成功しました。
誰かがこれを達成し、gitプロジェクトに貢献するためにスクリプトを書くときに突き刺すことができたら、私は誰でも大歓迎だと思います。
http://kerneltrap.org/mailarchive/git/2008/1/15/570308/thread#mid-570308
私は常にこれをグーグルにする必要がありますが、私にとって完璧に機能することは次のとおりです:
git diff --no-prefix master..branch > somefile.diff
を使用してパッチを作成します。マスター部分とブランチ部分はオプションであり、差分の取得方法によって異なります。patch -p0 < somefile.diff
で申請してください。それはいつも私にとってうまくいくようで、私が出会った中で最も簡単な方法のようです。
短い答えはpatch -p1 -i {patch.file}
。
詳細については、このブログを参照してください: Gitを使用したSubversionパッチの作成 。
最新のsvnチェンジセットと指定されたコミットに対して差分を作成するためのヘルパースクリプトを次に示します。 http://www.mail-archive.com/[email protected]/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.*/===================================================================/"
Subversion <1.6はパッチをサポートしていません。 Subversion 1.7はパッチの適用を許可し、git/hg拡張は統合diffにTODOリストに載っているようです。
SVNはおそらくgit diff -p
の出力を理解できませんが、ブルートフォースに頼ることができます。
diff -r
を実行して、実際のパッチを計算します。確かに 機能要求 2008年初頭
リーナス・トーバルズはその時に言った:
したがって、「git diffを実行しないでください」と言うには、より強力なものが必要であり、名前変更の検出を最小限に抑える必要があると主張します。
かなり率直に言って、現在のgitパッチ(つまりTortoiseSVN)を受け入れないほど愚かなプログラムは、最も些細な部分だけを無効にしないでください。かなり重要な拡張機能のanyを有効にしないことを確認する必要があります。
[。
それが理由かもしれません
git-format-patch: add --no-binary to omit binary changes in the patch.
git1.5.6で2008年5月/ 7月に導入されました(ただし、テストしていません)
変更がコミットされ、git bash実行からローカルgitブランチの上にリベースされていることを確認してください:
git show --pretty >> myChangesFile.patch
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が作成されます。