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

Tim*_*ert 31 svn version-control

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

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

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

Col*_*ley 13

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

我们仍在使用svn 1.4,因此--keep-local选项不可用.但是你可以通过使用服务器路径和-m commit消息删除它来实现同样的目的.

所以在我的例子中,我意外地提交了一个名为nbproject的目录.这就是我们使用的IDE(NetBeans)的开发人员项目设置.我不想从每个人的工作副本中删除它,否则他们将丢失所有设置!但这就是诀窍.从父目录开始:

$ cd trunk
$ svn propedit svn:ignore .
Run Code Online (Sandbox Code Playgroud)

带来$ EDITOR

在自己的行上添加nbproject并保存

$ svn commit -m 'Ignore nbproject'
$ svn rm https://.../trunk/nbproject -m 'Remove nbproject from svn'
Run Code Online (Sandbox Code Playgroud)

  • 实际上,这不起作用.删除仍然传播.:( (3认同)

Red*_*yph 8

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

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

链接到相关文档.

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

svnadmin create repos_new
svnadmin dump repos | svndumpfilter exclude trunk/log4j.properties | svnadmin load repos_new
Run Code Online (Sandbox Code Playgroud)

由于它接触到服务器上的存储库,我想再次强调一下你应该采取预防措施(保留旧存储库).对于不那么讨厌的文件,Don提出的方法不那么激烈和优选.

为了避免这种情况,你可以svn:ignore在目录中设置相应的属性,你也可以鼓励人们使用全局忽略(不幸的是它们必须在每个客户端上设置),甚至使用钩子脚本来抢先拒绝类别文件.


Don*_*kby 7

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

  • @Tim:有时候成长需要一点痛苦. (2认同)