无法将main分支已提交的本地代码推送到GitHub远程仓库
问题根因
- 你配置的
.gitignore规则仅对未被Git纳入版本追踪的文件生效,node_modules目录下的文件(包括触发大小限制的.pack缓存文件)在你添加忽略规则前就已经被提交到本地Git提交历史中,因此忽略规则不会生效,推送时Git仍会尝试上传历史中记录的大文件。 - 你的Git LFS配置存在逻辑错误:
node_modules是依赖安装目录,本身就不应该提交到仓库,完全不需要用LFS跟踪;且你是在大文件写入提交历史后才配置LFS,LFS不会自动替换历史中已存在的大文件,无法解决推送拦截问题。另外你将所有.js文件都配置为LFS跟踪属于错误操作,会导致普通源码文件被不必要地占用LFS存储配额。
解决步骤
- 清理Git缓存中已被追踪的node_modules文件,让.gitignore规则真正生效
执行以下命令从Git版本追踪中移除node_modules目录(操作不会删除你本地的实际文件):git rm -r --cached node_modules git rm -r --cached client/node_modules - 修正
.gitignore文件,删除冗余错误配置,替换为如下规则:# 依赖目录(匹配所有层级下的node_modules) node_modules/ **/node_modules/ # 环境变量文件 .env .env.local .env.*.local # 缓存、构建产物、日志 .eslintcache .cache/ dist/ build/ npm-debug.log* yarn-debug.log* yarn-error.log* # 系统生成文件 .DS_Store Thumbs.db # 其他临时文件 *.nc - 修正LFS配置文件
.gitattributes,删除错误的.js、.pack跟踪规则,仅保留真正需要入库的大文件类型规则:# 仅将必须入库的大体积资源配置为LFS跟踪,不要跟踪依赖、缓存类可自动生成的文件 *.nc filter=lfs diff=lfs merge=lfs -text *.csv filter=lfs diff=lfs merge=lfs -text # 若有需要入库的大体积设计稿、音视频等资源,可在此追加对应规则,例如 # *.psd filter=lfs diff=lfs merge=lfs -text # *.mp4 filter=lfs diff=lfs merge=lfs -text - 清理本地Git提交历史中残留的大文件记录:
如果你是首次推送,本地提交都未同步过远程,执行以下命令重置提交记录即可(代码改动不会丢失):
如果执行上述命令提示找不到git reset --soft HEAD~$(git rev-list --count HEAD ^origin/main)origin/main引用,说明还未完成过首次远程关联,直接执行git update-ref -d HEAD即可清空本地错误提交记录,所有代码改动会保留在工作区。
如果你之前已经成功推送过代码,仅本次提交带了大文件,先通过git log找到引入大文件之前的正常提交哈希,执行git reset --soft <正常提交的哈希值>即可。 - 重新提交改动并推送:
git add . git commit -m "chore: 移除误提交的node_modules目录,修正gitignore与LFS配置" git push origin main
注意事项
- 永远不要将
node_modules、构建缓存目录(.cache/dist/build)提交到Git仓库,这类文件可以通过依赖安装、构建命令自动生成,提交只会导致仓库体积异常膨胀,触发大小限制。 - Git LFS仅用于跟踪必须入库的大体积资源(如设计稿、数据集、音视频素材),不要用来跟踪可自动生成的依赖、缓存文件,避免浪费存储配额。
- 配置
.gitignore前如果对应文件已经被Git追踪,必须先执行git rm --cached <文件/目录路径>移除追踪,否则忽略规则不会生效。
内容的提问来源于stack exchange,提问作者penguinz0
相关产品推荐
相关产品推荐

