Partial Commits with Subversion

2019-01-06 09:00发布

Given the case I made two independent changes in one file: eg. added a new method and changed another method.

I often don't want to commit both changes as one commit, but as two independent commits.

On a git repository I would use the Interactive Mode of git-add(1) to split the hunk into smaller ones:

 git add --patch

What's the easiest way to do this with Subversion? (Maybe even using an Eclipse plug-in)

Update:
In The Thing About Git, Ryan calls it: “The Tangled Working Copy Problem.”

标签: svn git
11条回答
兄弟一词,经得起流年.
2楼-- · 2019-01-06 09:37

Try using svn diff > out.patch then copy the out.patch file to out.patch.add and out.patch.modify

Only when you have a working patch file revert the original file using svn revert out.c.

Edit the patch files by hand so that they only contain the hunks for adding or modifying. Apply them to the original file using the patch command, test if the addition worked, then svn commit the addition.

Wash rinse repeat for the out.patch.modify patch.

If the changes are separate in the file as your initial question stated - added a new method, changed an existing method - this will work

This is a very tedious solution - although I'm not convinced you should have any reason to separate your commits.

You also could have checked out multiple working copies of the same source to apply your work against:

svn co http://location/repository methodAdd

svn co http://location/repository methodModify

Be sure to svn up and test to make sure all is well.

查看更多
该账号已被封号
3楼-- · 2019-01-06 09:40

I think an easier option than generating diff files, reverting, etc, would be to have two copies of the repository checked out, and use a visual diff tool like DeltaWalker to copy hunks from one to the other.

The first copy would be the one you actually work off of, and the second would just be for this purpose. Once you've made a ton of changes to the first, you can copy one section over to the second, commit it, copy another section, commit it, etc.

查看更多
家丑人穷心不美
4楼-- · 2019-01-06 09:45

This is possible using TortoiseSvn (Windows) since v1.8.

4.4.1. The Commit Dialog

If your working copy is up to date and there are no conflicts, you are ready to commit your changes. Select any file and/or folders you want to commit, then TortoiseSVN → Commit....

<snip>

4.4.3. Commit only parts of files

Sometimes you want to only commit parts of the changes you made to a file. Such a situation usually happens when you're working on something but then an urgent fix needs to be committed, and that fix happens to be in the same file you're working on.

right click on the file and use Context Menu → Restore after commit. This will create a copy of the file as it is. Then you can edit the file, e.g. in TortoiseMerge and undo all the changes you don't want to commit. After saving those changes you can commit the file.

After the commit is done, the copy of the file is restored automatically, and you have the file with all your modifications that were not committed back.

On Linux, I would give http://webstaff.itn.liu.se/~karlu20/div/blog/2013-05-31_SVNPartialCommit.php a try. Haven't tried it out myself, though.

查看更多
【Aperson】
5楼-- · 2019-01-06 09:46
  1. Copy all modified files concerned to back-up copies.
  2. Create a patch of the working state using svn diff.
  3. Revert the files using svn revert.
  4. Re-apply the parts of the patch which you wish to commit, either using the patch tool, or by manual editing, or whatever.
  5. Run diff afterwards to compare your working copy with your back-up to be sure you applied the patch-parts correctly.
  6. Build and test.
  7. Commit.
  8. Copy your back-up copies back to your repository check-out.
  9. Repeat at 2. (not at 1.!) until done.
查看更多
混吃等死
6楼-- · 2019-01-06 09:53
  1. Open all the files you want to split in editor-of-choice
  2. Using a different tool set (on Win, use Spike's suggestion (the old version)) back out the second set
  3. Commit
  4. go back to your editor-of-choice and save all the files

It's a little riskier than Spike's full suggestion but can be easier to do. Also make sure you try it on something else first as some editors will refuse to save over a file that has changed out from under them unless you reload that file (losing all your changes)

查看更多
登录 后发表回答