You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 11:18:13