0

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

但我需要这样做而不删除 svn:ignore 属性的先前值。如果我使用命令:

svn propset svn:ignore "*.jar" .

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

Usingsvn propedit不适合我,因为我需要从 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>
4

2 回答 2

1

您是否尝试过 svnant 任务?您可以使用它直接将 SVN 客户端功能集成到您的 Ant 构建中。它还有一个忽略任务,看起来它可以满足您的需求。

于 2012-11-30T16:18:16.810 回答
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()
);

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

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

However, as David pointed out in his answer, you can use ignore task which seems like the best solution in general (although it may be not applicable for you case).

于 2012-11-30T16:23:10.500 回答