2013-10-10 31 views
1

SVN中是否有任何方法来列出已更改的文件,而忽略仅更改了空格的文件。 我已经尝试过,没有成功,执行以下操作:SVN - 忽略空格的已更改文件列表

svn diff -x --ignore-all-space --summarize > changed_files.txt 

的背景情况,这里是场景中,作为一个例子: 我有生成并有时一些Java类(的.java),这取决于一些配置(如IDE中的格式化程序),很多文件被标记为更改,尽管其中大多数只有空白更​​改。

最好甚至能够直接在SVN客户端(如TortoiseSVN)上过滤,所以我只能提交具有实际更改的文件,而忽略其余部分。

+0

您是生成类(.class)还是代码(.java)?你没有说它是java,但是问题是......生成源码或字节码。 – thekbb

+0

是java类,源代码(.java文件)。但问题的目标是更通用,因为它可以应用于任何事情。我把这个问题改写得更加清楚。 – xsilmarx

回答

0

我有一些java类(.java)是生成的,有时候,根据某些配置(如IDE中的格式化程序),很多文件被标记为更改,尽管其中大多数只有空白更​​改。

最好的答案是不要将生成的*.java文件存储在您的代码中。我们有几个项目使用WSDL文件来创建必须稍后编译的Java文件。如果需要生成这些文件,我们只需设置我们的Ant构建即可生成这些文件。

不完全是你在找什么,但你找到了你不应该在你的仓库中生成文件的原因之一。

+0

事实并非如此,因为生成的类也可以手动编辑,并且仍然生成未标记为已编辑的部分。 – xsilmarx

0

@nosid处得到以前回答的建议,我为Windows创建了一个批处理脚本,它使用一个临时文件来写入svn status和svn diff的结果。也许有更好的方式来做到这一点,而无需使用临时文件,但这个工作得很好:

@echo off 
set dir=%1 
set tempDir=%TEMP% 
set svnFileStatus=%tempDir%\svn-file-status 
set svnFileChanges=%tempDir%\svn-file-changes 
set fileType=*.java 

for /f %%a IN ('dir /b /s %dir%\%fileType%') do (
    svn status %%a > %svnFileStatus% 
    call :CheckStatus %svnFileStatus% %%a 
) 
goto :eof 

:CheckStatus 
if %~z1 == 0 (
    rem skip 
) else (
    svn diff -x --ignore-all-space %2 > %svnFileChanges% 
    call :CheckDiff %svnFileChanges% %2 
) 
goto :eof 

:CheckDiff 
if %~z1 == 0 (
    svn changelist ignore-on-commit %2 
) 
goto :eof 

此脚本添加文件到忽略-ON-commit的更改。然后可以恢复这个更改列表。或者,如果您有信心,可以调整脚本以直接恢复文件,但我更倾向于采用两步操作。

要使用该脚本,只需将其复制到一个批处理文件,并从Windows命令行通过参数传递的目录搜索,像这样称呼它:

check-empty-changes.bat <svn-working-copy-directory> 

的脚本配置为搜索对于java文件,但您可以将其更改为使用其他文件扩展名,设置变量%fileType% properties。