How do I ignore files in Subversion?
(This answer has been updated to match SVN 1.8 and 1.9's behaviour)
You have 2 questions:
Marking files as ignored:
By "ignored file" I mean the file won't appear in lists even as "unversioned": your SVN client will pretend the file doesn't exist at all in the filesystem.
Ignored files are specified by a "file pattern". The syntax and format of file patterns is explained in SVN's online documentation: http://svnbook.red-bean.com/nightly/en/svn.advanced.props.special.ignore.html "File Patterns in Subversion".
Subversion, as of version 1.8 (June 2013) and later, supports 3 different ways of specifying file patterns. Here's a summary with examples:
1 - Runtime Configuration Area - global-ignores
option:
- This is a client-side only setting, so your
global-ignores
list won't be shared by other users, and it applies to all repos you checkout onto your computer. - This setting is defined in your Runtime Configuration Area file:
- Windows (file-based) -
C:\Users\{you}\AppData\Roaming\Subversion\config
- Windows (registry-based) -
Software\Tigris.org\Subversion\Config\Miscellany\global-ignores
in bothHKLM
andHKCU
. - Linux/Unix -
~/.subversion/config
- Windows (file-based) -
2 - The svn:ignore
property, which is set on directories (not files):
- This is stored within the repo, so other users will have the same ignore files. Similar to how
.gitignore
works. -
svn:ignore
is applied to directories and is non-recursive or inherited. Any file or immediate subdirectory of the parent directory that matches the File Pattern will be excluded. -
While SVN 1.8 adds the concept of "inherited properties", the
svn:ignore
property itself is ignored in non-immediate descendant directories:cd ~/myRepoRoot # Open an existing repo. echo "foo" > "ignoreThis.txt" # Create a file called "ignoreThis.txt". svn status # Check to see if the file is ignored or not. > ? ./ignoreThis.txt > 1 unversioned file # ...it is NOT currently ignored. svn propset svn:ignore "ignoreThis.txt" . # Apply the svn:ignore property to the "myRepoRoot" directory. svn status > 0 unversioned files # ...but now the file is ignored! cd subdirectory # now open a subdirectory. echo "foo" > "ignoreThis.txt" # create another file named "ignoreThis.txt". svn status > ? ./subdirectory/ignoreThis.txt # ...and is is NOT ignored! > 1 unversioned file
(So the file
./subdirectory/ignoreThis
is not ignored, even though "ignoreThis.txt
" is applied on the.
repo root). -
Therefore, to apply an ignore list recursively you must use
svn propset svn:ignore <filePattern> . --recursive
.- This will create a copy of the property on every subdirectory.
- If the
<filePattern>
value is different in a child directory then the child's value completely overrides the parents, so there is no "additive" effect. - So if you change the
<filePattern>
on the root.
, then you must change it with--recursive
to overwrite it on the child and descendant directories.
-
I note that the command-line syntax is counter-intuitive.
- I started-off assuming that you would ignore a file in SVN by typing something like
svn ignore pathToFileToIgnore.txt
however this is not how SVN's ignore feature works.
- I started-off assuming that you would ignore a file in SVN by typing something like
3- The svn:global-ignores
property. Requires SVN 1.8 (June 2013):
- This is similar to
svn:ignore
, except it makes use of SVN 1.8's "inherited properties" feature. - Compare to
svn:ignore
, the file pattern is automatically applied in every descendant directory (not just immediate children).- This means that is unnecessary to set
svn:global-ignores
with the--recursive
flag, as inherited ignore file patterns are automatically applied as they're inherited.
- This means that is unnecessary to set
-
Running the same set of commands as in the previous example, but using
svn:global-ignores
instead:cd ~/myRepoRoot # Open an existing repo echo "foo" > "ignoreThis.txt" # Create a file called "ignoreThis.txt" svn status # Check to see if the file is ignored or not > ? ./ignoreThis.txt > 1 unversioned file # ...it is NOT currently ignored svn propset svn:global-ignores "ignoreThis.txt" . svn status > 0 unversioned files # ...but now the file is ignored! cd subdirectory # now open a subdirectory echo "foo" > "ignoreThis.txt" # create another file named "ignoreThis.txt" svn status > 0 unversioned files # the file is ignored here too!
For TortoiseSVN users:
This whole arrangement was confusing for me, because TortoiseSVN's terminology (as used in their Windows Explorer menu system) was initially misleading to me - I was unsure what the significance of the Ignore menu's "Add recursively", "Add *" and "Add " options. I hope this post explains how the Ignore feature ties-in to the SVN Properties feature. That said, I suggest using the command-line to set ignored files so you get a feel for how it works instead of using the GUI, and only using the GUI to manipulate properties after you're comfortable with the command-line.
Listing files that are ignored:
The command svn status
will hide ignored files (that is, files that match an RGA global-ignores
pattern, or match an immediate parent directory's svn:ignore
pattern or match any ancesor directory's svn:global-ignores
pattern.
Use the --no-ignore
option to see those files listed. Ignored files have a status of I
, then pipe the output to grep
to only show lines starting with "I".
The command is:
svn status --no-ignore | grep "^I"
For example:
svn status
> ? foo # An unversioned file
> M modifiedFile.txt # A versioned file that has been modified
svn status --no-ignore
> ? foo # An unversioned file
> I ignoreThis.txt # A file matching an svn:ignore pattern
> M modifiedFile.txt # A versioned file that has been modified
svn status --no-ignore | grep "^I"
> I ignoreThis.txt # A file matching an svn:ignore pattern
ta-da!
Use the following command to create a list not under version control files.
svn status | grep "^\?" | awk "{print \$2}" > ignoring.txt
Then edit the file to leave just the files you want actually to ignore. Then use this one to ignore the files listed in the file:
svn propset svn:ignore -F ignoring.txt .
Note the dot at the end of the line. It tells SVN that the property is being set on the current directory.
Delete the file:
rm ignoring.txt
Finally commit,
svn ci --message "ignoring some files"
You can then check which files are ignored via:
svn proplist -v
.gitignore like approach
You can ignore a file or directory like .gitignore. Just create a text file of list of directories/files you want to ignore and run the code below:
svn propset svn:ignore -F ignorelist.txt .
OR if you don't want to use a text file, you can do it like this:
svn propset svn:ignore "first
second
third" .
Source: Karsten's Blog - Set svn:ignore for multiple files from command line
If you are using TortoiseSVN, right-click on a file and then select TortoiseSVN / Add to ignore list. This will add the file/wildcard to the svn:ignore
property.
svn:ignore
will be checked when you are checking in files, and matching files will be ignored. I have the following ignore list for a Visual Studio .NET project:
bin obj
*.exe
*.dll
_ReSharper
*.pdb
*.suo
You can find this list in the context menu at TortoiseSVN / Properties.
As nobody seems to have mentioned it...
svn propedit svn:ignore .
Then edit the contents of the file to specify the patterns to ignore, exit the editor and you're all done.