如何将所有未版本控制的文件添加到SVN?

时间:2009-07-01 23:46:00

标签: svn command-line windows-server-2003

我正在寻找一种好方法,可以自动将工作副本中的所有未版本控制文件添加到我的SVN存储库中。

我有一个可以创建一些应该在源代码管理下的文件的实时服务器。我想有一个简短的脚本,我可以自动添加这些脚本,而不是一次一个地添加它们。

我的服务器正在运行Windows Server 2003,因此Unix解决方案无效。

19 个答案:

答案 0 :(得分:343)

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

很棒的提示!一句话:我的Eclipse会自动将新文件添加到忽略列表中。这可能是配置问题,但无论如何:有--no-ignore选项可以帮助。

在此之后,您可以提交:

svn commit -m 'Adding a file'

答案 1 :(得分:67)

这是一个不同的question to mine,但有一个答案属于这个问题:

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

答案 2 :(得分:36)

这有什么作用:

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

添加子目录的内容。

不添加被忽略的文件。

列出添加了哪些文件。

命令中的点表示当前目录,如果要添加与当前目录不同的目录,则可以用特定目录名或路径替换。

答案 3 :(得分:31)

这对我有用:

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

Source

由于您已经解决了Windows的问题,因此这是一个UNIX解决方案(遵循Sam)。我在这里添加,因为我认为对于那些提出同样问题的人来说仍然有用(因为标题不包含关键字“WINDOWS”)。

注意(2015年2月): 如“bdrx”所述,上述命令可以通过这种方式进一步简化:

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

答案 4 :(得分: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 sets {}用作占位符,这样我们就可以将“字符串放在文件名周围通过'svn add'。

这种方法的一个优点是它应该处理带有空格的文件名。

答案 5 :(得分:4)

如果您愿意使用非命令行解决方案,则

TortoiseSVN内置此功能。只需右键单击顶级文件夹,然后选择添加 ...

答案 6 :(得分:3)

使用:

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

答案 7 :(得分:3)

我总是使用:

复制和粘贴

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

答案 8 :(得分:3)

svn add --force .

这将在当前目录和所有版本化子目录中添加任何未版本控制的文件。

答案 9 :(得分:3)

这是svn书中记载的,最简单,最适合我的作品

svn add * --force

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

答案 10 :(得分:3)

由于这篇文章被标记为Windows,我想我会为Windows制定一个解决方案。我想自动化这个过程,我制作了一个bat文件。我拒绝在C#中制作一个console.exe。

我想在开始提交过程时添加未在我的存储库中添加的任何文件或文件夹。

许多答案存在的问题是,他们会列出无法修改的文件,根据TortoiseSVN中的忽略列表,应忽略这些文件。

这是我的钩子设置和批处理文件,它可以做到这一点

Tortoise Hook脚本:

"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

答案 11 :(得分: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"

答案 12 :(得分:2)

如果您在Windows中使用Linux或使用Cygwin或MinGW,您可以使用类似bash的解决方案,如下所示。与此处介绍的其他类似对比,这个考虑了文件名空间:

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

答案 13 :(得分: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"

这里有一些解释。

第一个命令添加所有目录。第二个命令仅根据指定的模式添加文件。

让我提供更多细节:

  • FOR:你知道,循环控制。
  • / F:表示获取文件和目录(不确定)。
  • %F:它是一个变量;它将一次承担每个列出文件的价值;它可以有另一个单字符名称。
  • IN:无需解释,对吗?
  • ('dir / s / b / a:d'):将列出目录的DOS命令;在我的情况下/ s是递归的,/ b是仅采取完整路径,/ a:d仅表示目录;如你所希望保留括号和撇号那样改变它。
  • DO:表示命令中的下一步是为每个目录执行的内容
  • svn add --depth = empty:这是要运行的所需SVN命令;深度定义意味着只添加目录而不是其中的文件。
  • “%F”:这就是你如何使用前面定义的变量。

在第二个命令中,唯一的区别是dir命令和svn命令,我认为很清楚。

答案 14 :(得分:0)

这是将目录与包括新文件的SVN同步的一种惰性和危险的方式:

svn rm --keep-local dir
svn add dir

尽管这可能会在紧急情况下起作用,但也会产生严重的后果。例如,SVN经常会丢失文件的历史记录。

同步目录的理想方法是能够进行差异处理然后使用svn补丁,但是这与diff命令中的格式有所不同,并且svn diff命令将比较工作目录的差异而不是文件系统级别的差异。

答案 15 :(得分:0)

自从他指定Windows以来,awk和sed都不是标准的:

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"

答案 16 :(得分:0)

您可以在Linux上输入以下命令:

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

答案 17 :(得分:0)

您可以使用命令

svn add * force--

svn add <directory/file name>

如果您的文件/目录不是递归添加的。然后检查一下。

递归添加是默认属性。您可以在SVN book中看到。

问题可以在您的忽略列表或全局属性中。

我有解决方法google issue tracker

检查全局属性以忽略星号(*)

  • 右键单击您的回购窗口。选择TortoiseSVN > Properties
  • 查看您是否没有财产svn:global-ignores with a value of *
  • 如果您拥有star(*)的属性,则它将忽略递归添加。因此,请删除此属性。

检查全局忽略模式以忽略星号(*)

  • 右键单击您的回购窗口。选择TortoiseSVN > Settings > General
  • 如果未在其中设置 star(*),请在“全局忽略模式”中查看。
  • 如果找到star(*),请删除此属性。

这个人also explained为什么将此属性添加到我的项目中。

最类似的实现方式是,有人右键单击没有任何扩展名的文件,然后选择TortoiseSVN-> SVN Ignore-> *(递归),然后提交该文件。

  

您可以检查日志以查看谁进行了该属性更改,找到   弄清楚他们实际上想做什么,并要求他们做更多   以后要小心。 :)

答案 18 :(得分:-1)

我想我做过类似的事情:

svn add . --recursive

但不确定我的记忆是否正确;-p