如何从svn版本控制中删除文件,但不要从每个工作副本中删除它?

31

我的情况是一堆文件被检入svn,它们非常讨厌并且需要在源代码控制下(特别是一个log4j.properties文件),我想从版本控制中删除它们。 我已经知道如何从自己的本地工作副本中将文件从svn版本控制中删除,就像这个问题这个问题,但那不是我要找的东西。

问题是,在使用svn rm --keep-local删除文件后,每当其他用户从仓库拉取他们的log4j.properties的副本时,它们本地的log4j.properties 副本都将消失,导致他们的环境崩溃。 我想要做的是从存储库中删除文件的版本控制,并使每个人在从存储库中拉取时,就好像他们在自己的机器上使用了--keep-local一样,以便其现有的log4j.properties文件副本保留但成为未版本化的。

这种操作是否可行? 我怀疑这是svn没有的功能。


1
这是一个矛盾。如果文件是项目所必需的一部分 - 如果不是,为什么删除它会使任何人的环境崩溃?- 它应该放在源代码控制中。 - 3Dave
2
这并不是说文件不必要,而更多的是一种部署工件,它在不同用户之间不会相同 - 例如,其中一个文件包含了一堆目录路径。我们已经有了像Don Kirkby回答中提供的示例文件。 - Tim Gilbert
4个回答

13

要保密的关键是在删除之前将其添加到忽略列表中。如果按照这个顺序进行操作,删除就不会传播到其他人的工作副本。

我们仍在使用svn 1.4版本,因此--keep-local选项不可用。但你可以通过使用服务器路径和-m提交消息来实现相同的效果。

所以在我的例子中,我意外地提交了一个名为nbproject的目录。那里存放着我们使用的IDE(NetBeans)的开发者项目设置。我不想从每个人的工作副本中删除它,否则他们会丢失所有的设置!但以下方法解决了问题。从父目录开始:

$ cd trunk
$ svn propedit svn:ignore .

打开 $EDITOR

在单独的一行添加 nbproject 并保存

$ svn commit -m 'Ignore nbproject'
$ svn rm https://.../trunk/nbproject -m 'Remove nbproject from svn'

1
也许人们需要最先更新忽略设置,再考虑其它事情? - tgkprog

9
如果您真的有很多这样的文件,可以通过使用 svndumpfilter 操作一举两得。思路是在服务器上对仓库进行转储,过滤掉不想要保留的文件,然后将结果加载到新的仓库中。然后,您将新的仓库替换旧的仓库。
需要小心操作,确保用户没有访问该仓库。但这实际上会删除文件(当它们很大时非常有用),而不是在历史记录中保留它们。作为副作用,下次用户更新时,这些文件将被忽略,就像它们从未在仓库中一样。我们曾几次使用此方法来删除不应该存在于仓库中的二进制文件。 相关文档链接
简单示例(命令当然提供更多灵活性):
svnadmin create repos_new
svnadmin dump repos | svndumpfilter exclude trunk/log4j.properties | svnadmin load repos_new

由于它涉及到服务器上的存储库,我想再次强调您应该采取预防措施(保留旧存储库)。对于不那么烦人的文件,Don 提出的方法不太激进且更可取。
为避免这种情况,您可以在目录中设置相应的 svn:ignore 属性,也可以鼓励人们使用全局忽略(很遗憾必须在每个客户端上设置),甚至使用挂钩脚本来预先拒绝某些文件类别。

1
好的天啊。这看起来像是很多工作,而且还很危险(此外我没有访问仓库的shell权限)。但它似乎是一个解决方案。 - Tim Gilbert
1
工作量主要是告诉哪些文件需要排除,在链接中有更好的解释,可以分几步完成。好消息是你不需要实际操作原始代码库,最坏的情况下只需重新创建一个新的代码库。将原始代码库移动到其他位置,将新代码库重命名为原始代码库,验证一切是否正常,然后就完成了 :-) - RedGlyph

7
我通常在类似的情况下会将 log4j.properties 的代码库副本重命名为 log4j.properties.templatelog4j.properties.default,并将 log4j.properties 添加到 svn:ignore 列表中。然后每个用户都必须将该文件复制到他们的工作副本中的 log4j.properties 中。为了使其更加友好,您可以在构建脚本中添加一个检查,如果找不到本地副本,则打印出提醒消息。

实际上,对于许多这些文件,我们已经有非常类似的东西了,启动新环境的一部分涉及复制这些文件。但我不想让每个人都再次复制我从svn中删除的文件。 - Tim Gilbert
2
@Tim:有时候成长需要一点痛苦。 - NotMe
1
然而,构建脚本的想法很有趣 - 我想我可以编写一个脚本,如果实际文件不存在,自动将示例文件复制到实际文件上,并且只需执行并从存储库中删除现有副本。但这是另一个问题... - Tim Gilbert

-3
svn delete --keep-local <PATH> 

好的,我会做。


4
你没明白这个问题吗?它询问是否有一种替代方案可以避免从人们的工作目录中删除文件,只是将它们从版本控制中移除。所以,svn delete --keep-local 不可行。 - Richard Turner

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