如何从svn版本中删除文件而不从每个工作副本中删除它?

时间:2009-10-27 20:16:03

标签: svn version-control

我的情况是在svn中检查了一堆文件,这些文件在源代码控制下非常烦人(特别是log4j.properties文件),我想从版本控制中删除它们。我已经知道如何在我自己的本地工作副本中从svn版本控制中删除文件,如this questionthis one,但这不是我正在寻找的。

问题是,一旦我用svn rm --keep-local删除文件,当其他每个用户从存储库中撤出时,log4j.properties的本地副本将消失,其环境将崩溃。我想要做的是从存储库中的版本控制中删除该文件,但也使其成为当其他人从存储库中拉出时,就好像他们在自己的机器上使用--keep-local一样,这样他们的log4j.properties文件的现有副本仍然存在,但变得无法使用。

这甚至可以吗?我怀疑这是svn没有的功能。

4 个答案:

答案 0 :(得分:14)

秘诀是确保在提交删除之前它位于忽略列表上。如果按此顺序执行,则删除不会传播到其他人的工作副本。

我们仍在使用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 :(得分:8)

如果你真的有很多这样的文件,你可以使用svndumpfilter操作一举两得。我们的想法是在服务器上转储存储库,过滤掉您不想保留的文件,并将结果加载到新的存储库中。然后你把新的那个而不是旧的。

当用户显然无法访问存储库时,必须小心这样做。但它实际上会删除文件(当它们很大时很有趣),而不是将它们保存在历史记录中。作为副作用,下次用户进行更新时,这些文件将被忽略,就好像它们永远不在存储库中一样。我们必须这样做几次才能删除那些没有位置的二进制文件。

Link to the related documentation

简单示例(该命令提供了更多的灵活性):

svnadmin create repos_new
svnadmin dump repos | svndumpfilter exclude trunk/log4j.properties | svnadmin load repos_new

由于它触及服务器上的存储库,我想再次强调你应该采取预防措施(保留旧存储库)。对于不那么恼人的文件,Don提出的方法不那么激烈,而且更可取。

为避免这种情况,您可以在目录中设置相应的svn:ignore属性,也可以鼓励人们使用全局忽略(不幸的是,必须在每个客户端上设置它们),甚至使用hook-scripts预先拒绝拒绝文件类别。

答案 2 :(得分:7)

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

答案 3 :(得分:-2)

svn delete --keep-local <PATH> 

会做