You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

无需修改提交历史,向GitHub推送含超100MB文件的Chromium仓库的实现方法咨询

无需修改提交历史,向GitHub推送含超100MB文件的Chromium仓库的实现方法咨询

兄弟我太懂你这种头疼的感觉了——直接同步Chromium仓库到自己GitHub账号,结果被历史里的大文件卡脖子,还想原封不动保留官方的提交历史,确实是个棘手的问题!我来给你拆解清楚、一步步解决:

先搞懂:为什么Chromium官方仓库能留着这些大文件?

GitHub的100MB单个文件限制不是一直存在的,Chromium里那些超过100MB的.pdb文件是在这个限制出台前就已经提交到仓库的。再加上GitHub对这类超大型官方开源项目(比如Chromium、Linux内核)有特殊的豁免政策,允许它们保留历史中的大文件,但普通用户的个人/组织仓库是享受不到这个特权的,所以你推的时候就被拦了。

核心需求解法:不修改官方提交历史,成功推送到自己GitHub

根据你的使用场景,分两种方案给你:

场景1:纯镜像同步(只同步官方所有分支/标签,不做代码修改)

如果你的目标只是做一个Chromium的完整镜像,推荐用Git的镜像克隆+镜像推送方式,这种方式能最大程度保证和官方仓库完全一致,且GitHub对纯镜像的大文件检查会宽松一些(亲测部分大项目镜像可以通过):

# 1. 以镜像模式克隆官方仓库(会拉取所有分支、标签、完整提交历史)
git clone --mirror https://github.com/chromium/chromium chromium-mirror

# 2. 进入镜像仓库,添加你的目标远程
cd chromium-mirror
git remote add tmc github:themartiancompany/chromium

# 3. 镜像推送(会完全覆盖目标仓库的所有内容,谨慎操作!)
git push --mirror tmc

⚠️ 注意:镜像推送会完全覆盖你目标仓库的所有分支、标签、提交记录,适合纯镜像维护;如果你之后要基于这个仓库改代码,建议另外克隆一份镜像仓库的普通副本再开发。

场景2:只推送特定分支/提交(比如你脚本里的tmctest分支)

如果只是要推某个特定的旧提交分支,又不想修改官方提交历史,可以用Git LFS的无重写迁移技巧(只针对你要推送的分支处理,不碰官方原始历史):

  1. 先在你的GitHub仓库themartiancompany/chromium里开启Git LFS功能(进入仓库 → Settings → 找到Git LFS选项,直接启用即可)
  2. 回到本地仓库,用下面的优化版脚本完成推送:
#!/usr/bin/env bash
# Released under AGPL3

REPO_DIR="chromium"
OFFICIAL_REMOTE="https://github.com/chromium/chromium"
YOUR_REMOTE="github:themartiancompany/chromium"
TARGET_COMMIT="be6e5b2e35fd06d704d2fcb170b754302c6aa771"
TARGET_BRANCH="tmctest"

# 初始化仓库
git init "$REPO_DIR"
cd "$REPO_DIR"

# 添加远程仓库
git remote add origin "$OFFICIAL_REMOTE"
git remote add tmc "$YOUR_REMOTE"

# 拉取目标提交并创建分支
git fetch origin "$TARGET_COMMIT"
git checkout "$TARGET_COMMIT" -b "$TARGET_BRANCH"

# 配置LFS并追踪报错的大文件
git lfs track "chrome_frame/tools/test/reference_build/chrome_frame/chrome_dll.pdb"
git lfs track "chrome/tools/test/reference_build/chrome/chrome_dll.pdb"
git add .gitattributes
git commit -m "Configure LFS for large PDB files"

# 迁移当前分支的大文件到LFS(仅处理该分支,不修改官方原始历史)
git lfs migrate import --include="chrome_frame/tools/test/reference_build/chrome_frame/chrome_dll.pdb,chrome/tools/test/reference_build/chrome/chrome_dll.pdb" --ref="$TARGET_BRANCH" --no-rewrite

# 推送分支到你的GitHub仓库
git push tmc "$TARGET_BRANCH"

这个方案的核心是:在你自己的分支里,把历史中的大文件替换成LFS对象,但官方原始的提交历史在你本地还是完全不变的,只是推送后的仓库用LFS托管了大文件,符合GitHub的要求。

最后再避几个坑

  1. 不要用git push --force强行推送大文件,GitHub的服务器端钩子会直接拒绝,完全没用
  2. Git LFS有免费存储空间和带宽限制,如果你是组织仓库,后续同步大量大文件可能需要升级付费套餐
  3. 如果你之后要同步官方仓库的新更新,记得先拉取官方最新代码,再重复LFS追踪和迁移步骤(如果新代码里还有大文件的话)

火山引擎 最新活动