我该如何从SVN获取所有未版本化文件的列表?

81

有时候在开发过程中,你会决定提交代码,忘记了项目中创建了一些文件。几天后,你的朋友从Subversion获取你的构建版本,抱怨一些文件似乎丢失了。你意识到,“糟糕,我忘记将这些文件添加到仓库中了!”

如何从Subversion获取未被纳入版本控制的文件列表,以确保将项目中所有内容都添加到了仓库中?

5个回答

111

使用svn status命令:

svn status | grep ^?

没有版本控制的文件在行首用 ? 标示。

如果你发现总有一些特定的文件不应该被加入到仓库(例如生成的二进制文件),你应该在包含目录上设置 svn:ignore 属性,这样当使用 svn status 时就不会再出现这些文件了。


4
个人而言,在进行“svn ci”提交之前,我总是先执行“svn diff”命令。但由于有时会很慢,因此我总是在执行“svn diff”之前先执行“svn stat”命令,这样很方便,因为我不会忘记添加文件。 - ephemient
11
如果您有许多未版本化的文件需要添加,可以执行以下操作:svn st | grep ^? | awk '{print $2} | xargs svn add首先找到未版本化的文件,awk将仅打印行中的第二个项目(即文件路径),而xargs将使得该路径成为svn add命令的参数。 - duality_
7
awk命令末尾缺少一个单引号。正确的命令应该是:svn st | grep ^? | awk '{print $2}' | xargs svn add - jplandrain

52
如果一些文件的状态已经添加了ignore,它们将不会在svn status中显示。您需要:
svn status --no-ignore

1
对于二进制文件也很有帮助,因为在我的设置中,它们似乎默认被 svn status 忽略了。我可能不知道某些可以做到这一点的设置,但是使用 --no-ignore 在这种情况下对我很有帮助。 - Andy Weinstein
这应该是被接受的答案,因为所选答案在我的情况下无法工作(适用于Linux环境中的二进制文件)。 - Asqan

15

如果你在Windows上运行,你可以使用PowerShell来做类似于Greg Hewgill的回答。

(svn stat) -match '^\?'

这可以很容易地扩展到查找所有未标记版本和被忽略的文件并将它们删除。

(svn stat "--no-ignore") -match '^[I?]' -replace '^.\s+','' | rm

希望对某些人有所帮助!


1
这个 () -math 怎么称呼? - Pavel Petrov

12

或者从Windows命令行中执行:

svn stat | find "?"

1
您可以使用此命令列出所有未版本化文件的路径:
svn status | awk '/^?/ {print $2}'

第一部分将执行一个svn status,然后将输出重定向到AWK,它将执行简单的过滤器“第一个字符应该是'?'”,然后打印第二个参数“即文件路径”。 svn status将始终不会打印被忽略的文件。您可以通过添加该路径来添加文件或路径。
svn propset svn:ignore "PATH OR PATERN"

这似乎获取了 svn status 的所有结果,而不仅限于未加版本控制的文件。我认为应该使用命令 svn status | awk '/^\?/ {print $2}' 来转义 ?,因为过滤器是一个正则表达式。 - KymikoLoco

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接