如何'svn添加'所有未版本控制的文件到SVN?
我正在寻找一种很好的方法来自动'svn添加'工作副本中的所有未版本化的文件到我的SVN存储库。
我有一个活的服务器,可以创build一些应该在源代码pipe理下的文件。 我想有一个简短的脚本,我可以运行自动添加这些,而不是通过一次添加一个。
我的服务器正在运行Windows Server 2003,所以Unix解决scheme将无法工作。
svn add --force * --auto-props --parents --depth infinity -q
伟大的提示! 一个评论:我的Eclipse自动添加新的文件到忽略列表。 这可能是一个configuration的问题,但无论如何:有没有--no-ignore
选项,帮助。
在此之后,您可以提交:
svn commit -m 'Adding a file'
这是我的一个不同的问题,但有一个答案属于这个问题:
svn status | grep '?' | sed 's/^.* /svn add /' | bash
这有什么作用:
c:\>svn add . --force
recursion运行并打印添加的内容。
(@Joey,这个解决scheme在Windows下不适用,首先它不会recursion,其次它会发出如此多的关于垃圾邮件的警告,这些垃圾邮件包含保留名称,忽略文件,已经在版本控制下的文件和其他文件进程,这是毫无意义的,因为在命令结束时,你不能说什么(如果有的话)实际上被添加。)
这对我工作:
svn add `svn status . | grep "^?" | awk '{print $2}'`
( 来源 )
由于您已经解决了Windows的问题,因此这是一个UNIX解决scheme(遵循Sam)。 我在这里添加,因为我认为对于那些要求同样的事情的人来说仍然是有用的(因为标题不包括关键字“WINDOWS”)。
注 (2015年2月):如“bdrx”所述,上述命令可以进一步简化:
svn add `svn status . | awk '/^[?]/{print $2}'`
这种方法应该处理文件名中有任何数量/组合的空间…
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加'。
这种方法的一个优点是,这应该处理文件名中包含空格。
如果您愿意使用非命令行解决scheme,则TortoiseSVN内置此function。 只需右键单击顶层文件夹,然后select添加 …
svn add --force .
这将在当前目录和所有版本化的子目录中添加任何未版本控制的文件。
使用:
svn st | grep ? | cut -d? -f2 | xargs svn add
由于这篇文章被标记为Windows,我想我会为Windows制定一个解决scheme。 我想让这个过程自动化,我做了一个bat文件。 我反对在C#中制作console.exe。
我想添加任何文件或文件夹,当我开始提交过程时,这些文件或文件夹没有添加到我的存储库中。
许多答案的问题是,他们将列出未受版本控制的文件,应根据我在TortoiseSVN中的忽略列表忽略。
这是我的钩子设置和batch file
龟钩脚本:
"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
我总是使用:
复制粘贴
svn st | grep "^\?" | awk "{print \$2}" | xargs svn add $1
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的解决scheme。 与此处介绍的其他类似文件相比,本文考虑了文件名称空间:
svn status| grep ^? | while read line ; do svn add "`echo $line|cut --complement -c 1,2`" ;done
花了一些时间试图找出如何recursion只添加一些文件,我认为这是有效的,分享什么对我有用:
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"
这里有一些解释。
第一个命令添加所有的目录。 第二个命令仅将文件相应地添加到指定的模式。
让我来提供更多的细节:
- 对于:你知道,循环控制。
- / F:表示取文件和目录(不确定)。
- %F:它的一个variables; 它将一次假定列出的每个文件的值; 它可以有另外一个字符的名字。
- IN:不需要解释,对吧?
- ('dir / s / b / a:d'):将列出目录的DOS命令; 在我的情况下,/ s是recursion的,/ b是只取完整path,/ a:d只表示目录; 如果希望保留圆括号和撇号,请更改它。
- DO:意味着命令的下一个是每个目录将执行的内容
- svn add –depth = empty:这是所要运行的SVN命令行; 深度定义意味着只添加目录而不添加文件。
- “%F”:这就是你如何使用前面定义的variables。
在第二个命令中,唯一的区别是dir命令和svn命令,我认为这是很清楚的。
我想我已经做了类似的事情:
svn add . --recursive
但不知道我的记忆是否正确; – p