我正在寻找一种自动将工作副本中所有未版本控制的文件自动“ svn添加”到我的SVN存储库的好方法。
我有一个实时服务器,可以创建一些应在源代码控制下的文件。我希望有一个简短的脚本可以运行以自动添加这些脚本,而不是每次都添加一个脚本。
我的服务器正在运行Windows Server 2003,因此Unix解决方案无法正常工作。
我正在寻找一种自动将工作副本中所有未版本控制的文件自动“ svn添加”到我的SVN存储库的好方法。
我有一个实时服务器,可以创建一些应在源代码控制下的文件。我希望有一个简短的脚本可以运行以自动添加这些脚本,而不是每次都添加一个脚本。
我的服务器正在运行Windows Server 2003,因此Unix解决方案无法正常工作。
Answers:
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
*
末尾,否则它将不起作用(对我而言租用)
这是可行的:
c:\work\repo1>svn add . --force
添加子目录的内容。
不添加忽略的文件。
列出添加了哪些文件。
该命令中的点表示当前目录,如果要添加与当前目录不同的目录,则可以用特定的目录名或路径替换。
.\*
svn root在另一个dir上stuff\svn_root\*
。
stuff\svn_root
不会在子目录(例如中stuff\svn_root\already_in_svn\not_in_svn.txt
)中添加文件。因此,最后的明星。
这对我有用:
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流程。
此方法应处理文件名中包含任意数量/空格的组合...
svn status /home/websites/website1 | grep -Z "^?" | sed s/^?// | sed s/[[:space:]]*// | xargs -i svn add \"{}\"
以下是该命令的解释:
使用xargs的-i参数来处理是否能够将带有空格的文件名导入到'svn add'中-基本上,-i设置{}用作占位符,因此我们可以在'svn使用的文件名周围加上“加'。
此方法的优点是,它应该处理文件名中带有空格的文件名。
如果您愿意使用非命令行解决方案,TortoiseSVN内置了此功能。只需右键单击顶层文件夹,然后选择添加 ...。
由于这篇文章被标记为Windows,我想我会为Windows解决方案。我想自动化该过程,并制作了一个bat文件。我拒绝在C#中制作console.exe。
我想添加开始提交过程时未添加到存储库中的任何文件或文件夹。
许多答案的问题在于它们将列出未版本控制的文件,根据我在TortoiseSVN中的忽略列表,这些文件应被忽略。
这是我的钩子设置和批处理文件
乌龟钩脚本:
"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
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命令,我认为这很清楚。
您可以使用命令
svn add * force--
要么
svn add <directory/file name>
递归添加是默认属性。您可以在SVN书中看到。
问题可能出在您的忽略列表或全局属性中。
我有解决方案的Google问题跟踪器
TortoiseSVN > Properties
。svn:global-ignores with a value of *
star(*)
则它将忽略递归添加。因此删除此属性。TortoiseSVN > Settings > General
。star(*)
,请删除此属性。这个人还解释了为什么将此属性添加到我的项目中。
最类似于到达该目录的方式是,有人右键单击没有任何扩展名的文件,然后选择TortoiseSVN-> SVN Ignore-> *(递归),然后提交该文件。
您可以检查日志以查看谁进行了该属性更改,找出他们实际尝试执行的操作,并要求他们将来更加小心。:)