Subversion:diff + logを抽出して再生する


2

SVNリポジトリにアクセスするために、クライアントがネットワークにVPNで接続するために使用できるコンピューターを提供してくれたという状況に私は気づいています。しかし、私たち全員がそのコンピューターで開発を行うことはできないため、「ブランチ」をエクスポートし、それを自分のSVNリポジトリにインポートしました。クライアントは日々の仕事を本当に気にしていないので、都合の良いときに大きなチェンジセットを単にドロップすることを計画しています。これはすべて機能するでしょう、私はそれを確信しています。

最近、SVNからチェンジセット(つまり、diff +メッセージ)を取得し、それをクライアントのSVNにリプレイする簡単な方法があるかどうか疑問に思っています。何git format-patchgit am許可に似ています。

見るとsvn log --diffそれは可能だと思われますが、出力をパッチ(を使用して適用されるsvn patch)とコミットメッセージ(に提供されるsvn commit -F)に分離するスクリプトを作成する必要があります。私はそのようなスクリプトを書くことを必要としない解決策があることを願っています;)

回答:


3
  1. LAST_MOVEDは最後に移動したコミットです。最初は0ですが、後で増加します。

  2. コミットのリストを取得します。

    svn log -q -r $LAST_MOVED:HEAD | grep -o ^r[0-9]*

    これは次のようなものを生成します

    r10
    r12
    r16
    r22

  3. 改訂ごとに、diffを取得する必要があります。

    svn diff -c $REVISION > $ REVISION.diff

    そしてコミットメッセージ:

    svn log -c $REVISION | tail -n -2 | head -n -1 > $ REVISION.txt

    あなたが持っています:

    r10.diff
    r10.txt

    r12.diff
    r12.txt

    r16.diff
    r16.txt

    r22.diff
    r22.txt

  4. これらのファイルをターゲットマシンに取得し、

  5. 走る svn update

  6. それぞれr*.diffr*.txtファイルの実行:

    • patch -p0 -i r{number}.diff

    • svn commit -a -m --file r{number}.txt

svnがバイナリデータ比較しないという問題があるため、この方法を使用してバイナリデータを転送することはできません。各バイナリファイルについては、次のものが得られます。

インデックス:path / to / file / something.jar
======================================= ============================
表示できません:バイナリタイプとしてマークされたファイル。
svn:mime-type = application / octet-stream

diffファイルでこの文字列を検出する必要があります。これらのファイルについては、https: //stackoverflow.com/a/2255846/146745で説明されている外部diffコマンドを使用できます


おかげで、それは非常に明確です。プロジェクトを設定する開発者がかなりの数のバイナリファイルをチェックインすることを決定したため、バイナリファイルに関する制限は少し面倒です。つまり、構成はExcelで実行されます。また、patchover を使用することに欠点はありませんsvn patchか?
マグナス14年

1)patchそして、svn patch同じ魔法をする必要があります。2)取得するためのバイナリ差分はgitを使用することができます-これを見てとるstackoverflow.com/questions/2234820/...
アンドレイ

svn diff --forceバイナリファイルの処理に使用します。svn patch自動的に実行されますsvn addsvn rm、新規および削除されたファイルに。
ジョンクーゲルマン

1

@andrejの答えは、1行のテキストを超えないコミットメッセージがある場合に有効だったと思います。これで、空のコミットメッセージが表示されます。

$ svn log -c r80 test/ | tail -n 2 | head -n 1

$

注:ご使用のバージョンがsvn log提示されたオプションをサポートしていると思います。

より良い方法は、svnルート内のあるパスからリビジョンをgrepし、svn log代わりに使用することです。正規表現はr、それで始まるコミットメッセージがある場合に、単一と一致しないように調整されます。

次のコマンドは、ディレクトリに影響するリビジョンからパッチを作成しますdir

$ dir=test/
$ svn log "${dir}" | grep -oE '^r[0-9]+' \
        | while read -r rev; do
                svn log --diff -c ${rev} "${dir}" > "${rev}-${dir/\/*/}.patch";
        done

r80-test.patchにパッチを適用するコマンド:

$ patch -p 0 < r80-test.patch

SVNバージョン1.9.5でテスト済み。


0

非推奨、他の回答を参照

  1. ファイルを変更する
  2. 走る svn add *
  3. 走る svn diff > file.diff
  4. file.diffをクライアントのPCにコピーします
  5. クライアントPCで実行 svn update
  6. 走る patch -p0 -i file.diff
  7. 走る svn commit -a
  8. 楽しい!

「私たちのSVN」に一連の変更があり、それらを「彼らのSVN」に持ち込みたいので、それはあまりうまくいきません。問題は、個々のコミットを維持しながらそれを簡単に行えるかどうかです。
マグナス14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.