バージョン管理されていないすべてのファイルをSVNに「svn add」するにはどうすればよいですか?


177

私は、作業コピー内のバージョン管理されていないすべてのファイルをSVNリポジトリに自動的に「svn add」するための良い方法を探しています。

ソース管理下にある必要があるいくつかのファイルを作成できるライブサーバーがあります。一度に1つずつ追加するのではなく、これらを自動的に追加するために実行できる短いスクリプトが欲しいのですが。

私のサーバーはWindows Server 2003を実行しているため、Unixソリューションは機能しません。


1
@Saulこの質問は、リンクした質問よりも先に行われるため、重複する可能性があることはわかりません。どちらかと言えば、他の質問は重複です。
ニュートリノ

Cygwinはオプションです。あらゆるWindows環境でbashの機能を利用できます。非常に軽微な問題を抱えて、10年以上ユーザーでした。
user151841 2014

回答:


346

svn add --force * --auto-props --parents --depth infinity -q

すばらしいヒントです。1つの注意:私のEclipseは新しいファイルを無視リストに自動的に追加します。設定の問題かもしれませんが、とにかく--no-ignore役立つオプションがあります。

この後、コミットできます:

svn commit -m 'Adding a file'

14
素晴らしいヒント。svn statusを使用するよりもはるかに優れています。「svn add --force」で十分のようです。
名前

1
これを短いマクロに設定する簡単な方法はありますか(つまり、gitでできるように)?また、各ビットを説明するようにこの回答を更新することは可能ですか?
MrDuk 2014

2
@MrDuk:短縮:alias magic="svn add --force * --auto-props --parents --depth infinity -q"-説明:svn help add
Ronan

17
問題はこれが無視されたファイルを追加することですか?望ましくない。
ladieu 14年

1
@Name- *最後に置く必要があります。そうしないと機能しません(
少なくとも

72

これは私の質問とは異なりますが、この質問に属する答えがあります:

svn status | grep '?' | sed 's/^.* /svn add /' | bash

8
これは、OPが持っていないと言っていたUNIXツール(grep、sed、bash)を使用しています。
Naaff、2009

3
また、本当に望めば、ウィンドウでsedとgrepを掘り下げることもできます。
サムサフラン

1
cygwinコメントへの賛成投票には申し訳ありませんが、意図的なものではありませんでした(そして、元に戻すことはできません)。実際、cygwinは、Windowsで使用できるのと同じくらい醜いと思います。grepの代わりにfindstrを使用することもできます。これは、Windows 2000以降、何も追加しなくても機能します。
ジョーイ、

ちょうどあなたのための@Johannes meta.stackexchange.com/questions/1775/...
サムサフラン

2
私はmbyrne215と一緒です。この答えはOPの解決策よりも私を助けてくれたので、投票します。OS X 10.6.7で完全に動作します。
アスビョルンUlsberg

37

これが機能するのは次のとおりです。

c:\work\repo1>svn add . --force

サブディレクトリの内容を追加します。

無視されたファイルを追加しません。

追加されたファイルをリストします。

コマンドのドットは現在のディレクトリを示します。現在のディレクトリとは異なるディレクトリを追加する場合は、これを特定のディレクトリ名またはパスに置き換えることができます。


実際には.\*、svn rootが別のディレクトリにあるか、そうでなければなりませんstuff\svn_root\*
Nux 2014

私はついていません。SVNへのコマンドは、それらが実行されるパスのコンテキストで実行されますが、これは予想されることです。「svn add。\ *」だけでは再帰せず、大量の警告スパムを出力して、実際に何が追加されたかを確認できないようにします。「svn add。\ * --force」は再帰しますが、「svn:Skipping argument:E200025: '。\。svn' ends in a reserved name」も出力します。したがって、それは私の元の解決策よりも悪いようです。
ニュートリノ

私はあなたがおそらくSVNにCドライブ全体を持っていないことを指摘していました;-)したがって、パスを追加する必要があります。そして、私のテストから、stuff\svn_rootサブディレクトリにファイルを追加しないようにパスを指定しています(例:)stuff\svn_root\already_in_svn\not_in_svn.txt。したがって、最後の星。
Nux 2014

