SVN转Git迁移时将svn:externals属性保存至Git仓库文件
迁移含频繁变更externals的大型SVN仓库至Git并留存各版本externals配置
实现方案:基于git-svn的自定义提交过滤器
针对你的需求,最直接的方式是利用git svn的提交过滤器机制,在每个SVN版本转换为Git提交前,自动抓取对应版本的externals配置并写入仓库文件,同时处理空文件夹依赖。
1. 初始化git-svn仓库
先完成基础的SVN仓库克隆(根据你的仓库结构调整参数,非标准布局需替换--stdlayout):
git svn clone --stdlayout --no-metadata <你的SVN仓库地址> <目标Git仓库目录> cd <目标Git仓库目录>
2. 编写提交过滤脚本
创建可执行脚本inject_externals.sh,负责抓取当前SVN版本的externals配置并处理空文件夹:
#!/bin/bash # 获取当前转换对应的SVN版本号 SVN_REV=$(git svn find-rev $GIT_COMMIT) [ -z "$SVN_REV" ] && exit 0 # 抓取对应SVN版本的全量externals配置,写入根目录文件 svn propget svn:externals -R "<你的SVN仓库地址>@$SVN_REV" > "$GIT_WORK_DIR/current_svn_externals.txt" git add "$GIT_WORK_DIR/current_svn_externals.txt" # 给空文件夹添加.gitkeep,适配Git不支持空文件夹的特性 find "$GIT_WORK_DIR" -type d -empty | while read -r empty_dir; do touch "$empty_dir/.gitkeep" git add "$empty_dir/.gitkeep" done # 继续执行原提交流程 exit 0
给脚本添加执行权限:
chmod +x inject_externals.sh
3. 配置git-svn调用过滤器
让git-svn在每个版本转换为Git提交前执行上述脚本:
git config svn.commit-filter ./inject_externals.sh
4. 拉取所有SVN版本
执行拉取命令,所有版本会自动完成externals配置留存和空文件夹处理:
git svn fetch
如果之前已克隆过部分版本,改用git svn rebase更新剩余版本。
关键说明
- 生成的
current_svn_externals.txt会随每个Git提交同步更新,检出任意旧提交时,该文件即为对应SVN版本的externals配置。 - 脚本中的
<你的SVN仓库地址>需替换为实际的SVN仓库URL,确保能正常访问。 - 若仓库分支/标签结构特殊,需调整
git svn clone的参数(比如用-T指定trunk路径,-b指定branches路径等)。
内容的提问来源于stack exchange,提问作者iampierremonteux
相关产品推荐
相关产品推荐

