修复已复制编辑文件的SVN血统关系
修复SVN文件复制血统并保留编辑内容的方法
别担心,这个问题其实有可行的解决办法,核心思路是先让SVN建立正确的复制关联,再把你的编辑内容套回去。分两种情况来处理:
情况1:还没提交这个新增的文件
如果只是在本地工作副本里新增了文件(还没执行svn commit),按以下步骤来:
- 第一步:先把你编辑好的文件备份到SVN工作副本之外的地方(比如桌面),避免后续操作丢失内容。
- 第二步:在SVN里移除这个新增文件的追踪状态,执行命令:
或者如果已经用svn revert your-new-file.extsvn add把它加入了追踪,就执行:
这一步是让SVN不再把它当作新增文件,但保留本地文件(不过我们已经备份了,也不用太担心)。svn delete --keep-local your-new-file.ext - 第三步:用SVN官方的复制命令创建带血统的文件,从原文件复制到目标文件名:
现在这个新文件就和原文件有了SVN认可的复制关联了。svn cp path/to/original-file.ext your-new-file.ext - 第四步:把你备份的编辑好的文件内容覆盖到这个刚创建的
your-new-file.ext里。 - 第五步:执行
svn status检查状态,你会看到这个文件显示为修改状态(因为是在复制基础上做了改动),最后提交即可:svn commit -m "Copy original file and apply custom edits"
情况2:已经提交了这个新增文件
要是你已经把新增的文件提交到仓库了,步骤稍微复杂一点,但同样能解决:
- 第一步:备份当前最新的编辑后的文件(如果还有未提交的修改,先备份;如果已经提交,也可以从工作副本里复制一份出来)。
- 第二步:删除仓库里的这个新增文件并提交:
svn delete your-new-file.ext svn commit -m "Temporarily remove the unlinked file to fix copy history" - 第三步:用SVN复制命令从原文件创建带血统的新文件(如果需要指定原文件的某个版本,比如你当初复制时的版本,可以加
@版本号):# 直接从当前版本的原文件复制 svn cp path/to/original-file.ext your-new-file.ext # 或者指定原文件的历史版本 svn cp path/to/original-file.ext@123 your-new-file.ext - 第四步:把备份的编辑内容覆盖到这个新创建的文件里。
- 第五步:提交修改,这次提交会显示文件是从原文件复制而来,同时包含你的所有编辑:
svn commit -m "Restore file with proper copy history and apply custom edits"
注意事项
- 操作前最好给整个工作副本做个备份,防止中间步骤出错导致内容丢失。
- 如果原文件之后也有修改,你可以根据需要用
svn merge把原文件的后续改动合并到这个新文件里,因为现在它们已经有了复制关联,合并会更顺畅。
内容的提问来源于stack exchange,提问作者Iconmaster