@Nuxこれらの年のすべての後にようやく、ようやく私はあなたが何を取得していたのかを最終的に確認できます:)コマンドでは、ドットは現在のディレクトリを指定するパスです。当然、代わりに有効な代替を提供できます。
ニュートリノ2017年

これが正解です。無視されたファイルの追加を含むソリューションがどのようにしてトップスポットを獲得するかはわかりません。@Neutrino、このページに表示されなくなったjoeyへのコメントを削除することを提案し、提案が無視されたファイルを追加しないように線を追加します
b_levitt

35

これは私のために働きました:

svn add `svn status . | grep "^?" | awk '{print $2}'`

出典

Windowsの問題はすでに解決しているので、これはUNIXソリューションです(Samに続く)。タイトルにキーワード「WINDOWS」が含まれていないため、同じ質問をするこの質問に到達する人にはまだ役立つと思うので、ここに追加しました。

(2015年2月):「bdrx」でコメントされているように、上記のコマンドは次のようにさらに簡略化できます。

 svn add `svn status . | awk '/^[?]/{print $2}'`

1
素敵で、コンパクトで、簡潔で、拡張にも非常に適しています。ありがとう。
ノーマンH

1
すごい。また、拡張、変更、削除なども簡単
Drewid '18

私が必要なものに最適です。ありがとうございました!
Jeff

2
なぜ人々はいつもgrepしてからawkにパイプするのですか?awkはパターンマッチングを行うことができます:awk '/^[?]/{print $2}'; 追加のgrepプロセスは必要ありません。
bdrx 2015

1
@bdrx:おそらくgrepは一般的にパターンマッチングに関連付けられているためでしょうか?私の個人的なケースでは、私はawkよりもgrepの方がはるかに経験が豊富です。このようなことをawkで実行できることは知りませんでした。そのため、スクリプトでawkをさらに使い始めます。ありがとう!
lepe 2015

5
svn add --force .

これにより、バージョン管理されていないファイルが現在のディレクトリとすべてのバージョン管理された子ディレクトリに追加されます。


5

このメソッドは、スペースの任意の数/組み合わせを含むファイル名を処理する必要があります...

svn status /home/websites/website1 | grep -Z "^?" | sed s/^?// | sed s/[[:space:]]*// | xargs -i svn add \"{}\"

このコマンドの機能の説明は次のとおりです。

  • 変更されたすべてのファイルをリストします。
  • このリストを「?」を含む行に制限します 最初に-つまり、新しいファイル。
  • 「?」を削除します 行の先頭の文字。
  • 行頭のスペースを削除します。
  • ファイル名をxargsにパイプして、svn addを複数回実行します。

xargsに-i引数を使用して、スペースのあるファイル名を 'svn add'にインポートできるようにします-基本的に、-iは{}をプレースホルダーとして使用するように設定し、 'svnが使用するファイル名の周囲に「追加'。

この方法の利点は、スペースを含むファイル名を処理できることです。


これはLinuxまたは同様のもの(MinGWCygwinなど)を想定しています。OPは次のよ​​うに述べています。「私のサーバーはWindows Server 2003を実行しているため、Unixソリューションは機能しません。」
Peter Mortensen、

4

TortoiseSVNには、コマンドライン以外のソリューションを使用したい場合に備えて、この機能が組み込まれています。最上位のフォルダーを右クリックして、[ 追加 ... ]を選択します。


巨大なリポジトリがあるとTortoiseSVNがハングします。これにより、代替のコマンドラインを探しました:-)
Upendra


3

使用する:

svn st | grep ? | cut -d? -f2 | xargs svn add

1
それとも、グレップの仕事をするために、カットを使用することができます: svn status | cut -d ? -f 2 -s | xargs svn add
Eric3

これはLinuxまたは同様のもの(MinGWCygwinなど)を想定しています。OPは次のよ​​うに述べています。「私のサーバーはWindows Server 2003を実行しているため、Unixソリューションは機能しません。」
Peter Mortensen、

3

私は常に使用します:

コピーペースト

svn st | grep "^\?" | awk "{print \$2}" | xargs svn add $1

