使用SVN稀疏检出时补丁误删父文件夹问题排查
SVN稀疏检出移动文件后补丁误删目录问题分析
问题背景
为避免拉取完整trunk,采用SVN稀疏检出机制操作,项目名为ProjectK,目录结构如下:
AAA/BBB/CCC/DDD/abc.txt AAA/child1/child2/text12.txt AAA/child1/child2/text123.txt AAA/child111/child222/text123.txt KKK/JJJ/name.txt
需要将AAA/BBB/CCC/DDD/abc.txt移动至新文件夹EEE,操作步骤如下:
- 创建工作区拉取SVN主干最新代码
- STEP1:
svn co --depth empty svn+ssh://svn@url/ProjectK/trunk workspace123 - STEP2:
svn up --parents AAA/BBB/CCC/DDD # 输出: # A AAA # A AAA/BBB # A AAA/BBB/CCC # Updating 'AAA/BBB/CCC/DDD': # A AAA/BBB/CCC/DDD # A AAA/BBB/CCC/DDD/abc.txt - STEP3:执行SVN移动操作
svn mv abc.txt EEE # 输出: # A EEE/abc.txt # D abc.txt - STEP4:生成补丁文件
svn diff --patch-compatible > new_patch.patch - STEP5:应用补丁前拉取最新SVN主干
svn checkout --depth empty svn+ssh://url/ProjectK//trunk . svn up --parents AAA/BBB/CCC/DDD - STEP6:应用补丁
svn patch new_patch.patch # 输出: # D AAA/BBB/CCC/DDD/abc.txt # D AAA/BBB/CCC/DDD # D AAA/BBB/CCC # D AAA/BBB # D AAA # A AAA # A AAA/BBB # A AAA/BBB/CCC # A AAA/BBB/CCC/DDD # A AAA/BBB/CCC/DDD/EEE # A AAA/BBB/CCC/DDD/EEE/abc.txt
应用补丁后,AAA下的所有文件夹被删除,而非仅AAA/BBB/CCC/DDD,请问哪里操作错误?
错误原因及修正方案
错误原因
- 移动命令的路径上下文错误:执行
svn mv abc.txt EEE时,若未切换到AAA/BBB/CCC/DDD目录,该命令会被SVN解析为针对工作区根目录的操作。加上稀疏检出下AAA目录仅包含BBB路径,其他子目录(如child1、child111)在本地工作区不存在,svn diff会将这些未检出的子目录视为“被删除”,最终补丁包含删除整个AAA目录再重新创建的操作。 - 补丁生成未限定路径范围:直接执行
svn diff --patch-compatible > new_patch.patch会遍历整个工作区,把AAA目录下未检出的子目录变更也包含进补丁,导致应用补丁时误删整个AAA目录。
修正步骤
修正移动操作的路径:
先切换到目标文件所在目录再执行移动:cd AAA/BBB/CCC/DDD svn mv abc.txt EEE或使用工作区根目录的绝对路径执行移动:
svn mv AAA/BBB/CCC/DDD/abc.txt AAA/BBB/CCC/DDD/EEE生成补丁时限定路径:
只针对需要修改的AAA/BBB/CCC/DDD目录生成补丁,避免包含无关路径的变更:svn diff --patch-compatible AAA/BBB/CCC/DDD > new_patch.patch应用补丁时限定路径:
应用补丁时指定目标路径,确保仅修改DDD目录下的内容:svn patch new_patch.patch AAA/BBB/CCC/DDD
内容的提问来源于stack exchange,提问作者raj_acharya
相关产品推荐
相关产品推荐

