SVN: Is there a way to mark a file as “do not commit”?

Subversion does not have a built-in “do not commit”https://stackoverflow.com/”ignore on commit” feature, as of February 2016 / version 1.9. This answer is a non-ideal command-line workaround

As the OP states, TortoiseSVN has a built in changelist, “ignore-on-commit”, which is automatically excluded from commits. The command-line client does not have this, so you need to use multiple changelists to accomplish this same behavior (with caveats):

  • one for work you want to commit [work]
  • one for things you want to ignore [ignore-on-commit]

Since there’s precedent with TortoiseSVN, I use “ignore-on-commit” in my examples for the files I don’t want to commit. I’ll use “work” for the files I do, but you could pick any name you wanted.

First, add all files to a changelist named “work”. This must be run from the root of your working copy:

svn cl work . -R

This will add all files in the working copy recursively to the changelist named “work”. There is a disadvantage to this – as new files are added to the working copy, you’ll need to specifically add the new files or they won’t be included. Second, if you have to run this again you’ll then need to re-add all of your “ignore-on-commit” files again. Not ideal – you could start maintaining your own ‘ignore’ list in a file as others have done.

Then, for the files you want to exclude:

svn cl ignore-on-commit path\to\file-to-ignore

Because files can only be in one changelist, running this addition after your previous “work” add will remove the file you want to ignore from the “work” changelist and put it in the “ignore-on-commit” changelist.

When you’re ready to commit your modified files you do wish to commit, you’d then simply add “–cl work” to your commit:

svn commit --cl work -m "message"

Here’s what a simple example looks like on my machine:

D:\workspace\trunk>svn cl work . -R
Skipped '.'
Skipped 'src'
Skipped 'src\conf'
A [work] src\conf\db.properties
Skipped 'src\java'
Skipped 'src\java\com'
Skipped 'src\java\com\corp'
Skipped 'src\java\com\corp\sample'
A [work] src\java\com\corp\sample\Main.java
Skipped 'src\java\com\corp\sample\controller'
A [work] src\java\com\corp\sample\controller\Controller.java
Skipped 'src\java\com\corp\sample\model'
A [work] src\java\com\corp\sample\model\Model.java
Skipped 'src\java\com\corp\sample\view'
A [work] src\java\com\corp\sample\view\View.java
Skipped 'src\resource'
A [work] src\resource\icon.ico
Skipped 'src\test'

D:\workspace\trunk>svn cl ignore-on-commit src\conf\db.properties
D [work] src\conf\db.properties
A [ignore-on-commit] src\conf\db.properties

D:\workspace\trunk>svn status

--- Changelist 'work':
        src\java\com\corp\sample\Main.java
        src\java\com\corp\sample\controller\Controller.java
        src\java\com\corp\sample\model\Model.java
M       src\java\com\corp\sample\view\View.java
        src\resource\icon.ico

--- Changelist 'ignore-on-commit':
M       src\conf\db.properties

D:\workspace\trunk>svn commit --cl work -m "fixed refresh issue"
Sending        src\java\com\corp\sample\view\View.java
Transmitting file data .done
Committing transaction...
Committed revision 9.

An alternative would be to simply add every file you wish to commit to a ‘work’ changelist, and not even maintain an ignore list, but this is a lot of work, too. Really, the only simple, ideal solution is if/when this gets implemented in SVN itself. There’s a longstanding issue about this in the Subversion issue tracker, SVN-2858, in the event this changes in the future.

Leave a Comment