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

如何向svn添加条目:使用Subversion命令行忽略而不删除以前的值,svn,ant,Svn,Ant,我需要从命令行向svn:ignore添加一些文件 但我需要在不删除svn:ignore属性以前的值的情况下执行此操作。如果我使用命令: svn propset svn:ignore "*.jar" . 它设置了正确的忽略值,但删除了以前的每个值,这不是我想要的 使用svnpropedit不适合我,因为我需要从Ant脚本执行它 编辑:可移植性对我来说不是问题(我必须在windows上工作),但我无法安装第三方Ant库,我只有Subversion命令行 提前谢谢你的提示 最终编辑:对于感兴趣的人,

我需要从命令行向svn:ignore添加一些文件

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

svn propset svn:ignore "*.jar" .
它设置了正确的忽略值,但删除了以前的每个值,这不是我想要的

使用
svnpropedit
不适合我,因为我需要从Ant脚本执行它

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

提前谢谢你的提示

最终编辑:对于感兴趣的人,我以以下方式在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>


您尝试过svnant任务吗?您可以直接将SVN客户端功能集成到Ant构建中。它还有一个,看起来像是做了你想做的事情。

你可以在更新它之前读取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脚本执行此代码,因此我建议使用实现该功能。代码应该如下所示:

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()
);
为了从ant脚本中运行此代码,请将其放入某个类IgnoresUpdate的main方法中。编译并使.class文件可用于脚本。然后您可以按如下方式调用它:

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


然而,正如中所指出的,您可以使用似乎是总体上最好的解决方案(尽管它可能不适用于您的情况)。

是的,但我需要将Ant要求保持在最低限度,因此我选择了命令行(在我当前的工作场所安装svnant任务将是一个负担)。哇,感谢您的回答。为什么在Ant脚本中使用SVNKit?我的意思是,我不知道如何使用上一个代码片段(创建一个Ant附加任务?),但是现在您已经写了它,我想我可以在Ant脚本本身中完成这项工作(获取propget输出并将其放入Ant属性,然后添加缺少的值并调用propset)。我已经更新了答案,因此,它现在有了所有可能的选择。至于您的问题,必须将SVNKit放在类路径上,以便在Ant脚本中使用它。因此,您可能希望避免这种情况,而是调用svn命令,尽管这不是非常可移植的。瓦迪舍夫,您是对的,它不是非常可移植,但在我的情况下这不是一个问题:在我工作的地方,他们预先安装了固定操作系统(windows)和svn客户端,但强制安装另一个java库将是一个问题。不管怎样,我同意你的第一个建议:先准备好,然后准备好。谢谢大家的帮助!将这个答案标记为正确,因为它驱使我走上正确的道路。