带有Subversion的部分提交
鉴于这种情况,我在一个文件中进行了两个独立的更改:添加了新方法并更改了另一种方法。
我通常不希望将两个更改都提交为一次提交,而要提交为两个独立的提交。
在git仓库上,我将使用git-add(1)的交互模式将大块拆分为较小的块:
git add --patch
用Subversion做到这一点最简单的方法是什么? (甚至使用Eclipse插件)
更新:
瑞安(Ryan)在《关于Git的事情》中称它为:纠结的工作副本问题。
解决方案
回答
我曾经这样做:
- 在我的编辑器(我使用vim)中,编辑文件,以便仅显示其中一项更改
- 保存文件(但不要退出编辑器)
- 将更改的文件提交到svn
- 在编辑器中按"撤消"足够多次,以重新出现第二组更改
- 再次保存文件
- 提交第二组更改。
这是一种简单的方法,假定一组更改相当容易撤消。对于更复杂的情况,我会放弃并提交两个更改,而不必担心。
现在,我使用git,这是我希望不再需要做的事情!
回答
我已经使用TortoiseSVN做到了。
内置的合并实用程序使我们可以显示存储库版本和工作副本之间的差异。
使用diff实用程序的创建备份功能
- 就像提交所有更改一样,提交文件。
- 在提交窗口中,双击文件以显示差异。
- 在差异设置中,单击选项以备份原始文件。
- 右键单击不需要的更改,然后使用选择使用其他文本块。
- 差异仅保存一次。每次保存时,备份将被覆盖。这就是为什么我们只想保存一次的原因。
- 提交更改。
- 用创建的.bak文件覆盖原始文件(将进行所有原始更改)。
- 提交文件。
现在,我们应该使用两个单独的提交来提交所有更改。
回答
我使用本地darcs存储库,或者只是逐渐合并更改。合并(opendiff打开Xcode附带的合并程序FileMerge;用我们喜欢的合并工具替换):
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 repo并将提交提交同步到svn主服务器;根据我有限的经验,效果很好。
回答
尝试使用svn diff> out.patch,然后将out.patch文件复制到out.patch.add和out.patch.modify。
仅当我们有可用的补丁程序文件时,才使用svn revert out.c
恢复原始文件。
手动编辑补丁文件,以便它们仅包含用于添加或者修改的块。使用patch
命令将它们应用于原始文件,测试添加是否有效,然后svn commit
添加。
重复冲洗" out.patch.modify"补丁。
如果更改是在文件中分开进行的,因为我们提出的第一个问题是添加了新方法,则更改了现有方法将可以使用
尽管我不认为我们应该有任何理由分开提交,但这是一个非常繁琐的解决方案。
我们还可能签出了同一来源的多个工作副本,以将工作应用于:
svn co http://location/repository methodAdd svn co http://location/repository methodModify
一定要"提高速度"并进行测试,以确保一切正常。
回答
使用git-svn可以创建远程SVN存储库的本地GIT存储库,使用完整的GIT功能集(包括部分提交)来使用它,然后将其全部推送回SVN存储库。
git-svn(1)
回答
- 在选择编辑器中打开要拆分的所有文件
- 使用不同的工具集(在Win上,使用Spike的建议(旧版本))退出第二组
- 犯罪
- 返回选择编辑器并保存所有文件
它比Spike的完整建议要冒险一些,但操作起来更容易。还要确保先尝试其他方法,因为某些编辑器将拒绝保存从其下更改而来的文件,除非我们重新加载该文件(丢失所有更改)