我正在寻找一种好的方法,可以自动将工作副本中所有未版本控制的文件“svn add”到我的 SVN 仓库中。
我有一个在线服务器,可能会创建一些应该受源代码控制的文件。我想编写一个简短的脚本来自动添加这些文件,而不是一个个手动添加。
我的服务器运行 Windows Server 2003,因此 Unix 解决方案无法使用。
我正在寻找一种好的方法,可以自动将工作副本中所有未版本控制的文件“svn add”到我的 SVN 仓库中。
我有一个在线服务器,可能会创建一些应该受源代码控制的文件。我想编写一个简短的脚本来自动添加这些文件,而不是一个个手动添加。
我的服务器运行 Windows Server 2003,因此 Unix 解决方案无法使用。
svn add --force * --auto-props --parents --depth infinity -q
非常好的提示!一个注意事项:我的Eclipse会自动将新文件添加到忽略列表中。这可能与配置有关,但无论如何:这里有一个--no-ignore
选项可以帮助解决问题。
完成后,您可以提交:
svn commit -m 'Adding a file'
alias magic="svn add --force * --auto-props --parents --depth infinity -q"
- 解释:svn help add
- Ronan*
,否则它不会起作用(至少对我来说是这样)。 - vsync这是一个与我的问题不同的问题,但那里有一个答案适用于这个问题:
svn status | grep '?' | sed 's/^.* /svn add /' | bash
这样做是有效的:
c:\work\repo1>svn add . --force
添加子目录的内容。
不添加被忽略的文件。
列出添加的文件清单。
命令中的点表示当前目录,如果要添加不同于当前目录的目录,可以将其替换为特定的目录名称或路径。
.\*
或者如果 svn 根目录在不同的目录下,则为 stuff\svn_root\*
。 - Nuxstuff\svn_root
不会添加子目录中的文件(例如,在stuff\svn_root\already_in_svn\not_in_svn.txt
中)。因此,在末尾加上星号。 - Nux这对我起作用:
svn add `svn status . | grep "^?" | awk '{print $2}'`
(源)
既然您已经解决了Windows的问题,这是一个UNIX解决方案(遵循Sam的步骤)。我在此添加,因为我认为对于那些寻求相同答案的人来说仍然有用(因为标题不包含“WINDOWS”关键字)。
注意(2015年2月): 正如“bdrx”所评论的那样,上述命令可以进一步简化:
svn add `svn status . | awk '/^[?]/{print $2}'`
awk '/^[?]/{print $2}'
;不需要额外的grep进程。 - bdrx这种方法应该处理文件名中任意数量/组合的空格...
svn status /home/websites/website1 | grep -Z "^?" | sed s/^?// | sed s/[[:space:]]*// | xargs -i svn add \"{}\"
使用-i参数来处理能够导入带有空格的文件名到'svn add' - 基本上,-i设置{}作为占位符,这样我们就可以在'svn add'使用文件名周围放置"字符。
这种方法的优点是可以处理其中包含空格的文件名。
svn add --force .
由于这篇文章标记为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