web-dev-qa-db-ja.com

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

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

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

私のサーバーは Windows Server 20 を実行していますので、Unixソリューションは動作しません。

172
JerSchneid

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

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

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

svn commit -m 'Adding a file'
343
Ronan

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

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

これは何ですか:

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

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

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

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

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

36
Neutrino

これは私のために働いた:

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

ソース

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

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

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

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

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で使用されるファイル名の周りに "追加」。

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

5
bailey86

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

4
John Meagher

私はいつも使用します:

コピー&ペースト

svn st | grep "^\?" | awk "{print \$2}" | xargs svn add $1
3
Oritm
svn add --force .

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

3
jmc734

これはsvn bookに文書化されているとおりで、最も単純で、私に最適です

svn add * --force

http://svnbook.red-bean.com/en/1.6/svn.ref.svn.c.add.html

3
Serjik

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

つかいます:

svn st | grep ? | cut -d? -f2 | xargs svn add
3
Xiè Jìléi

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

svn status| grep ^? | while read line ; do  svn add "`echo $line|cut --complement -c 1,2`" ;done
2
ajaest
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
olexa

いくつかのファイルのみを再帰的に追加する方法を見つけようとして少し時間を費やした後、私がうまくいったことを共有することは有効だと思いました:

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コマンドです。十分に明確であると思います。

1
heringer

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

find ./ -name "*." | xargs svn add
0
liu zhijun

彼は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
WLH

コマンドを使用できます

svn add * force--

または

svn add <directory/file name>

ファイル/ディレクトリが再帰的に追加されていない場合。次にこれを確認してください。

再帰的な追加はデフォルトのプロパティですSVN book で見ることができます。

問題は無視リストまたはグローバルプロパティにある可能性があります。

私は解決策を得ました google issue tracker

Star(*)を無視するためのグローバルプロパティを確認する

  • ウィンドウでリポジトリを右クリックします。 TortoiseSVN > Propertiesを選択します。
  • プロパティsvn:global-ignores with a value of *がないかどうかを確認します
  • star(*)を持つプロパティがある場合、再帰的な追加は無視されます。したがって、このプロパティを削除します。

スターを無視するためのグローバル無視パターンをチェックする(*)

  • ウィンドウでリポジトリを右クリックします。 TortoiseSVN > Settings > Generalを選択します。
  • そこにstar(*)を設定していない場合は、グローバル無視パターンを参照してください。
  • star(*)が見つかった場合、このプロパティを削除します。

この男 説明もあります このプロパティがプロジェクトに追加された理由。

最もよく似た方法は、誰かが拡張子のないファイルを右クリックし、TortoiseSVN-> SVN Ignore-> *(再帰的に)を選択し、それをコミットしたことです。

ログをチェックして、そのプロパティの変更をコミットしたユーザーを確認し、実際に何をしようとしていたかを調べ、今後はもっと注意するように依頼できます。 :)

0
Khemraj