如何仅推送Git中不超大小限制的文件?是否需单独提交?
没问题,完全可以只推送未超出大小限制的文件,不过具体操作得看你当前的提交状态——是已经把大文件和小文件混在同一个提交里了,还是还没提交任何更改?我分两种情况给你讲清楚:
情况1:大文件还没提交到本地仓库(仅在工作区/未被Git追踪)
这种场景最省心,直接只提交小文件就行:
- 先确认大文件的位置:可以用
git status查看未追踪的文件,或者用命令筛选大文件(比如找大于100M的):find . -type f -size +100M - 只添加符合要求的小文件:
- 方式一:逐个添加:
git add 小文件1 小文件2 ... - 方式二:添加所有文件但排除大文件:
git add . --exclude="大文件名"(如果有多个大文件,可以写多个--exclude参数)
- 方式一:逐个添加:
- 提交小文件:
git commit -m "提交符合仓库大小限制的文件" - 直接推送:
git push
情况2:大文件已经和小文件在同一个本地提交里
这种情况不能直接推送(因为Git会检查整个提交历史里的文件大小,只要有一个超标的就会失败),你需要修改提交,把大文件从提交中移除:
方法1:修改最近一次提交(如果大文件在最后一次提交里)
- 先把大文件从Git的追踪列表里移除(保留本地文件,只是不让Git管理它):
git rm --cached 大文件名 - 修改最后一次提交,把大文件从提交内容里删掉:
(git commit --amend --no-edit--no-edit是保留原来的提交信息,如果你想改提交说明,可以去掉这个参数) - 现在提交里就只有小文件了,直接推送:
git push
方法2:大文件在更早的提交里(用交互式rebase修改历史)
如果大文件是在之前的某个提交里,就得用交互式rebase来改写历史:
- 先通过
git log找到包含大文件的提交的前一个提交的哈希值(比如假设前一个提交是abc123) - 执行交互式rebase:
git rebase -i abc123 - 在弹出的编辑器里,把包含大文件的那行的
pick改成edit,保存并退出 - Git会停在那个需要修改的提交,执行命令移除大文件:
git rm --cached 大文件名 - 修改该提交:
git commit --amend --no-edit - 继续完成rebase:
git rebase --continue - 完成后推送(如果这个提交之前已经推送到远程仓库,需要用
git push --force,但要注意:如果是团队协作场景,一定要提前和队友沟通,避免覆盖别人的更改)
额外提醒
如果远程仓库设置了严格的大小限制,还要确保Git的整个提交历史里都没有大文件的痕迹(有时候大文件可能在更早的提交里,你没注意到)。如果需要彻底清理历史里的大文件,可以用 git filter-repo 工具,但这个操作会彻底改写历史,一定要谨慎操作,最好先备份本地仓库。
另外,绝对不要直接推送包含大文件的现有提交——因为推送时远程仓库会检查所有提交中的文件,只要有一个文件超出限制,整个推送就会失败,必须先把大文件从提交历史中移除才行。
内容的提问来源于stack exchange,提问作者cerebrou
相关产品推荐
相关产品推荐

