如何在Windows下合并本地Git与SVN仓库并标记已合并文件?
解决本地SVN副本改动合并到GitHub Fork仓库的Windows方案
听起来你遇到的场景挺典型的——手里有改好的SVN本地副本但没权限推回原SVN,同时已经Fork了对应的GitHub项目到本地Git仓库,要把两边的改动合起来还要标记完成。下面给你推荐几种适合Windows的工具和具体步骤:
一、首选工具组合
不管用命令行还是图形界面,这几个工具是必备的:
- Git for Windows:提供完整的Git命令行环境,也支持
git-svn(不过你的场景其实不需要用到git-svn连接远程SVN,后面会说原因) - TortoiseSVN + TortoiseGit:Windows下最流行的SVN/Git图形客户端,操作直观,适合不想敲命令的用户
- VS Code(可选):配合内置的Git插件和第三方SVN插件,可以在编辑器里直接对比、合并改动
二、具体操作步骤
方法1:补丁导入法(最简单直接)
这种方法适合快速把SVN的改动迁移到Git,不需要保留SVN的提交历史:
- 导出SVN改动为补丁文件
- 图形界面:右键你的SVN本地副本文件夹 → 选择
TortoiseSVN→Create patch,选择要导出的改动文件,保存为.patch格式 - 命令行(需安装SVN命令行工具):打开CMD/PowerShell进入SVN文件夹,执行
svn diff > svn_changes.patch
- 图形界面:右键你的SVN本地副本文件夹 → 选择
- 在Git仓库应用补丁
- 图形界面:右键你的本地Git仓库文件夹 →
TortoiseGit→Apply Patch,选择刚才生成的.patch文件,预览改动后点击应用 - 命令行:进入Git仓库目录,先执行
git apply --stat svn_changes.patch预览改动,确认没问题后执行git apply svn_changes.patch;如果有冲突,用git apply --reject svn_changes.patch,手动解决冲突后执行git add .
- 图形界面:右键你的本地Git仓库文件夹 →
- 提交并标记合并
- 提交时在信息里明确标注:比如
feat: 合并本地SVN副本的改动(文件A/B/C已完成合并) - 可以给这个提交打个标签:命令行执行
git tag -a svn-merged-v1 -m "标记SVN改动合并完成",再git push origin svn-merged-v1推到GitHub
- 提交时在信息里明确标注:比如
方法2:Git仓库合并法(保留SVN改动历史)
如果你想把SVN里的多次改动以Git提交的形式保留,用这种方法:
- 把本地SVN副本转为Git仓库
- 进入SVN文件夹,执行
git init,然后git add .,接着git commit -m "初始化导入本地SVN所有改动"
- 进入SVN文件夹,执行
- 关联到你的GitHub克隆仓库
- 进入你的本地Git仓库目录,执行
git remote add svn-local D:\path\to\your\svn\folder(替换成你的SVN文件夹路径)
- 进入你的本地Git仓库目录,执行
- 合并SVN改动到Git
- 执行
git fetch svn-local拉取SVN仓库的内容,然后git merge svn-local/main(如果SVN转Git后分支名不是main,替换成对应的分支名) - 解决冲突后,提交合并结果,同样可以打标签标记完成
- 执行
三、关于git-svn的说明
你提到的git-svn主要是用来克隆远程SVN仓库到Git,或者同步远程SVN的最新改动到Git,但你的场景是手里已经有本地SVN副本且没权限推回原SVN,所以完全不需要用git-svn去连接远程SVN仓库——用上面两种方法更高效,也避免了不必要的远程交互。
四、标记已合并文件的小技巧
如果需要给单个文件标记“已合并”,可以试试这些方法:
- 用Git Notes:执行
git notes add <文件名> -m "已从SVN合并完成",查看时用git notes show <文件名> - 在
.gitattributes里自定义标记:创建或修改仓库根目录的.gitattributes文件,添加*.txt merge=svn-merged(替换成你要标记的文件类型),不过这个需要配合自定义合并驱动,适合批量标记 - 提交信息里列清文件:在合并提交的信息里详细写出已合并的文件名,后续可以通过
git log --grep="已合并"快速查询
内容的提问来源于stack exchange,提问作者Siavoshkc
相关产品推荐
相关产品推荐

