从TFS克隆的Git仓库中移除大文件的技术咨询
TFS 迁移至 GitHub Enterprise (GHE) 问题解决方案
背景与问题
我的任务是将 Team Foundation Server (TFS) 仓库迁移至公司 GitHub Enterprise (GHE),且需完整保留变更日志。我使用 git-tfs 工具,通过命令:
git tfs clone --all --with-labels <server>:8080/tfs/ $/<branch>
将主源码分支克隆到本地,耗时约30小时,生成目录约45GB,其中 .git 子目录约6GB。尝试推送到 GHE 时因大文件报错,公司未启用且无计划启用 Large File Storage。
我已排查所有大于20MB的文件,执行 git rm 和 git commit -m 后,变更日志仍追踪大文件,推送依旧报错。调研后了解到 BFG Repo-cleaner 和 git-filter-repo 工具,但它们需要 --mirror 仓库副本,而 git-tfs 仅支持 --bare 选项,我不清楚两者差异,也不知道如何将无文件结构的镜像副本推送到 GHE。
领导给出的步骤:
- 使用
git-tfs clone将 TFS 克隆到本地 - 使用
git clone --mirror将本地副本克隆为第二个本地镜像副本 - 对第二个副本运行 BFG 或 git-filter-repo
- 后续步骤不明
我的疑问:
- 第二个镜像副本的 origin 是否仍指向 TFS?
- 是否需要将第二个本地副本推送到第一个本地副本,再推送到 GHE,因为第二个副本无文件结构?
- 如何审核变更日志以确认历史已保留?避免后续开发者找不到特定变更。
问题解答
1. 第二个镜像副本的 origin 是否仍指向 TFS?
不是。git clone --mirror 会将你第一个从 TFS 克隆来的本地仓库设为第二个镜像副本的 origin,而非原 TFS 服务器。你可以在镜像副本目录下执行 git remote -v 验证,输出会显示指向本地第一个仓库的路径。
2. 是否需要将第二个本地副本推送到第一个本地副本,再推送到 GHE?
不需要。镜像副本虽无工作目录,但可直接推送到 GHE,操作步骤如下:
- 在处理后的镜像副本中移除原
origin:git remote remove origin - 添加 GHE 仓库作为新远程:
git remote add origin <GHE仓库URL> - 强制推送所有分支和标签到 GHE(清理后的仓库历史已修改,需强制覆盖):
git push --mirror origin
额外补充 --bare 和 --mirror 的差异:
--bare仓库仅包含版本控制数据(即原仓库.git目录的内容),无工作目录,多用于服务器端共享仓库。--mirror是--bare的超集,除包含所有版本控制数据,还会镜像源仓库的所有分支、标签等引用,推送时会覆盖远程仓库的所有引用,适合完全复制仓库的场景。
3. 如何审核变更日志以确认历史已保留?
可以从以下几个维度验证:
- 分支与标签校验:在清理后的仓库(或 GHE 端)执行
git branch -a和git tag -l,确认原 TFS 的所有分支、标签都存在。 - 关键提交核查:挑选重要变更(如功能提交、bug修复),通过关键词或哈希搜索:
git log --grep="提交关键词" git show <提交哈希> - 文件历史验证:针对核心文件,查看其完整变更轨迹:
git log -- <文件路径> - 本地完整验证:从 GHE 克隆新的工作副本,对比文件内容和历史记录(除已移除的大文件外)是否与原 TFS 克隆仓库一致。
内容的提问来源于stack exchange,提问作者Paethgoat
相关产品推荐
相关产品推荐

