Git仓库.tgz文件追踪异常及推送大文件GH001报错问题
解决两个Git大文件相关问题
问题1:push时提示存在.tgz文件,但本地未追踪找不到
这种情况通常是Git缓存或隐藏文件在搞鬼,试试这些步骤:
- 先检查是否有隐藏的.tgz文件:在终端执行
ls -la(Mac/Linux)或者dir /ah(Windows命令提示符),说不定文件被设置成隐藏属性了。 - 核对你的
.gitignore文件:确认里面有没有写*.tgz,有没有拼写错误,或者有没有被前面的!规则覆盖(比如之前写了!important.tgz,可能会导致忽略规则失效)。 - 清理Git缓存重新追踪:执行
git rm --cached -r .,然后git add .,最后git commit -m "Fix: clean untracked file cache"。这一步会让Git重新扫描所有文件,排除未被追踪的文件。 - 检查子模块:如果仓库里有子模块,子模块里的.tgz文件可能会被主仓库检测到,执行
git submodule status看看有没有嵌套的仓库,去子模块里排查。
问题2:被追踪的大.tgz文件找不到,push时触发GH001大文件错误
这个问题的核心是这个大文件还存在于Git的历史提交中,哪怕你现在删掉了,Git推送时会把所有历史对象都传上去,所以会触发大文件限制。解决步骤如下:
- 先定位大文件的位置:执行这条命令找出仓库里最大的文件及其关联的提交记录:
执行后会显示大文件的路径和对应的提交哈希,你就能知道它是在哪个提交里被加入的。git rev-list --objects --all | grep "$(git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -1 | awk '{print $1}')" - 彻底移除历史中的大文件(推荐用
git filter-repo,这是Git官方推荐的工具,比旧的filter-branch更安全):
这条命令会遍历所有提交,把所有.tgz文件从历史中移除。注意:执行前一定要备份你的仓库,因为修改历史是不可逆的操作。git filter-repo --path-glob '*.tgz' --invert-paths - 如果没有
git filter-repo,可以用BFG工具:下载后执行
然后执行清理命令:java -jar bfg.jar --delete-files *.tgzgit reflog expire --expire=now --all && git gc --prune=now --aggressive - 强制推送到远程仓库:因为修改了历史,所以需要强制推送(如果是团队协作,要提前告知其他成员同步修改后的仓库):
git push origin --force - 最后记得在
.gitignore里添加*.tgz,防止以后不小心再提交这类大文件。
内容的提问来源于stack exchange,提问作者Alexander Mills
相关产品推荐
相关产品推荐

