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

183

我正在寻找一种好的方法,可以自动将工作副本中所有未版本控制的文件“svn add”到我的 SVN 仓库中。

我有一个在线服务器,可能会创建一些应该受源代码控制的文件。我想编写一个简短的脚本来自动添加这些文件,而不是一个个手动添加。

我的服务器运行 Windows Server 2003,因此 Unix 解决方案无法使用。


1
@Saul,这个问题显然早于你链接的那个问题,所以我不明白它怎么可能是重复的。如果有什么重复的话,那另一个问题才是重复的。 - Neutrino
Cygwin是一个选择。它可以让你在任何Windows环境下拥有bash的强大功能。我已经使用了10多年,几乎没有遇到什么问题。 - user151841
19个回答

354

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

非常好的提示!一个注意事项:我的Eclipse会自动将新文件添加到忽略列表中。这可能与配置有关,但无论如何:这里有一个--no-ignore选项可以帮助解决问题。

完成后,您可以提交:

svn commit -m 'Adding a file'

14
好的提示。比使用svn status要好得多。 "svn add --force" 看起来就足够了。 - Name
1
有没有一种简单的方法来设置这个缩短的宏(例如,像git一样)?此外,是否可能更新此答案以解释每个位? - MrDuk
2
@MrDuk:缩写:alias magic="svn add --force * --auto-props --parents --depth infinity -q" - 解释:svn help add - Ronan
18
问题是这将添加被忽略的文件,这是不可取的。 - ladieu
2
@Name - 你需要在末尾加上 *,否则它不会起作用(至少对我来说是这样)。 - vsync
显示剩余6条评论

72

这是一个与我的问题不同的问题,但那里有一个答案适用于这个问题:

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

8
这里使用了UNIX工具(grep、sed、bash),而提问者表示他没有这些工具。 - Naaff
3
如果你真的想要的话,你可能可以在Windows上找到sed和grep。 - Sam Saffron
1
抱歉在cygwin评论中点赞,那不是故意的(而且我无法撤销它)。事实上,我认为cygwin在Windows上是最丑陋的。你仍然可以使用findstr代替grep,在Windows 2000及以上版本中工作,无需安装任何其他软件。 - Joey
2
我支持mbyrne215;这个答案对我比原帖的解决方案更有帮助,所以我会点赞。在OS X 10.6.7中完美运行。 - Asbjørn Ulsberg
与被接受的答案不同,这个解决方案尊重 SVN 忽略。 - Stephen Swensen
显示剩余5条评论

42

这样做是有效的:

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

添加子目录的内容。

不添加被忽略的文件。

列出添加的文件清单。

命令中的点表示当前目录,如果要添加不同于当前目录的目录,可以将其替换为特定的目录名称或路径。


实际上应该是 .\* 或者如果 svn 根目录在不同的目录下,则为 stuff\svn_root\* - Nux
我不明白。在SVN中执行的命令是在执行它们的路径上下文中执行的,这是可以预料的。 "svn add .\" 单独使用不会递归,并打印大量警告信息,使得无法看到实际添加了什么。 "svn add .\ --force" 会递归,但也会打印 "svn: Skipping argument: E200025: '..svn' ends in a reserved name"。所以这似乎比我的原始解决方案更糟糕。 - Neutrino
我想指出的是,你可能没有整个C盘在SVN上;-),所以你应该添加一个路径。从我的测试来看,将路径指定为stuff\svn_root不会添加子目录中的文件(例如,在stuff\svn_root\already_in_svn\not_in_svn.txt中)。因此,在末尾加上星号。 - Nux
1
@Nux,直到这些年过去了,我才终于明白你当时的意思 :) 在该命令中,“.”代表指定当前目录的路径。当然,也可以提供任何有效的替代方案。 - Neutrino
1
这是正确的答案。我不确定包括添加被忽略的文件的解决方案为什么排名第一。@Neutrino,建议删除您在此页面上不再显示的评论,并添加一行强调您的建议不会添加被忽略的文件。 - 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
不错,紧凑简洁,而且很容易扩展。谢谢。 - Norman H
1
很好。而且容易扩展、修改或删除等。 - Drewid
2
为什么人们总是使用grep然后再管道到awk呢?Awk可以进行模式匹配:awk '/^[?]/{print $2}';不需要额外的grep进程。 - bdrx
1
@bdrx:也许是因为grep通常与模式匹配相关联?在我个人的情况下,我比awk更有经验。我不知道你可以在awk中做这样的事情,所以我会在我的脚本中开始更多地使用awk。谢谢! - lepe
第一个变量似乎在文件名中带有空格时出现了问题,没有检查第二个变量。 - siliconpi
如果目录或文件名中有空格,两种变体都会出错。 - tholu

5

这种方法应该处理文件名中任意数量/组合的空格...

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

以下是该命令的解释:
  • 列出所有已更改的文件。
  • 将此列表限制为以“?”开头的行 - 即新文件。
  • 删除行首的“?”字符。
  • 删除行首的空格。
  • 将文件名传递到xargs中,以多次运行svn add。

使用-i参数来处理能够导入带有空格的文件名到'svn add' - 基本上,-i设置{}作为占位符,这样我们就可以在'svn add'使用文件名周围放置"字符。

这种方法的优点是可以处理其中包含空格的文件名。


这假定您使用的是Linux或类似系统(例如MinGWCygwin)。原帖中提到:“我的服务器运行的是Windows Server 2003,因此Unix解决方案行不通。” - Peter Mortensen

5
svn add --force .

这将添加当前目录中未版本化的文件和所有已版本化子目录。

4
如果你不想使用命令行,TortoiseSVN 已经内置了这个功能。只需右键单击顶级文件夹,然后选择 添加

由于巨大的代码库,TortoiseSVN 经常会卡住。这促使我寻找命令行替代方案 :-) - Upendra

3

使用:

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

1
或者你可以使用cut来完成grep的工作:svn status | cut -d ? -f 2 -s | xargs svn add - Eric3
这假定您使用的是Linux或类似系统(例如MinGWCygwin)。原帖中提到:“我的服务器运行的是Windows Server 2003,因此Unix解决方案行不通。” - Peter Mortensen

3
我通常使用:
复制并粘贴
svn st | grep "^\?" | awk "{print \$2}" | xargs svn add $1

1
Op明确表示Unix解决方案对他没有用处。 - Neutrino
这假设使用Linux或类似系统(例如MinGWCygwin)。楼主表示:“我的服务器运行的是Windows Server 2003,所以Unix解决方案行不通。” - Peter Mortensen

3

由于这篇文章标记为Windows,我想为Windows找到一个解决方案。我想自动化这个过程,所以我创建了一个批处理文件。我抵制使用C#创建console.exe。

当我开始提交过程时,我希望添加任何未添加到我的存储库中的文件或文件夹。

许多答案的问题在于它们会列出未版本控制的文件,而这些文件应根据我的TortoiseSVN中的忽略列表被忽略。

这是我的钩子设置和批处理文件

Tortoise钩子脚本:

"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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接