web-dev-qa-db-ja.com

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

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

94
rip747

私は常にこれをグーグルにする必要がありますが、私にとって完璧に機能することは次のとおりです:

  • git diff --no-prefix master..branch > somefile.diffを使用してパッチを作成します。マスター部分とブランチ部分はオプションであり、差分の取得方法によって異なります。
  • どこにでも送信して、patch -p0 < somefile.diffで申請してください。

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

87
Nicholas Smith

短い答えはpatch -p1 -i {patch.file}

詳細については、このブログを参照してください: Gitを使用したSubversionパッチの作成

21
Wallace Wong

最新の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.*/===================================================================/"
17
Christoph

Subversion <1.6はパッチをサポートしていません。 Subversion 1.7はパッチの適用を許可し、git/hg拡張は統合diffにTODOリストに載っているようです。

10
Bert Huijben

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

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

確かに 機能要求 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月に導入されました(ただし、テストしていません)

4
VonC

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

git show --pretty >> myChangesFile.patch

0
Ismail Hawayel

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が作成されます。

0
Leandro Gomez