How do I remove a file from svn versioning without deleting it from every working copy?

后端 未结 4 2234
别跟我提以往
别跟我提以往 2020-12-15 17:09

My situation is that a bunch of files are checked into svn which are very annoying to have under source control (specifically a log4j.properties file), and I wo

相关标签:
4条回答
  • 2020-12-15 17:21

    The secret is to make sure it's on the ignore list before you commit the delete. If you do it in that order, the delete won't propagate to others' working copies.

    We're still using svn 1.4 so the --keep-local option isn't available. But you can achieve the same thing by deleting it using a server path and a -m commit message.

    So in my example I accidentally committed a directory called nbproject. That is where developer project setting for the IDE we use (NetBeans). I didn't want to delete that from everyone's working copies or they'd lose all their settings! But this did the trick. Starting from the parent directory:

    $ cd trunk
    $ svn propedit svn:ignore .
    

    brings up $EDITOR

    add nbproject on its own line and save

    $ svn commit -m 'Ignore nbproject'
    $ svn rm https://.../trunk/nbproject -m 'Remove nbproject from svn'
    
    0 讨论(0)
  • 2020-12-15 17:22

    What I usually do in similar situations is to rename the repository copy of log4j.properties to log4j.properties.template or log4j.properties.default, and I add log4j.properties to the svn:ignore list. Then every user has to copy that file to log4j.properties in their working copy. To make it a little more friendly, you can put a check in your build script that prints out a reminder message if it doesn't find the local copy.

    0 讨论(0)
  • 2020-12-15 17:24

    If you really have a lot of such files, you can kill two birds with one stone by using a svndumpfilter operation. The idea is to make a dump of the repository on the server, filter out files you don't want to keep, and load the result in a new repository. Then you put the new one instead of the old one.

    This has to be done with care, when users don't access the repository obviously. But it will actually remove the files (interesting when they are big) instead of keeping them in the history. As a side-effect, the next time a user does an update, these files will be ignored as if they were never in the repository. We had to do that a few times to remove binaries that didn't have their place there.

    Link to the related documentation.

    Simple example (the command offers more flexibility of course):

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

    Since it touches to the repository on the server, I want to emphasize again that you should take precautions (keep your old repository). For not-so-annoying files the method proposed by Don is less drastic and preferable.

    To avoid this kind of situation, you can set the corresponding svn:ignore properties in the directories, you can also encourage people to use global ignores (they have to be set on each client unfortunately), or even use the hook-scripts to preemptively refuse categories of files.

    0 讨论(0)
  • 2020-12-15 17:34
    svn delete --keep-local <PATH> 
    

    will do

    0 讨论(0)
提交回复
热议问题