web-dev-qa-db-ja.com

SVN diffに新しいファイルを含める

アプリケーションをビルドしてリモートマシンにアップロードし、そこでパフォーマンステストを実行して、気になるメトリックをキャプチャするスクリプトがあります。このスクリプトは、ワークスペースで行ったローカル変更用のパッチファイルを作成し、パフォーマンス番号とともに表示します。これは、さまざまな調整オプションの効果を比較するのに役立ちます。後でワークスペースを再作成する場合は、SVNリビジョン番号とパッチを使用できます。

最初に明示的にsvn diffを使用しない限り、ワークスペースに追加した新しいファイルはsvn addから報告されません。新しいファイルも含むパッチファイルを作成する方法はありますか?

PS:同様の質問が尋ねられました here が適切に回答されていませんでした、IMO。

31
Binil Thomas

svn diffにローカルの作業用コピーからバージョン管理されていないすべてのファイルを含めるには、これらのファイルを最初に追加する必要があります。 svn diffは、svn commitが使用するのと同じチェンジセットを出力します。

バージョン管理されていないすべてのファイルをここに追加する必要があることが確実にわかっている場合は、次のことを実行できます。

svn statusの出力から疑問符で始まるすべての行を取得して、バージョン管理されていないファイルのリストを準備します。

svn status | grep ^? | sed -r 's/^\? +//' > ../unversioned_files_list.txt

次に、そのファイルのリストをsvn addusing xargsに渡すことができます。

xargs -r -d '\n' svn add < ../unversioned_files_list.txt

次に、パッチを作成します。

svn diff > ../my_patch.patch

これらのファイルを追加したままにしたくない場合は、ファイルのリストを使用して、ファイルの追加を解除します。

xargs -r -d '\n' svn rm --keep-local < ../unversioned_files_list.txt
41
Alex Jasmin

アレクサンドルに感謝します。最初は、彼のアプローチは私の場合うまくいきませんでした。すべての新しいファイルがsvn statusAになっていることを確認しましたが、diffファイルはまだ空でした。最後に、svn statusの出力に違いがあることがわかりました。私の場合、4番目の列にはすべて次のように+が入力されています。

$ svn st
M      .
A  +    New.Java

これは、アイテムがaddition-with-history [1]にスケジュールされていることを意味します。これは通常、ファイルまたはディレクトリをsvn moveまたはsvn copyしたときに発生します[2]。私の場合、New.Javaは別のブランチからのsvn mergedであり、そのブランチの以前のコミット履歴も含まれています。これらの履歴情報を削除してみましょう。

まず、すべてのaddition-with-historyアイテムを見つけます:

svn status | grep ^A | sed -r 's/^A[ +]+//' > /tmp/add_list

必要に応じて、/tmp/add_listのディレクトリパスを削除して、次のステップでの警告を回避します。

次に、svn removeを使用して履歴コミット情報を削除します。

xargs -r -d '\n' svn remove --keep-local --force < /tmp/add_list

次に、Alexandreのソリューションに戻り、それらを再度Subversionに追加して、差分を取得します。

参照:

[1]http://svnbook.red-bean.com/nightly/en/svn.ref.svn.c.status.html
[2]http://www.linuxtopia.org/online_books/programming_tool_guides/version_control_with_Subversion/svn.ref.svn.c.status.html
12
guiwuu