1
Opは、Unixソリューションは彼には役に立たないと明示しています。
ニュートリノ2012

これはLinuxまたは同様のもの(MinGWCygwinなど)を想定しています。OPは次のよ​​うに述べています。「私のサーバーはWindows Server 2003を実行しているため、Unixソリューションは機能しません。」
Peter Mortensen、

3

この投稿には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

2
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"

2

Linuxを使用するか、WindowsでCygwinまたはMinGWを使用する場合は、次のようなbashのようなソリューションを使用できます。ここで紹介する他の類似のものとは対照的に、これはファイル名空間を考慮に入れています。

svn status| grep ^? | while read line ; do  svn add "`echo $line|cut --complement -c 1,2`" ;done

これは何のため?CMD?バッシュ?Bash(または同様のシェル)のように見えます。その場合は、Linuxまたは同様のもの(MinGWCygwinなど)を想定しています。OPは次のよ​​うに述べています。「私のサーバーはWindows Server 2003を実行しているため、Unixソリューションは機能しません。」
Peter Mortensen

ありがとう、私がWindowsにいるときは、BashでCygwinを使用しています。ただし、「私のサーバーはWindows Server 2003を実行しているため、Unixソリューションは機能しません。」は偽です。たぶん彼はCygwinやMinGWを使いたくないかもしれませんが、彼はそのように表現していませんでした。私は応答を再定式化しました。
ajaest 16

1

一部のファイルのみを再帰的に追加する方法を理解するためにしばらく時間を費やした後、私は何がうまくいったかを共有することが有効だと思いました:

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番目のコマンドは、指定されたパターンに従ってファイルのみを追加します。

詳細を教えてください:

  • FOR:ご存知のとおり、ループ制御。
  • / F:ファイルとディレクトリを取得することを意味します(正確にはわかりません)。
  • %F:その変数。リストされた各ファイルの値を一度に想定します。別の1文字の名前を付けることができます。
  • IN:説明する必要はありませんよね?
  • ( 'dir / s / b / a:d'):ディレクトリを一覧表示するDOSコマンド。私の場合、/ sは再帰的で、/ bは完全なパスのみを使用し、/ a:dはディレクトリのみを意味します。括弧とアポストロフィを保持したい場合は、変更してください。
  • DO:コマンドの次に来るのは、各ディレクトリに対して実行されることです
  • svn add --depth = empty:実行するSVNコマンドが必要です。深さの定義は、ディレクトリのみを追加し、その中のファイルは追加しないことを意味します。
  • "%F":これは、前に定義した変数を使用する方法です。

2番目のコマンドでは、唯一の違いはdirコマンドとsvnコマンドですが、十分に明確です。


0

コマンドを使用できます

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無視-> *(再帰的に)を選択して、これをコミットしたことです。

ログをチェックして、そのプロパティの変更を誰がコミットしたかを確認し、実際に何をしようとしていたのかを確認し、今後さらに注意するように依頼できます。:)


0

Linuxでは次のコマンドを入力できます。

find ./ -name "*." | xargs svn add

0

彼がawkとsedが標準ではないWindowsを指定したので、

for /f "tokens=1*" %e in ('svn status^|findstr "^\?"') do svn add "%f"

またはバッチファイルで:

for /f "tokens=1*" %%e in ('svn status^|findstr "^\?"') do svn add "%%f"

0

これは、新しいファイルを含むディレクトリをSVNと同期するための遅延して危険な方法です。

svn rm --keep-local dir
svn add dir

これはピンチで機能しますが、深刻な結果をもたらす可能性もあります。たとえば、SVNはファイルの履歴を見失うことがよくあります。

ディレクトリを同期する理想的な方法は、差分を作成してからsvnパッチを使用できるようにすることですが、これはdiffコマンドの形式とは異なり、svn diffコマンドはファイルシステムレベルの違いではなく作業ディレクトリの違いを比較します。


-1

私は私と同じようなことをしたと思います:

svn add . --recursive

しかし、私の記憶が正しいかどうかはわかりません;-p


2
メモリの更新のみ:svn 1.4および1.5はsvn add :)のパラメータとして--recursiveをサポートしていません
Ludwig Wensauer
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.