I want to commit all modified files except one using Subversion.
So here is the scenario:
$ svn st
M file1
M file2
M file3
M file4
I can do something like this:
svn ci -m "Commit 1" file1 file2 file3
svn ci -m "Commit 2" file4
But when a large number of files, I'm trying to simplify my work:
svn ci -m "Commit 1" `svn st | awk '{print $2}' | grep -v file4`
svn ci -m "Commit 2" file4
This solution is very fragile, because this scenario not works:
$ svn st
M file1
M file2
D file3
A + file4
I think that SVN does not have a built-in solution for my problem, but I'm not sure. Any other approach?
Option 1, AWK:
svn ci -m "Commit 1" `svn st | awk '{print $NF}' | grep -v file4`
svn ci -m "Commit 2" file4
Option 2, --targets:
svn ci -m "Commit 1" --targets filesToCommit.txt
svn ci -m "Commit 2" file4
Option 3, --changelist:
svn changelist my-changelist file1 file2 file3
svn ci -m "Commit 1" --changelist my-changelist
svn ci -m "Commit 2" file4
You can do it like this:
svn diff file4 > tmp.patch
svn revert file4
svn ci -m "Commit 1"
svn patch tmp.patch
At this point all files are commited except file4
Commiting all except one using changelists:
svn changelist my-list -R .
svn changelist --remove file4
svn ci -m "Commit 1" --changelist my-list
svn ci -m "Commit 2" file4
You can somewhat improve on your approach by adding your files with a script to a change list and committing it. You can inspect the list to make sure that it contains the right items before committing.
See svn changelist --help
and --changelist
option in svn ci --help
.
Although I'm sure you could work out a solution like you propose using a more complex awk
command line, since we're talking about just one file, why not
- Copy the file to a temporary location
svn revert
the modified file to get the original back
- Commit the whole repository
- Copy the modified file back
Simple, easy, fast.
Just commit filtered list of files.
svn ci `ls | grep -v file4`