如何将所有未版本化的文件添加到 SVN?

我正在寻找一种好的方法来自动“ SVN 添加”所有未版本化的文件在一个工作副本到我的 SVN 存储库。

我有一个活的服务器,可以创建一些文件,应该在源代码管理。我想有一个简短的脚本,我可以运行自动添加这些,而不是通过和添加他们一次一个。

我的服务器正在运行 WindowsServer2003,所以 Unix 解决方案不能工作。

202763 次浏览

这是一个不同的 问我一个问题,但有一个答案属于这个问题:

svn status | grep '?' | sed 's/^.* /svn add /' | bash

我想我也做过类似的事情:

svn add . --recursive

但不确定我的记忆是否正确;

如果您愿意使用非命令行解决方案,TortoiseSVN 内置了这种功能。只需右键单击顶层文件夹,并选择 ..。

用途:

svn st | grep ? | cut -d? -f2 | xargs svn add

svn add --force * --auto-props --parents --depth infinity -q

好主意!注意: 我的 日食会自动将新文件添加到忽略列表中。这可能是一个配置问题,但无论如何: --no-ignore选项有所帮助。

在这之后,你可以承诺:

svn commit -m 'Adding a file'

这对我很有效:

svn add `svn status . | grep "^?" | awk '{print $2}'`

(来源)

因为您已经解决了 Windows 的问题,所以这是一个 UNIX 解决方案(在 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 将{}设置为占位符,这样我们就可以在‘ svn add’使用的文件名周围放置“字符。

这种方法的一个优点是,它应该处理带空格的文件名。

有效的方法是这样的:

c:\work\repo1>svn add . --force

添加子目录的内容。

不添加被忽略的文件。

列出添加的文件。

命令中的点表示工作目录,如果您想添加与当前目录不同的目录,可以用特定的目录名或路径替换。

我总是用:

复制和粘贴

svn st | grep "^\?" | awk "{print \$2}" | xargs svn add $1
svn add --force .

这会在工作目录和所有版本的子目录中添加任何未版本化的文件。

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"

如果您在 Windows 中使用 Linux 或 Cygwin 或 MinGW,您可以使用类似 bash 的解决方案,如下所示。与这里提到的其他类似的方法相比,这个方法考虑到了文件名空间:

svn status| grep ^? | while read line ; do  svn add "`echo $line|cut --complement -c 1,2`" ;done

这是记录在 svn 书籍和最简单的工作完美的我

svn add * --force

Http://svnbook.red-bean.com/en/1.6/svn.ref.svn.c.add.html

因为这篇文章是以 Windows 为标签的,所以我想我可以为 Windows 找到一个解决方案。我想让这个过程自动化,我做了一个蝙蝠档案。我拒绝用 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 %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: 它是一个变量; 它将一次假定列出的每个文件的值; 它可以有另一个只有一个字符的名称。
  • 没必要解释,对吧?
  • (‘ dir/s/b/a: d’) : DOS 命令将列出目录; 在我的例子中,/s 是递归的,/b 只取完整路径,/a: d 仅表示目录; 根据需要改变它,保留括号和撇号。
  • DO: 意味着命令中接下来要执行的内容是对每个目录执行的内容
  • SVN add —— deep = void: 这是要运行的 SVN 命令; 深度定义意味着只添加目录,而不添加目录中的文件。
  • “% F”: 这就是您如何使用前面定义的变量的。

在第二个命令中,唯一的区别是 dir 命令和 svn 命令,我认为这已经足够清楚了。

你可以使用命令

svn add * force--

或者

svn add <directory/file name>

如果您的文件/目录没有递归添加,那么请检查以下内容。

递归加法是默认属性

问题可以在忽略列表或全局属性中。

我有解决方案 谷歌问题追踪器

检查忽略星号(*)的全局属性

  • 在窗口中右键单击回购。选择 TortoiseSVN > Properties
  • 看看是否有属性 svn:global-ignores with a value of *
  • 如果你的属性是 star(*),那么它会忽略递归加法。所以删除这个属性。

检查忽略星号(*)的全局忽略模式

  • 在窗口中右键单击回购。选择 TortoiseSVN > Settings > General
  • 如果没有在这里设置 星(*),请参见全局忽略模式。
  • 如果找到 star(*),请删除此属性。

这个家伙 也解释了为什么这个属性添加到我的项目。

最常见的方式是,有人右键单击一个没有任何扩展名的文件,选择 TortoiseSVN-> SVN Ignore-> * (递归) ,然后提交此文件。

您可以检查日志以查看是谁提交了属性更改,查找 告诉他们实际上想做什么,并要求他们做得更多 以后要小心。 :)

您可以在 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 经常会丢失文件历史记录的跟踪。

同步目录的理想方法是使用 diff 然后使用 svn 补丁,但是这会偏离 diff 命令的格式,而 svn diff 命令会比较工作目录的差异而不是文件系统级别的差异。