我正在寻找一种好的方法,可以自动将工作副本中所有未版本控制的文件“svn add”到我的 SVN 仓库中。
我有一个在线服务器,可能会创建一些应该受源代码控制的文件。我想编写一个简短的脚本来自动添加这些文件,而不是一个个手动添加。
我的服务器运行 Windows Server 2003,因此 Unix 解决方案无法使用。
我正在寻找一种好的方法,可以自动将工作副本中所有未版本控制的文件“svn add”到我的 SVN 仓库中。
我有一个在线服务器,可能会创建一些应该受源代码控制的文件。我想编写一个简短的脚本来自动添加这些文件,而不是一个个手动添加。
我的服务器运行 Windows Server 2003,因此 Unix 解决方案无法使用。
svn add * --force
svn add * force--
svn add <directory/file name>
递归添加是默认属性。你可以在SVN书籍中看到。
问题可能出现在你的忽略列表或全局属性中。
我在Google问题跟踪器上找到了解决方案。
TortoiseSVN > 属性
。*
的svn:global-ignores
属性。星号(*)
的属性,它将忽略递归添加。因此,请删除此属性。TortoiseSVN > 设置 > 通用
。星号(*)
,请删除此属性。这位小伙子还解释了为什么要在我的项目中添加此属性。
最可能的方式是有人右键单击一个没有扩展名的文件,选择TortoiseSVN -> SVN忽略 -> *(递归),然后提交了这个更改。
你可以检查日志以查看谁提交了该属性更改,找出他们实际上想做什么,并要求他们将来更加小心。 :)
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"
如果您使用Linux或在Windows中使用Cygwin或MinGW,您可以使用以下类似于bash的解决方案。与这里介绍的其他类似解决方案相比,此解决方案考虑了文件名空间:
svn status| grep ^? | while read line ; do svn add "`echo $line|cut --complement -c 1,2`" ;done
在花费一些时间尝试递归添加仅部分文件后,我认为分享对我有效的方法是合理的:
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"
这里有一些解释。
第一个命令添加所有目录。第二个命令根据指定的模式只添加文件。
让我更详细地说明:
在第二个命令中,唯一的区别是dir命令和svn命令,我认为已经足够清楚了。
在Linux上,您可以输入以下命令:
find ./ -name "*." | xargs svn add
既然他指定了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"
这是一种懒惰且危险的方式,用于将目录与包括新文件在内的 SVN 同步:
svn rm --keep-local dir
svn add dir
我觉得我已经用类似的方法做过了:
svn add . --recursive
但不确定我的记忆是否正确;-p