4

Subversion 的“关键字”功能非常适合用修订号自动标记文本文件。我真的很想为 Word 和/或 OpenOffice 文档做类似的事情。

我通过在“注释”文档属性字段中插入“固定宽度”关键字替换,对 Word 文档进行了尝试。但它似乎仍然以某种方式破坏了文档(另外我不知道在多字节字符的情况下“固定宽度”可能意味着什么)。我也不喜欢这个想法,因为它不利于在文档本身的可打印部分插入数字。

我现在想象的是一个在文档打开时自动运行并更新自定义文档属性的宏。该文档可能包含 doc 属性引用字段,这些字段使用存储在 doc 属性中的值进行更新。

有没有人这样做,或做任何其他事情来实现这个目标?对于 Word 或 OpenOffice?

4

5 回答 5

3

第一:嵌入式版本号——好还是坏?: 我觉得他们很邪恶。

您不应使用技术内部修订号来表示文档的版本。

“这是我的word文档的2.2版本”和“这是我的word文档的1567版本”是不一样的。

  • 从最终客户的角度来看,前者是一个“适用的”修订号。
  • 从工具的角度来看,后者是“技术”修订号。

另外,如果它使用当前修订号修改文档,它仍然需要提交,这意味着存储的版本将在一个不同于您的宏更新的修订号中。
如果没有提交,那么被这样标记的文档总是有可能不完全是最初从 Subversion 查询的那个。


话虽这么说......关于更新 Office 文档属性的更普遍的问题:

该线程更新 word 2003 字段自动建议使用 Office API。Microsoft.Office.Interop不允许修改属性,但 VBA API 允许您访问要为给定SmartTag设置的任何 CustomProperty 。

本文“将带有自定义识别器的智能标记添加到 Word 文档”为您提供了 SmartTag 自定义行为的示例。

智能标签是附有类型信息的文本字符串;当与标准匹配的文本字符串出现在文档中时,它会被识别并且用户能够执行适合该类型字符串的操作。

因此可以想象一个 SmartTag 能够识别字符串“revision for this document”,自定义行为是“我将向 SVN 查询正确的修订号并显示它”

于 2009-04-23T13:53:57.847 回答
1

你可以试试 Tobi 的小脚本:http: //insights.oetiker.ch/windows/SvnProperties4MSOffice/

于 2009-04-23T14:08:08.030 回答
1

我们实际上正在使用一个有点相似的“系统”(由一位前同事创建),它解决了一些这些问题。

愿望...

  • 我们希望能够看到两个打印输出实际上是相同的版本。
  • 我们希望能够找到打印输出(包括修订)的来源。
  • 我们希望消除由于作者忘记更新修订号而引起的问题。

解决方案

我们没有使用 svn 修订号,而是为我们的文档使用“人工”修订号。为了确保我们没有多个版本具有相同的修订号浮动在文档被修改时会自动更新,即会有几个永远不会发布的“修订”......猜测它并不完美......

半技术细节...

  • “人工”修订号存储在文档的自定义属性中。
  • 我们已将所有 word 文档设置为 requre lock (svn:needs-lock)
  • 在 Lock 上,一个加号被添加到修订字符串的末尾以表示一个“脏”版本。
  • 提交时,加号被删除,数字增加

结果

一个系统,我们在打印文档中有一个修订号:

  • 除非文档更改,否则不要更改
  • 表示脏版本,即从修改后的工作副本中打印出来
  • 如果文档不同(即作者忘记更新修订版没有问题)
于 2009-09-03T11:21:15.377 回答
0

如果您将 Word 文档保存为 .xml(所谓的平面 OPC 格式)会怎样?

那么它只是一个文本文档,svn 关键字应该可以工作。

于 2009-04-23T22:32:33.470 回答
0

VonC 的回答使我确信 doc-open 不是更新文档属性的正确时间。例如,如果文件通过电子邮件发送给其他人,或者复制了一张 CD,或者“导出”,那么它在打开时无法更新其 SVN 版本。很难确保文件永远不会包含错误的过时修订号。因此,要“正确”执行此操作,文件的修订号应在 SVN 签出/更新时更新。

我相信对于文本文件中的 SVN 关键字,客户端会对文件进行“摆弄”,在结帐时对其进行更新,并在提交前返回“规范”表单。所以对于 Word,使用客户端钩子来做同样的事情会很棒。TortoiseSVN 有客户端钩子,但我认为其他 SVN 客户端没有。在我的工作中,我们几乎总是使用 TortoiseSVN,这样它就可以很好地工作。

所以我想做的是写两个 TortoiseSVN 客户端钩子:

1) 更新后挂钩插入包含文件相关提交 SVN 修订的“SvnRevision”文档属性。

2) 预提交挂钩以删除“SvnRevision”文档属性。如果非 TortoiseSVN 客户端将其检出,这会使存储在存储库中的文件“干净”。(它还可以防止合并冲突?)


更新: Arrr 我刚刚意识到另一个问题:如果我执行上述操作,那么 SVN 会认为文件已更改。嗯,这似乎很难。为了使该功能正常工作,它确实需要与客户端进行相当紧密的集成。

于 2009-04-24T04:32:49.580 回答