我svn:external
在我的存储库中做了一个。一切正常,除了svn status
命令的输出。在输出中有很多我不需要的信息:
$ svn st
X lib
Performing status on external item at 'lib'
我可以运行svn st --ignore-externals -q
并且可以将此行放在一个小脚本中,但也许有更好的解决方案。如何在不查看外部信息的情况下查看我的工作副本的状态?
搜索出现了一个巧妙的 Bash 脚本实现,它svn
用脚本覆盖了命令。但是,我想在 Windows 中做类似的事情。从您的 中删除该svn
目录PATH
,然后创建一个名为的批处理脚本svn.bat
并将其放在您的某个位置PATH
(如C:\Windows
):
@echo off
setlocal
if (%1)==(st) goto :match
if (%1)==(stat) goto :match
if (%1)==(status) goto :match
:: If not running Status command, just pass the args along
"C:\Program Files\SlikSvn\bin\svn" %*
goto :eof
:match
:: Init variables
set svnargs1=
set svnargs2=--ignore-externals
:: Loop through arguments
:loop
if "%~1"=="" goto :cont
:: Look for ignore externals flag
if "%~1"=="--examine-externals" (
set svnargs2=
) else (
if "%~1"=="-h" (
set svnargs2=
)
set svnargs1=%svnargs1% %1%
)
shift & goto :loop
:cont
:: Call svn
"C:\Program Files\SlikSvn\bin\svn" %svnargs1% %svnargs2%
我认为目前还没有答案能真正解决问题,因为如果 svn:externals 的一部分发生了变化,它们当然应该被显示出来。这对于真正的外部存储库可能没有意义。但我使用 svn:externals 将同一存储库中的通用构建文件夹添加到项目中(因为不存在模块的通用层次结构)。而且我不想使用这些选项--ignore-externals -q
,因为我丢失了有关未添加文件和我在这个项目中完成的一般构建脚本中的更改的信息(我可能想要提交)。我的解决方案是修补 subversion java 命令行实现svnkit。
AbstractSVNCommand.registerCommand(new SVNStatusCommand());
final ByteArrayOutputStream bos = new ByteArrayOutputStream();
final PrintStream stream = new PrintStream(bos);
final SVNCommandLine commandLine = new SVNCommandLine();
commandLine.init(new String[] { "status", "PATH..." });
final SVNCommandEnvironment env = new SVNCommandEnvironment("mySvn", stream, stream, System.in);
env.init(commandLine);
env.initClientManager();
final SVNStatusCommand svnStatusCall = new SVNStatusCommand();
svnStatusCall.init(env);
svnStatusCall.run();
stream.flush();
String result = new String(bos.toByteArray());
StringBuffer buffer = new StringBuffer();
Scanner scanner = new Scanner(result);
while (scanner.hasNextLine()) {
String line = scanner.nextLine();
if (line.startsWith("X") || line.startsWith("Performing status on external item at")) {
// ignore this output
} else if (line.trim().isEmpty() == false) {
buffer.append(line + "\n");
}
}
System.out.println(buffer.toString());
这解决了问题,因为外部的更改也标有“M”以表示修改...