我正在寻找一种好方法,可以自动将工作副本中的所有未版本控制文件添加到我的SVN存储库中。
我有一个可以创建一些应该在源代码管理下的文件的实时服务器。我想有一个简短的脚本,我可以自动添加这些脚本,而不是一次一个地添加它们。
我的服务器正在运行Windows Server 2003,因此Unix解决方案无效。
答案 0 :(得分:343)
svn add --force * --auto-props --parents --depth infinity -q
很棒的提示!一句话:我的Eclipse会自动将新文件添加到忽略列表中。这可能是配置问题,但无论如何:有--no-ignore
选项可以帮助。
在此之后,您可以提交:
svn commit -m 'Adding a file'
答案 1 :(得分:67)
这是一个不同的question to mine,但有一个答案属于这个问题:
svn status | grep '?' | sed 's/^.* /svn add /' | bash
答案 2 :(得分:36)
这有什么作用:
c:\work\repo1>svn add . --force
添加子目录的内容。
不添加被忽略的文件。
列出添加了哪些文件。
命令中的点表示当前目录,如果要添加与当前目录不同的目录,则可以用特定目录名或路径替换。
答案 3 :(得分:31)
这对我有用:
svn add `svn status . | grep "^?" | awk '{print $2}'`
(Source)
由于您已经解决了Windows的问题,因此这是一个UNIX解决方案(遵循Sam)。我在这里添加,因为我认为对于那些提出同样问题的人来说仍然有用(因为标题不包含关键字“WINDOWS”)。
注意(2015年2月): 如“bdrx”所述,上述命令可以通过这种方式进一步简化:
svn add `svn status . | awk '/^[?]/{print $2}'`
答案 4 :(得分:5)
此方法应处理其中包含任意数量/空格组合的文件名...
svn status /home/websites/website1 | grep -Z "^?" | sed s/^?// | sed s/[[:space:]]*// | xargs -i svn add \"{}\"
以下是对该命令执行操作的说明:
使用xargs的-i参数来处理能够将包含空格的文件名导入'svn add' - 基本上,-i sets {}用作占位符,这样我们就可以将“字符串放在文件名周围通过'svn add'。
这种方法的一个优点是它应该处理带有空格的文件名。
答案 5 :(得分:4)
TortoiseSVN内置此功能。只需右键单击顶级文件夹,然后选择添加 ...
答案 6 :(得分:3)
使用:
svn st | grep ? | cut -d? -f2 | xargs svn add
答案 7 :(得分:3)
我总是使用:
复制和粘贴强>
svn st | grep "^\?" | awk "{print \$2}" | xargs svn add $1
答案 8 :(得分:3)
svn add --force .
这将在当前目录和所有版本化子目录中添加任何未版本控制的文件。
答案 9 :(得分:3)
答案 10 :(得分:3)
由于这篇文章被标记为Windows,我想我会为Windows制定一个解决方案。我想自动化这个过程,我制作了一个bat文件。我拒绝在C#中制作一个console.exe。
我想在开始提交过程时添加未在我的存储库中添加的任何文件或文件夹。
许多答案存在的问题是,他们会列出无法修改的文件,根据TortoiseSVN中的忽略列表,应忽略这些文件。
这是我的钩子设置和批处理文件,它可以做到这一点
Tortoise Hook脚本:
"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
答案 11 :(得分: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"
答案 12 :(得分:2)
如果您在Windows中使用Linux或使用Cygwin或MinGW,您可以使用类似bash的解决方案,如下所示。与此处介绍的其他类似对比,这个考虑了文件名空间:
svn status| grep ^? | while read line ; do svn add "`echo $line|cut --complement -c 1,2`" ;done
答案 13 :(得分: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"
这里有一些解释。
第一个命令添加所有目录。第二个命令仅根据指定的模式添加文件。
让我提供更多细节:
在第二个命令中,唯一的区别是dir命令和svn命令,我认为很清楚。
答案 14 :(得分:0)
这是将目录与包括新文件的SVN同步的一种惰性和危险的方式:
svn rm --keep-local dir
svn add dir
尽管这可能会在紧急情况下起作用,但也会产生严重的后果。例如,SVN经常会丢失文件的历史记录。
同步目录的理想方法是能够进行差异处理然后使用svn补丁,但是这与diff命令中的格式有所不同,并且svn diff命令将比较工作目录的差异而不是文件系统级别的差异。
答案 15 :(得分: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"
答案 16 :(得分:0)
您可以在Linux上输入以下命令:
find ./ -name "*." | xargs svn add
答案 17 :(得分:0)
您可以使用命令
svn add * force--
或
svn add <directory/file name>
递归添加是默认属性。您可以在SVN book中看到。
问题可以在您的忽略列表或全局属性中。
我有解决方法google issue tracker
TortoiseSVN > Properties
。svn:global-ignores with a value of *
star(*)
的属性,则它将忽略递归添加。因此,请删除此属性。TortoiseSVN > Settings > General
。star(*)
,请删除此属性。这个人also explained为什么将此属性添加到我的项目中。
最类似的实现方式是,有人右键单击没有任何扩展名的文件,然后选择TortoiseSVN-> SVN Ignore-> *(递归),然后提交该文件。
您可以检查日志以查看谁进行了该属性更改,找到 弄清楚他们实际上想做什么,并要求他们做更多 以后要小心。 :)
答案 18 :(得分:-1)
我想我做过类似的事情:
svn add . --recursive
但不确定我的记忆是否正确;-p