带有Subversion的部分提交


104

鉴于这种情况,我在一个文件中进行了两个独立的更改:添加了新方法并更改了另一种方法。

我通常不希望将两个更改都提交为一个提交,而是两个独立的提交。

在一个Git仓库我会使用交互模式混帐加(1)到拆分大块分成较小的:

 git add --patch

Subversion最简单的方法是什么?(甚至甚至可以使用Eclipse插件)

更新: Ryan
“关于Git的事情”中称其为“纠结的工作副本问题”。


您是在命令行上专门搜索解决方案吗?下面的许多响应都提到了TortoiseSVN“在提交后恢复”,这是仅Tortoise的功能-因此基于GUI和Windows。
florisla

Answers:


35

使用git-svn,您可以创建远程SVN存储库的本地GIT存储库,使用完整的GIT功能集(包括部分提交)来使用它,然后将其全部推送回SVN存储库。

git-svn(1)


25
在此解决方案中特别具有讽刺意味。
tuxayo

65

Tortoise SVN 1.8 现在支持 “提交后恢复”功能。这使您可以对文件进行编辑,并在提交后撤消所有编辑

根据文档:

只提交与一个特定问题相关的文件部分:

  1. 在提交对话框中,右键单击文件,选择“提交后还原”
  2. 在例如TortoiseMerge中编辑文件:撤消您尚未提交的更改
  3. 保存文件
  4. 提交文件

我不知道这是如何工作的。我检查了SVN 1.8发行说明,但无法确定“提交后还原”是基于哪个功能的。
DavidS

3
@DavidS这不是SVN的功能。这是TortoiseSVN的功能。
florisla

仅供参考,SVN 1.8从2018年4月起以EOL形式发布,发布时间为1.10
Greg K,

:我们也可以找到它的文档在这里tortoisesvn.net/docs/release/TortoiseSVN_en/...
纪尧姆Husta

42

我已经使用TortoiseSVN做到了这一点。

内置的合并实用程序允许您显示存储库版本和工作副本之间的差异。

使用diff实用程序的创建备份功能

  1. 就像提交所有更改一样,提交文件。
  2. 在提交窗口中,双击文件以显示差异。
  3. 在差异设置中,单击选项以备份原始文件
  4. 右键单击不需要的更改,然后使用select use other text block
  5. 仅将差异保存一次。每次保存时,备份将被覆盖。这就是为什么您只想保存一次的原因。
  6. 提交更改。
  7. 用创建的.bak文件覆盖原始文件(将进行所有原始更改)。
  8. 提交您的文件。

现在,您应该使用两个单独的提交来提交所有更改。


1
您是如何做到的?我会对学习该技术感兴趣。
Lasse V. Karlsen

如果这将在提交后自动用.bak文件覆盖,那就太好了。
BCS

我没有找到步骤3:使用Tortoise SVN 1.8.1的备份选项
sudhAnsu63 2013年

4
没关系。找到用于1.8 tortoisesvn.net/tsvn_1.8_releasenotes.html的核心对应链接。 只提交与一个特定问题相关的文件部分:在提交对话框中,右键单击文件,选择“提交后恢复”,编辑文件在例如TortoiseMerge中:撤消您不想提交的更改但保存文件提交文件
sudhAnsu63

可悲的是,这在Tortoise版本1.8.5中似乎不可用,“提交后恢复”也没有。
kajaco 2014年

24

尝试使用,svn diff > out.patch然后将out.patch文件复制到out.patch.addout.patch.modify

仅当您有可用的补丁程序文件时,才使用恢复原始文件svn revert out.c

手工编辑补丁文件,以便它们只包含了帅哥的添加或修改。使用patch命令将它们应用于原始文件,测试添加是否有效,然后测试svn commit添加。

重复冲洗out.patch.modify贴片。

如果您的第一个问题说的是文件中的更改是分开的-添加新方法,更改现有方法-这将起作用

这是一个非常繁琐的解决方案-尽管我不认为您应该有任何理由分开提交。

您还可能签出了同一来源的多个工作副本,以将您的工作应用于:

svn co http://location/repository methodAdd

svn co http://location/repository methodModify

请务必进行svn up测试以确保一切正常。


11

从v1.8开始,可以使用TortoiseSvn(Windows)进行此操作。

4.4.1。提交对话框

如果您的工作副本是最新的,并且没有冲突,则准备提交更改。选择要提交的任何文件和/或文件夹,然后选择TortoiseSVN→提交...。

<snip>

4.4.3。只提交部分文件

有时您只想提交对文件所做的部分更改。这种情况通常在您处理某些事情时发生,但随后需要提交紧急修复程序,而该修复程序恰好与您正在处理的文件位于同一文件中。

右键单击文件,然后使用上下文菜单→提交后还原。这将按原样创建文件的副本。然后,您可以编辑文件,例如在TortoiseMerge中,并撤消所有不想提交的更改。保存这些更改后,您可以提交文件。

提交完成后,该文件的副本将自动还原,并且您的文件中包含所有未提交的修改。

在Linux上,我可以尝试http://webstaff.itn.liu.se/~karlu20/div/blog/2013-05-31_SVNPartialCommit.php。不过,我自己还没有尝试过。


8

我曾经这样做:

  • 在我的编辑器(我使用vim)中,编辑文件,以便仅显示其中一项更改
  • 保存文件(但不要退出编辑器)
  • 将更改的文件提交到svn
  • 在编辑器中按“撤消”足够的时间,以便第二组更改重新出现
  • 再次保存文件
  • 提交第二组更改。

这是一种简单化的方法,假定一组更改相当容易撤消。对于更复杂的情况,我会放弃并提交这两个更改而不必担心。

现在,我使用git,这是我希望不再需要做的事情!


4

我使用本地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主服务器;根据我有限的经验,效果很好。


9
回复:“为什么要等那么久?” 您整天进行大量的重构,而老板在午餐前就放出了一些“修复此问题”。
BCS


2
  1. 在选择器中打开要拆分的所有文件
  2. 使用其他工具集(在Win上,使用Spike的建议(旧版本))退出第二组
  3. 承诺
  4. 返回您的选择编辑器并保存所有文件

它比Spike的完整建议要冒险一些,但操作起来更容易。还要确保先尝试其他方法,因为某些编辑器将拒绝保存从其下更改而来的文件,除非您重新加载该文件(丢失所有更改)


0

我认为比生成差异文件,还原等更容易的选择是检出存储库的两个副本,并使用可视差异工具(如DeltaWalker)将块从一个复制到另一个。

第一个副本将是您实际使用的副本,第二个副本将仅用于此目的。对第一部分进行大量修改后,您可以将一个部分复制到第二个部分,然后提交,复制另一个部分,提交等等。


0
  1. 将所有相关的修改文件复制到备份副本。
  2. 使用创建工作状态补丁svn diff
  3. 使用恢复文件svn revert
  4. 使用patch工具或通过手动编辑等方式重新应用希望提交的补丁程序部分。
  5. diff然后运行以将工作副本与备份进行比较,以确保正确应用了修补程序部分。
  6. 构建和测试。
  7. 承诺。
  8. 将您的备份副本复制回存储库签出中。
  9. 重复2。(而不是1.!)直到完成。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.