如何向svn添加条目:忽略而不使用Subversion命令行删除以前的值

时间:2012-11-30 15:52:18

标签: svn ant

我需要在svn中添加一些文件:从命令行中忽略。

但是我需要在不删除svn:ignore属性的先前值的情况下执行此操作。如果我使用命令:

svn propset svn:ignore "*.jar" .

它设置了正确的忽略值但删除了之前的每个值,这不是我想要的。

使用svn propedit不适合我,因为我需要从Ant脚本执行此操作。

编辑:可移植性对我来说不是问题(我必须在Windows上工作)但我无法安装第三方Ant库,我只有Subversion命令行。

提前感谢任何提示。

最终编辑:对enyone感兴趣,我以这种方式在Ant脚本中实现了建议的解决方案:

<!-- Read current values and write them to a file -->
<exec executable="svn" output="${build}/current-props-file">
    <arg value="propget" />
    <arg value="svn:ignore" />
    <arg value="." />
</exec>
<!-- Reload the file, stripping away the value possibly already present to avoid duplicate -->
<loadfile srcfile="${build}/current-props-file" property="cleaned-props">
    <filterchain>
        <linecontains negate="true">
            <contains value=".jar" /> 
        </linecontains>
    </filterchain>
</loadfile>
<echo message="cleaned-props: ${cleaned-props}" />
<!-- Create file with final values to set -->
<echo file="${build}/cleaned-props-file" message="${cleaned-props}*.jar" />
<!-- Set property values -->
<exec executable="svn">
    <arg value="propset" />
    <arg value="svn:ignore" />
    <arg value="--file" />
    <arg value="${build}/cleaned-props-file" />
    <arg value="." />
</exec>

2 个答案:

答案 0 :(得分:1)

您是否尝试过svnant任务?您可以使用它将SVN客户端功能直接集成到Ant构建中。它还有一个ignore task,看起来就像你想做的那样。

答案 1 :(得分:1)

您可以在更新之前读取svn:ignore的值,然后在此值后附加一个新行并设置新值:

$ ignores=$(svn propget svn:ignore .)
$ ignores="$ignores"$'\n'"*.jar"
$ svn propset svn:ignore "$ignores" .

您还可以使用临时文件存储旧值:

$ svn propget svn:ignore . > /tmp/ignores
$ echo "*.jar" >> /tmp/ignores
$ svn propset svn:ignore -F /tmp/ignores .
$ rm -f /tmp/ignores

但是,由于您要从Ant脚本执行此代码,我建议使用SVNKit实现该功能。代码应如下所示:

File target = new File("");
SVNWCClient client = SVNClientManager.newInstance().getWCClient();
SVNPropertyData oldValue = client.doGetProperty(
    target,
    SVNProperty.IGNORE,
    SVNRevision.WORKING,
    SVNRevision.WORKING
);
String newValue = SVNPropertyValue.getPropertyAsString(oldValue.getValue()) +
                  '\n' + "*.jars";
client.doSetProperty(
    target,
    SVNProperty.IGNORE,
    SVNPropertyValue.create(newValue),
    false,
    SVNDepth.EMPTY,
    ISVNPropertyHandler.NULL,
    Collections.emptyList()
);

为了从蚂蚁脚本运行此代码,请将其放入某些类IgnoresUpdate的main方法中。编译并为脚本提供.class文件。然后你可以按如下方式调用它:

<java classname="IgnoresUpdate" fork="true">
    <classpath>
        <pathelement location="/path/to/compiled/IgnoresUpdate"/>
        <pathelement location="/path/to/svnkit.jar"/>
    </classpath>
</java>

但是,正如David中指出his answer,您可以使用ignore task,这似乎是一般的最佳解决方案(尽管它可能不适用于您的情况)。