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

183

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

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

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


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

3

2
您可以使用命令行。
svn add * force--

或者
svn add <directory/file name>

如果你的文件/目录没有递归添加,请检查以下内容。

递归添加是默认属性。你可以在SVN书籍中看到。

问题可能出现在你的忽略列表或全局属性中。

我在Google问题跟踪器上找到了解决方案。

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

  • 右键单击窗口中的存储库。选择TortoiseSVN > 属性
  • 查看是否有一个属性值为*svn:global-ignores属性。
  • 如果你有一个带有星号(*)的属性,它将忽略递归添加。因此,请删除此属性。

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

  • 右键单击窗口中的存储库。选择TortoiseSVN > 设置 > 通用
  • 查看全局忽略模式中是否设置了星号(*)
  • 如果你发现了星号(*),请删除此属性。

这位小伙子还解释了为什么要在我的项目中添加此属性。

最可能的方式是有人右键单击一个没有扩展名的文件,选择TortoiseSVN -> SVN忽略 -> *(递归),然后提交了这个更改。

你可以检查日志以查看谁提交了该属性更改,找出他们实际上想做什么,并要求他们将来更加小心。 :)


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?看起来像是Bash(或类似的shell)。如果是这样,它假定Linux或类似系统(例如MinGWCygwin)。OP说:“我的服务器运行的是Windows Server 2003,所以Unix解决方案行不通。” - Peter Mortensen
谢谢,你说得对。当我在Windows系统中时,我使用带有Bash的Cygwin。然而,“我的服务器正在运行Windows Server 2003,所以Unix解决方案行不通”这个说法是错误的。也许他不想使用Cygwin或MinGW,但他没有用那种方式表达自己。我重新表述了回答。 - ajaest

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命令,我认为已经足够清楚了。


0

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

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

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"

0

这是一种懒惰且危险的方式,用于将目录与包括新文件在内的 SVN 同步:

svn rm --keep-local dir
svn add dir

尽管这种方法可以在紧急情况下工作,但也可能会产生严重后果。例如,SVN经常会丢失文件的历史记录。
同步目录的理想方式是能够进行差异比较,然后使用svn patch,但是这与diff命令中的格式不同,而且svn diff命令将比较工作目录差异而不是文件系统级别上的差异。

-1

我觉得我已经用类似的方法做过了:

svn add . --recursive

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


2
只是提醒一下,svn 1.4和1.5不支持--recursive作为svn add的参数 :) - Ludwig Wensauer

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