Keywords: Subversion | File Ignoring | Version Control | svn:ignore | Global Configuration
Abstract: This article provides an in-depth analysis of file ignoring mechanisms in Subversion version control system, detailing three approaches: global-ignores configuration, svn:ignore property, and svn:global-ignores property. Through practical code examples, it demonstrates how to set recursive ignore patterns, view ignored file lists, and offers complete solutions with TortoiseSVN GUI operations. The article also covers filename pattern matching syntax and cross-platform compatibility considerations, providing comprehensive guidance for Subversion file management.
Overview of Subversion File Ignoring Mechanisms
In software development projects, it's often necessary to exclude certain files or directories from version control, such as temporary files generated during compilation, system cache files, or IDE configuration files. Subversion provides multiple mechanisms to implement file ignoring functionality, ensuring these files don't appear in version control status checks.
Detailed Analysis of Three File Ignoring Methods
Runtime Configuration Area - global-ignores Option
This is a client-specific setting that isn't shared with other users and applies to all repositories checked out on the current computer. The configuration is defined in the runtime configuration area file:
- Windows (file-based):
C:\Users\{username}\AppData\Roaming\Subversion\config - Windows (registry-based):
Software\Tigris.org\Subversion\Config\Miscellany\global-ignores - Linux/Unix:
~/.subversion/config
The advantage of this approach is simple configuration, but the drawback is that it's limited to the local environment and cannot be shared across teams.
svn:ignore Property
The svn:ignore property is set at the directory level, not the file level, and its configuration is stored in the repository, making it shareable with all team members. This property only affects immediate children of the current directory and doesn't recursively apply to subdirectories.
Example demonstration:
cd ~/myRepoRoot
echo "content" > "ignoreThis.txt"
svn status
# Output: ? ./ignoreThis.txt
# Description: File is not ignored
svn propset svn:ignore "ignoreThis.txt" .
svn status
# Output: 0 unversioned files
# Description: File is successfully ignored
cd subdirectory
echo "content" > "ignoreThis.txt"
svn status
# Output: ? ./subdirectory/ignoreThis.txt
# Description: File with same name in subdirectory is not ignored
To achieve recursive ignoring, use the --recursive parameter:
svn propset svn:ignore "*.class" . --recursive
It's important to note that property settings in subdirectories completely override parent directory settings; there's no additive effect.
svn:global-ignores Property
This is a new feature introduced in Subversion 1.8 that utilizes inherited properties functionality. Unlike svn:ignore, svn:global-ignores automatically applies to all subdirectories.
Comparative example:
cd ~/myRepoRoot
echo "content" > "ignoreThis.txt"
svn propset svn:global-ignores "ignoreThis.txt" .
svn status
# Output: 0 unversioned files
cd subdirectory
echo "content" > "ignoreThis.txt"
svn status
# Output: 0 unversioned files
# Description: File in subdirectory is also automatically ignored
Filename Pattern Matching Syntax
Subversion uses filename wildcard patterns to define ignore rules:
*: Matches any string of characters (including empty string)?: Matches any single character[abc]: Matches any one character enclosed in brackets[a-z]: Matches any character within the specified range
Pattern matching is case-sensitive, requiring attention to compatibility issues on Windows systems. For example, to ignore all .tmp files (case-insensitive), use: *.[Tt][Mm][Pp]
Viewing Ignored Files
By default, the svn status command doesn't display ignored files. To view all ignored files, use:
svn status --no-ignore | grep "^I"
Example output:
svn status
? foo.txt # Unversioned file
M modifiedFile.java # Modified versioned file
svn status --no-ignore
? foo.txt
I ignoreThis.txt # Ignored file
M modifiedFile.java
svn status --no-ignore | grep "^I"
I ignoreThis.txt # Only ignored files displayed
Multi-project Ignore Configuration Management
For scenarios requiring multiple file type ignores, it's recommended to use files to manage ignore pattern lists:
svn propset svn:ignore -R -F .svnignore .
Example .svnignore file content:
bin
gen
*.class
*.apk
Thumbs.db
.project
.classpath
This approach facilitates team sharing and version control of ignore configurations.
TortoiseSVN Graphical Interface Operations
In TortoiseSVN, file ignoring can be configured through the right-click context menu's "Ignore" option. The menu provides the following choices:
- Add: Ignore only the currently selected file
- Add (recursively): Ignore matching files in current directory and all subdirectories
- Add*: Ignore all files with the same extension
It's recommended for beginners to first understand the ignore mechanism principles through command line before using the graphical interface.
Property Management Commands
Subversion provides a series of property management commands:
- View property list:
svn proplist -v [path] - Delete ignore property:
svn propdel svn:ignore [path] - Recursive deletion:
svn propdel svn:ignore -R [path]
Important Considerations and Best Practices
- Versioned files cannot be ignored; they must first be removed from version control
- When ignoring directories, don't include slashes - use
bininstead ofbin/or/bin - Prioritize using svn:ignore or svn:global-ignores properties in team projects
- Use global ignore configuration for files specific to individual development environments
- Regularly review ignore lists to ensure important files aren't accidentally ignored
By properly configuring Subversion's file ignoring mechanisms, developers can significantly improve version control management efficiency and accuracy, reducing unnecessary distractions and focusing on core code version management.