部分提交Subversion
鉴于这种情况,我在一个文件中做了两个独立的更改 :例如。 增加了一个新的方法,改变了另一种方法
我经常不想把这两个改变作为一个提交,而是作为两个独立的提交。
在git仓库上,我会使用git-add(1)的交互模式将大块分成更小的块:
git add --patch
用Subversion做这个最简单的方法是什么? (甚至可能使用Eclipse插件)
更新:
在“关于Git的事情”中 ,Ryan称之为“纠结的工作拷贝问题”。
使用git-svn,你可以创build远程SVN仓库的本地GIT仓库,使用完整的GITfunction集(包括部分提交)处理它,然后将其全部推回到SVN仓库。
git-svn(1)
龟SVN 1.8现在支持这个“提交后恢复”function。 这允许您对文件进行编辑,并在提交之后撤消所有编辑
根据文档:
仅提交与某个特定问题相关的文件部分:
- 在提交对话框中,右键单击文件,select“提交后恢复”
- 编辑例如TortoiseMerge中的文件:撤消您不想提交的更改
- 保存文件
- 提交文件
我用TortoiseSVN做了这个。
内置的合并实用程序允许您在存储库版本和工作副本之间显示差异。
使用diff实用程序的创build备份function
- 转到提交您的文件,就好像您要提交所有更改一样。
- 在提交窗口中,双击该文件以显示差异。
- 在差异设置中,单击选项备份原始文件 。
- 右键单击不需要的更改,然后使用select 使用其他文本块 。
- 保存差异一次 。 每次保存时,备份将被覆盖。 这就是为什么你只想保存一次。
- 提交更改。
- 使用创build的.bak文件覆盖原始文件(这将包含所有原始更改)。
- 提交你的文件。
您现在应该已经完成所有更改,使用两个单独的提交。
尝试使用svn diff > out.patch
然后将out.patch
文件复制到out.patch.add
和out.patch.modify
只有当你有一个工作补丁文件使用svn revert out.c
恢复原始文件。
手动编辑补丁文件,使其只包含用于添加或修改的区块 。 使用patch
命令将它们应用到原始文件,testing添加是否工作,然后svn commit
添加。
洗涤冲洗重复out.patch.modify
修补程序。
如果文件中的更改与您最初提出的问题是分开的 – 添加了新方法,则更改现有方法 – 这将起作用
这是一个非常乏味的解决scheme – 虽然我不相信你应该有任何理由分开你的提交。
您也可以检出同一来源的多个工作副本,以将您的工作应用于:
svn co http://location/repository methodAdd
svn co http://location/repository methodModify
一定要检查一下,确保一切正常。
从v1.8开始,可以使用TortoiseSvn(Windows)。
4.4.1。 提交对话框
如果您的工作副本是最新的并且没有冲突,则您已准备好提交更改。 select你想提交的任何文件和/或文件夹,然后TortoiseSVN→提交….
<剪断>
4.4.3。 只提交部分文件
有时您只想提交对文件所做的部分更改。 这种情况通常发生在你正在做某事的时候,但是紧急的修复需要被提交,而修复恰好在你正在处理的同一个文件中。
右键单击该文件并使用上下文菜单→提交后恢复。 这将创build一个文件的副本。 然后你可以编辑这个文件,例如在TortoiseMerge中,撤消所有你不想提交的改变。 保存这些更改后,您可以提交该文件。
提交完成后,文件的副本将自动恢复,并且具有所有未提交的修改的文件。
在Linux上,我会尝试http://webstaff.itn.liu.se/~karlu20/div/blog/2013-05-31_SVNPartialCommit.php 。 不过,我自己并没有尝试过。
我曾经这样做过:
- 在我的编辑器(我使用vim)中,编辑文件,以便只出现其中一个变化
- 保存文件(但不要退出编辑器)
- 将更改的文件提交到svn
- 在编辑器中点击“撤消”足够多的时间来重新显示第二组更改
- 再次保存该文件
- 提交第二组更改。
这是一个简单的方法,假设一组更改相当容易撤消。 对于更复杂的情况,我会放弃和承诺这两个变化,而不用担心。
现在我使用git,这是我希望我永远不会再做的事情!
我使用本地darcs回购,或者只是逐步合并更改。 合并(opendiff打开FileMerge,一个Xcode自带的合并程序;用你最喜欢的合并工具replace):
cp file file.new svn revert file opendiff file.new file -merge file
合并相关更改,保存合并,退出合并程序
svn ci -m 'first hunk' file mv file.new file svn ci -m 'second hunk' file
如果文件中有不止一个不相关的块,冲洗并重复(但为什么你会等待很久才提交?!)
另外,如果你知道git,你可以使用git-svn来维护一个本地git仓库,并将你的提交同步到一个svn主服务器; 在我有限的经验中工作很棒。
- 打开您想要在select编辑器中分割的所有文件
- 使用不同的工具集(Win上,使用Spike的build议(旧版本))退出第二套
- 承诺
- 回到你select的编辑器并保存所有的文件
这比Spike的全面build议稍微有些风险,但可以更容易做到。 另外请确保先尝试一下其他的东西,因为有些编辑会拒绝保存已经从它们下面改变过来的文件,除非你重新加载该文件(丢失所有的改变)
我认为比生成差异文件,还原等更容易的select是将版本库的两个副本签出,并使用像DeltaWalker这样的可视化差异工具将hunk从一个拷贝到另一个拷贝。
第一个副本是你实际工作的副本,第二个副本只是为了这个目的。 一旦你对第一个做了大量的改变,你可以复制一个部分到第二个部分,提交它,复制另一个部分,提交它等等。
- 将所有相关修改的文件复制到备份副本。
- 使用
svn diff
创build一个工作状态的补丁。 - 使用
svn revert
文件。 - 重新应用你想要提交的补丁的部分,无论是使用
patch
工具,或手动编辑,或任何。 - 之后运行
diff
比较您的工作副本与您的备份,以确保您正确应用补丁部分。 - build立和testing。
- 承诺。
- 将您的备份副本复制回您的存储库检出。
- 重复2.(不在1.!),直到完成。