我的情况是在svn中检查了一堆文件,这些文件在源代码控制下非常烦人(特别是log4j.properties
文件),我想从版本控制中删除它们。我已经知道如何在我自己的本地工作副本中从svn版本控制中删除文件,如this question和this one,但这不是我正在寻找的。 p>
问题是,一旦我用svn rm --keep-local
删除文件,当其他每个用户从存储库中撤出时,log4j.properties
的本地副本将消失,其环境将崩溃。我想要做的是从存储库中的版本控制中删除该文件,但也使其成为当其他人从存储库中拉出时,就好像他们在自己的机器上使用--keep-local
一样,这样他们的log4j.properties
文件的现有副本仍然存在,但变得无法使用。
这甚至可以吗?我怀疑这是svn没有的功能。
答案 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.template
或log4j.properties.default
,并将log4j.properties
添加到svn:ignore
名单。然后,每个用户都必须将该文件复制到其工作副本中的log4j.properties
。为了使它更友好,您可以检查构建脚本,如果找不到本地副本,则会打印出提醒消息。
答案 3 :(得分:-2)
svn delete --keep-local <PATH>
会做