问题
With the svn:ignore property, is there a way I can specify what I want to ignore based on patterns which I don't want to ignore? In other words, I want to ignore everything but files ending in .xyz. How would I go about doing that (if it's even possible)?
One option I've explored is committing everything I want to be versioned, then setting the svn:ignore property on the directory to be '*', thus meaning no other files but what I've already committed will be versioned. This is the best I can come up with, but it feels dirty in that if I ever did need to add another file to be version, I'd have to make multiple commits... one to remove the svn:ignore property, another to add/commit the new file(s), and then a third to change svn:ignore back to '*'.
Your thoughts?
回答1:
No, there is no exclusive matching like you described. This article lists the possibilities for pattern matching. It's limited to:
?
- Matches any single character*
- Matches any string of characters, including the empty string[
- Begins a character class definition terminated by]
, used for matching a subset of characters
A similar question was asked already here.
回答2:
Have a look at http://www.thoughtspark.org/node/38. Obviously you can use "!" in character groups to negate its meaning. So if you want to ignore everything except files ending with .java, set the following pattern to svn:ignore:
*[!j][!a][!v][!a]
*.java?*
回答3:
That's the only solution I know of. You can explicitly add files even if they are ignored though.
You would need to add that setting on all subdirectories though.
# Create a repository with property ignore *
[wlynch@orange ~] cd /tmp
[wlynch@orange /tmp] svnadmin create foo
[wlynch@orange /tmp] svn co file:///tmp/foo co
Checked out revision 0.
[wlynch@orange /tmp] cd co
[wlynch@orange co] svn propset svn:ignore \* .
property 'svn:ignore' set on '.'
# Create 3 files
[wlynch@orange co] touch a
[wlynch@orange co] touch b
[wlynch@orange co] touch c
# We can add all 3 of these files in one transaction
[wlynch@orange co] svn status
M .
[wlynch@orange co] svn add a
A a
[wlynch@orange co] svn add b
A b
[wlynch@orange co] svn status
M .
A a
A b
[wlynch@orange co] svn add c
A c
[wlynch@orange co] svn ci
Sending .
Adding a
Adding b
Adding c
Transmitting file data ...
Committed revision 1.
回答4:
This is what I have set on bin
folder for svn:ignore
property to match everything except apk files:
*[!a][!p][!k]
*a[!p][!k]
*ap[!k]
If there would be full RegExp support you could use negative lookbehind, but that's rarely implemented anyway (e.g not in JavaScript) and is inefficient.
回答5:
The following works for me and gets rid of a few quirks of the other suggestions.
*.?
*.??
*.???
*.[!j]???
*.?[!a]??
*.??[!v]?
*.???[!a]
*.?????*
A line by line explanation follows:
- ignore everything that has a one-letter extension
- ignore everything that has a two-letter extension
- ignore everything that has a three-letter extension
- ignore everything that has a four-letter extension where the extension's first letter is not j
- ignore everything that has a four-letter extension where the extension's second letter is not a
- ignore everything that has a four-letter extension where the extension's third letter is not v
- ignore everything that has a four-letter extension where the extension's fourth letter is not a
- ignore everything that has a five-letter extension or more
Limitations:
- This will also block directories that end on .java
- Unfortunately I was not able to ignore files without extension, since that would also block directories.
回答6:
Well, I don't know if I miss something, but you can use any pattern you want:
svn propset svn:ignore "*~" .
You can check with:
svn propget svn:ignore .
Another way is to use an alias / script that can do complex parsing when committing.
The best solution I find to use myself is to completely separate the versioned tree of source files from the build tree. This way you do not generate things in your versioned tree of a directory. Then you can only use svn:ignore
to ignore simple artefacts generated by text editors for example.
EDIT:
Sorry my mistake for the first solution, I have misread your post. The two other ways seems relevant even if not exactly what you want...
来源:https://stackoverflow.com/questions/1137761/using-svnignore-to-ignore-everything-but-certain-files