私は、作業コピー内のバージョン管理されていないすべてのファイルをSVNリポジトリに自動的に「svn add」するための良い方法を探しています。
ソース管理下にある必要があるいくつかのファイルを作成できるライブサーバーがあります。一度に1つずつ追加するのではなく、これらを自動的に追加するために実行できる短いスクリプトが欲しいのですが。
私のサーバーはWindows Server 2003を実行しているため、Unixソリューションは機能しません。
私は、作業コピー内のバージョン管理されていないすべてのファイルをSVNリポジトリに自動的に「svn add」するための良い方法を探しています。
ソース管理下にある必要があるいくつかのファイルを作成できるライブサーバーがあります。一度に1つずつ追加するのではなく、これらを自動的に追加するために実行できる短いスクリプトが欲しいのですが。
私のサーバーはWindows Server 2003を実行しているため、Unixソリューションは機能しません。
回答:
svn add --force * --auto-props --parents --depth infinity -q
すばらしいヒントです。1つの注意:私のEclipseは新しいファイルを無視リストに自動的に追加します。設定の問題かもしれませんが、とにかく--no-ignore
役立つオプションがあります。
この後、コミットできます:
svn commit -m 'Adding a file'
alias magic="svn add --force * --auto-props --parents --depth infinity -q"
-説明:svn help add
*
最後に置く必要があります。そうしないと機能しません(
これは私の質問とは異なりますが、この質問に属する答えがあります:
svn status | grep '?' | sed 's/^.* /svn add /' | bash
これが機能するのは次のとおりです。
c:\work\repo1>svn add . --force
サブディレクトリの内容を追加します。
無視されたファイルを追加しません。
追加されたファイルをリストします。
コマンドのドットは現在のディレクトリを示します。現在のディレクトリとは異なるディレクトリを追加する場合は、これを特定のディレクトリ名またはパスに置き換えることができます。
.\*
、svn rootが別のディレクトリにあるか、そうでなければなりませんstuff\svn_root\*
。
stuff\svn_root
サブディレクトリにファイルを追加しないようにパスを指定しています(例:)stuff\svn_root\already_in_svn\not_in_svn.txt
。したがって、最後の星。
これは私のために働きました:
svn add `svn status . | grep "^?" | awk '{print $2}'`
(出典)
Windowsの問題はすでに解決しているので、これはUNIXソリューションです(Samに続く)。タイトルにキーワード「WINDOWS」が含まれていないため、同じ質問をするこの質問に到達する人にはまだ役立つと思うので、ここに追加しました。
注(2015年2月):「bdrx」でコメントされているように、上記のコマンドは次のようにさらに簡略化できます。
svn add `svn status . | awk '/^[?]/{print $2}'`
awk '/^[?]/{print $2}'
; 追加のgrepプロセスは必要ありません。
このメソッドは、スペースの任意の数/組み合わせを含むファイル名を処理する必要があります...
svn status /home/websites/website1 | grep -Z "^?" | sed s/^?// | sed s/[[:space:]]*// | xargs -i svn add \"{}\"
このコマンドの機能の説明は次のとおりです。
xargsに-i引数を使用して、スペースのあるファイル名を 'svn add'にインポートできるようにします-基本的に、-iは{}をプレースホルダーとして使用するように設定し、 'svnが使用するファイル名の周囲に「追加'。
この方法の利点は、スペースを含むファイル名を処理できることです。
TortoiseSVNには、コマンドライン以外のソリューションを使用したい場合に備えて、この機能が組み込まれています。最上位のフォルダーを右クリックして、[ 追加 ... ]を選択します。
これはsvn bookに記載されているとおりで、最も簡単で私にとっては完璧に機能します
svn add * --force
私は常に使用します:
コピーペースト
svn st | grep "^\?" | awk "{print \$2}" | xargs svn add $1
この投稿にはWindowsのタグが付いているので、Windowsの解決策を考え出そうと思いました。プロセスを自動化したかったので、batファイルを作成しました。C#でconsole.exeを作成することに抵抗しました。
コミットプロセスを開始するときに、リポジトリに追加されていないファイルまたはフォルダーを追加したいと思いました。
多くの回答の問題は、バージョン管理されていないファイルがリストされ、TortoiseSVNの無視リストに従って無視する必要があることです。
これが私のフック設定とそれを行うバッチファイルです
亀フックスクリプト:
"start_commit_hook".
(where I checkout) working copy path = C:\Projects
command line: C:\windows\system32\cmd.exe /c C:\Tools\SVN\svnadd.bat
(X) Wait for the script to finish
(X) (Optional) Hide script while running
(X) Always execute the script
svnadd.bat
@echo off
rem Iterates each line result from the command which lists files/folders
rem not added to source control while respecting the ignore list.
FOR /F "delims==" %%G IN ('svn status ^| findstr "^?"') DO call :DoSVNAdd "%%G"
goto end
:DoSVNAdd
set addPath=%1
rem Remove line prefix formatting from svn status command output as well as
rem quotes from the G call (as required for long folder names). Then
rem place quotes back around the path for the SVN add call.
set addPath="%addPath:~9,-1%"
svn add %addPath%
:end
for /f "usebackq tokens=2*" %%i in (`svn status ^| findstr /r "^\?"`) do svn add "%%i %%j"
この実装では、以下のようにフォルダー/ファイル名に複数のスペースがある場合に問題が発生します。
"C:\PROJECTS\BACKUP_MGs_via_SVN\TEST-MG-10\data\destinations\Sega Mega 2"
"C:\PROJECTS\BACKUP_MGs_via_SVN\TEST-MG-10\data\destinations\One space"
"C:\PROJECTS\BACKUP_MGs_via_SVN\TEST-MG-10\data\destinations\Double space"
"C:\PROJECTS\BACKUP_MGs_via_SVN\TEST-MG-10\data\destinations\Single"
そのようなケースは単純なものでカバーされます:
for /f "usebackq tokens=1*" %%i in (`svn status ^| findstr /r "^\?"`) do svn add "%%j"
Linuxを使用するか、WindowsでCygwinまたはMinGWを使用する場合は、次のようなbashのようなソリューションを使用できます。ここで紹介する他の類似のものとは対照的に、これはファイル名空間を考慮に入れています。
svn status| grep ^? | while read line ; do svn add "`echo $line|cut --complement -c 1,2`" ;done
一部のファイルのみを再帰的に追加する方法を理解するためにしばらく時間を費やした後、私は何がうまくいったかを共有することが有効だと思いました:
FOR /F %F IN ('dir /s /b /a:d') DO svn add --depth=empty "%F"
FOR /F %F IN ('dir /s /b /a *.cs *.csproj *.rpt *.xsd *.resx *.ico *.sql') DO svn add "%F"
ここにいくつかの説明があります。
最初のコマンドは、すべてのディレクトリを追加します。2番目のコマンドは、指定されたパターンに従ってファイルのみを追加します。
詳細を教えてください:
2番目のコマンドでは、唯一の違いはdirコマンドとsvnコマンドですが、十分に明確です。
コマンドを使用できます
svn add * force--
または
svn add <directory/file name>
再帰的な追加がデフォルトのプロパティです。SVNブックでご覧いただけます。
問題は、無視リストまたはグローバルプロパティにある可能性があります。
私は解決策のGoogle Issue Trackerを得ました
TortoiseSVN > Properties
ます。svn:global-ignores with a value of *
star(*)
場合、再帰的な追加は無視されます。したがって、このプロパティを削除します。TortoiseSVN > Settings > General
ます。star(*)
、このプロパティを削除します。この男も説明しました、このプロパティが私のプロジェクトに追加された理由ました。
そこに到達する最も似た方法は、誰かが拡張子のないファイルを右クリックし、TortoiseSVN-> SVN無視-> *(再帰的に)を選択して、これをコミットしたことです。
ログをチェックして、そのプロパティの変更を誰がコミットしたかを確認し、実際に何をしようとしていたのかを確認し、今後さらに注意するように依頼できます。:)
私は私と同じようなことをしたと思います:
svn add . --recursive
しかし、私の記憶が正しいかどうかはわかりません;-p