如何使用Subversion的propset来设置URL的属性?

10

是否可以仅通过URL来操作subversion属性,例如svn:externals? (即,不需要一个工作副本。)

我想要一个脚本,可以给定subversion URL并将svn:externals固定到特定的修订版本,但这似乎是不可能的:

$ svn propset foo bar https://example.com/svn/myproject/trunk
svn: Setting property on non-local target 'https://example.com/svn/myproject/trunk' needs a base revision

$ svn propset foo bar -r HEAD https://example.com/svn/myproject/trunk
svn: Try 'svn help' for more info
svn: Cannot specify revision for setting versioned property 'foo'

$ svn propset foo bar --revprop -r HEAD https://example.com/svn/myproject/trunk
svn: DAV request failed; it's possible that the repository's pre-revprop-change hook either failed or is non-existent
svn: At least one property change failed; repository is unchanged
svn: Error setting property 'foo': 
could not remove a property

如果我使用实际的修订号而不是HEAD,我会得到相同的结果。

4个回答

9
是的,尽管这有点像黑客技巧;svn propedit 可以更改 URL 目标: svn propedit foo --editor-cmd "echo bar>" http://example.com/svn/myproject/trunk -m "Property changed"

这是一个很棒的技巧,但最好通过 -m 标志在命令行中指定消息,否则编辑器也会为消息调用。 - Gianluca P.

7

您可以使用 svnmucc 命令来非交互式地设置URL的属性,例如 svn:externals

示例:

$ svnmucc --root-url https://example.com/svn -m 'reference other/yap' \
   propset svn:externals "^/otherproject/tag/xyz other
^/yetanother/tag/123 yap" myproject/trunk

请注意,svnmucc不仅支持propset, 还支持其他命令,并且可以在一个调用中链接多个命令(因此名称为“mu”)。结果只有一个变更集。 svnmucc命令是Subversion源包的一部分,并且通常通过发行版的软件包管理器提供。例如,Fedora 25将其包含在subversion-tools软件包中。OpenCSW甚至将其包含在主要Subversion软件包中。

Windows不允许多行。命令在第一个属性后中断。如果我将其写成连续的单行,则会将其视为单个属性。如何在Windows上运行此命令的解决方案是什么? - Sahil Doshi
@SahilDoshi 我不是Windows用户,但当我使用Windows时,我会安装Cygwin并在Cygwin终端中执行此类操作。由于您现在处于标准shell(例如bash)中,因此您应该能够像在Linux / UNIX环境中一样使用行连续和多行引用字符串。 - maxschlepzig

4
不行。更改文件属性就像更改文件本身一样,需要一个工作目录。有一些Subversion命令可以在不需要工作副本的情况下更改提交:`svn cp`、`svn mkdir`和`svn delete`。其他所有操作都需要一个工作目录才能进行更改。
顺便说一下,您可以在没有工作副本的情况下更改修订版本属性。修订版本属性是诸如提交注释(svn:log)、提交者ID(svn:author)和提交时间(svn:date)之类的内容。

4
一种解决方法似乎是使用svn checkout --depth=empty命令将代码检出到一个临时目录(可以使用mktemp或类似工具来创建),然后使用svn propset命令进行更改,提交更改后再删除临时目录即可(这个过程非常快速)。 - mjs
2
还有一种选择:svnmucc,它包含在SVN源代码中,但默认情况下不会构建或安装。 您可以在http://svnbook.red-bean.com/en/1.8/svn.ref.svnmucc.re.html上阅读有关它的信息。 - trent
补充@trent的笔记,从1.8.1版本开始,TortoiseSVN现在将svnmucc捆绑到安装程序中https://sourceforge.net/p/tortoisesvn/tickets/496/ - Mister_Tom

0

在Willem的优秀回答的基础上,这里提供一个示例,展示如何使用URL设置SVN auto-props以针对所有文件设置needs-lock和特定扩展名设置mime-type

svn propedit svn:auto-props --editor-cmd "echo \"* = svn:needs-lock=*
*.os = svn:mime-type=application/octet-stream
*.osproj = svn:mime-type=application/octet-stream\" >" http://example.com/svn/myproject/trunk -m "Setting auto-props."

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接