题
鉴于我做的案例 两个独立的变化 在 一 文件:例如。添加了一个新方法并更改了另一个方法。
我经常不想提交这两项更改,因为 一 提交,但作为 二 独立承诺。
在 git 存储库上我会使用 互动模式 的 git 添加(1) 来分割 猛男 分成更小的:
git add --patch
使用 Subversion 执行此操作的最简单方法是什么?(甚至可能使用 Eclipse 插件)
更新:
在 关于 Git 的事情, ,瑞安称之为: “纠结的工作副本问题。”
解决方案
使用 git-svn,您可以创建远程 SVN 存储库的本地 GIT 存储库,使用完整的 GIT 功能集(包括部分提交)来使用它,然后将其全部推送回 SVN 存储库。
其他提示
乌龟SVN 1.8 现在支持 这与它的“提交后恢复”功能。这允许您对文件进行编辑,并在提交后撤消所有编辑
根据文档:
仅提交与一个特定问题相关的文件部分:
- 在提交对话框中,右键单击文件,选择“提交后恢复”
- 编辑文件,例如乌龟合并:撤消您还不想提交的更改
- 保存文件
- 提交文件
我已经使用了这个方法 乌龟SVN.
内置的合并实用程序允许您显示存储库版本和工作副本之间的差异。
使用 创建备份 diff 实用程序的功能
- 提交您的文件,就像您要提交所有更改一样。
- 在提交窗口中,双击文件以显示差异。
- 在差异设置中,单击选项 备份原文件.
- 右键单击您不需要的更改,然后使用选择 使用其他文本块.
- 保存差异 正好一次. 。每次保存时都会覆盖备份。这就是为什么您只想保存一次。
- 提交更改。
- 使用创建的 .bak 文件覆盖原始文件(其中包含所有原始更改)。
- 提交您的文件。
您现在应该使用两次单独的提交来提交所有更改。
尝试使用 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
务必 svn up
并进行测试以确保一切正常。
从 v1.8 开始,使用 TortoiseSvn (Windows) 就可以实现这一点。
4.4.1.提交对话框
如果您的工作副本是最新的并且没有冲突,您就可以提交更改了。选择要提交的任何文件和/或文件夹,然后选择TortoisesVN→提交。
<剪断>
4.4.3.仅提交部分文件
有时您只想提交对文件所做的部分更改。这种情况通常会在您处理某些事情时会发生,但是需要进行紧急修复,并且该修复程序恰好在您正在处理的同一文件中。
右键单击该文件并使用上下文菜单→提交后恢复。这将按原样创建文件的副本。然后,您可以编辑文件,例如在TortoIsemerge和Undo中,您不想提出的所有更改。保存这些更改后,您可以提交文件。
提交完成后,文件的副本会自动恢复,并且您的所有修改都没有返回。
在Linux上,我会给 http://webstaff.itn.liu.se/~karlu20/div/blog/2013-05-31_SVNPartialCommit.php 尝试一下。不过我自己还没有尝试过。
我曾经这样做过:
- 在我的编辑器(我使用 vim)中,编辑文件,以便只出现其中一项更改
- 保存文件(但不要退出编辑器)
- 将修改后的文件提交到svn
- 在编辑器中点击“撤消”足够多次,第二组更改就会重新出现
- 再次保存文件
- 提交第二组更改。
这是一种简单化的方法,假设一组更改相当容易撤消。对于更复杂的情况,我会放弃并提交这两项更改而不用担心。
现在我使用了 git,我希望我再也不用做这样的事情了!
我使用本地 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 存储库并将您的提交同步到 svn 主服务器;以我有限的经验来看效果很好。
尝试 VisualSVN for Visual Studio. 。这 最新6.1版本 介绍 QuickCommit 功能。您可以使用新的方法部分提交文件中选定的更改 提交此块 和 提交选择 Visual Studio 编辑器中的上下文菜单命令。
- 在选择的编辑器中打开要拆分的所有文件
- 使用不同的工具集(在 Win 上,使用 Spike 的建议(旧版本))退出第二组
- 犯罪
- 返回到您选择的编辑器并保存所有文件
这比斯派克的完整建议风险更大,但更容易做到。还要确保您首先在其他内容上尝试它,因为某些编辑器将拒绝保存在其下已更改的文件,除非您重新加载该文件(丢失所有更改)
我认为比生成 diff 文件、恢复等更简单的选择是签出存储库的两个副本,并使用像 DeltaWalker 这样的可视化 diff 工具将块从一个副本复制到另一个副本。
第一个副本将是您实际工作的副本,第二个副本将仅用于此目的。一旦对第一个部分进行了大量更改,您可以将一个部分复制到第二个部分,提交它,复制另一个部分,提交它,等等。
- 将所有相关修改文件复制到备份副本。
- 使用创建工作状态的补丁
svn diff
. - 使用恢复文件
svn revert
. - 重新应用您想要提交的补丁部分,可以使用
patch
工具,或通过手动编辑,或其他方式。 - 跑步
diff
然后将您的工作副本与备份进行比较,以确保正确应用了补丁部分。 - 构建并测试。
- 犯罪。
- 将您的备份副本复制回您的存储库签出。
- 重复2。(不是1.!)直到完成。