以下是我能想到的场景以及如何解决它们(如果可能的话):
1) 文件已被复制并已提交修改(到其原始 URL)
1a) 如果分支还没有这些文件:
- svn-将文件(或它们的封闭目录)复制到分支(这将保留它们的历史记录)
- 如果主干中的这些特定文件没有其他更改,请将这些文件/封闭目录的主干恢复为复制之前的修订版
- 如果这些文件的主干中有更改,您仍然可以通过执行反向合并来获取属于分支的更改:除非某些更改重叠,否则这应该会成功
1b)如果分支确实已经有这些文件:
- svn-merge 主干的更改到分支
- 与 1a 中的主干考虑相同)
2)文件已被复制,已进行修改但尚未提交(到其原始 URL,因为副本没有更改)
注意:由于尚未提交修改,因此没有要保存的历史记录,也与主干无关
2a) 如果分支还没有这些文件:
- 制作复制错误的文件/目录的物理副本
- 从分支的工作副本中删除有问题的文件夹
- 将先前复制的文件/目录复制/移动到分支工作副本中的适当位置
- 将文件添加到分支
2b)如果分支确实已经有这些文件:
- 制作复制错误的文件/目录的物理副本
- 从分支的工作副本中删除有问题的文件夹
- 更新分支的工作副本
- 合并(*)先前复制的文件/目录与分支现在最新的工作副本中的对应文件
- 将文件添加到分支
(*) 对作业使用任何常规合并工具,例如 WinMerge
更新:在您编辑后,我更了解您的情况(以上假设在手动复制后,复制文件夹的 URL 仍指向主干)
您可以尝试svn propset --revprop -r <revision> snv:mergeinfo <updated mergeinfo>
在分支上使用(除非被 pre-revprop-change 钩子阻止)来“修复”合并信息,但我相信您也必须“修复”所有后续修订的合并信息,因为 svn 使用此信息其运营(例如合并);此外,由于后者,您必须非常小心更新的内容。
我认为,一个更好的选择是只更新不正确提交到分支的修订版的日志,以包括复制文件所引用的主干的修订版。这样,如果需要,信息是可用的,但不会有扰乱 svn 未来操作的风险。这种方法的最大缺点是,将分支合并回主干可能会产生一些必须解决的冲突(因为未更新合并信息)。执行此选项的命令是svn propset --revprop -r <revision> svn:log <updated log message>