美文网首页
.git提交记录中有大文件,推送到远程分支失败

.git提交记录中有大文件,推送到远程分支失败

作者: iLeooooo | 来源:发表于2021-11-19 11:38 被阅读0次

今天在迁移仓库的时候,更换了远程地址,使用命令推送到新的仓库的时候一直报失败,解决办法记录如下:

报错

第一步:可以在.git文件夹里面查看到objects/pack里的文件很大;

Git 维护着一个微型的文件系统,其中的文件也被称作数据对象。所有的数据对象均存储于项目下面的 .git/objects中。

也就是说,只要我有一次将一个大文件误提交了,那么即使我后面把它删除了,但是,实际上在.git中,这个文件还是存在的,虽然我们可能再也不需要他了,但是他还在那里默默的存在着。。。

Git与大部分版本控制系统的差别是很大的,比如Subversion、CVS、Perforce、Mercurial 等等,使用的是“增量文件系统” (Delta Storage systems), 就是说它们存储每次提交(commit)之间的差异。Git正好与之相反,它会把你的每次提交的文件的全部内容(snapshot)都会记录下来。这会是在使用Git时的一个很重要的理念。

第二步: 查看哪些历史提交过文件占用空间较大

// 使用以下命令可以查看占用空间最多的五个文件:
git rev-list --objects --all | grep "$(git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -5 | awk '{print$1}')"
// 说明
rev-list命令用来列出Git仓库中的提交,我们用它来列出所有提交中涉及的文件名及其ID。 该命令可以指定只显示某个引用(或分支)的上下游的提交。
--objects:列出该提交涉及的所有文件ID。
--all:所有分支的提交,相当于指定了位于/refs下的所有引用。
verify-pack命令用于显示已打包的内容。

第三步: 重写commit,删除大文件

// 使用以下命令,删除历史提交过的大文件:
git filter-branch --force --index-filter 'git rm -rf --cached --ignore-unmatch big-file.ipa' --prune-empty --tag-name-filter cat -- --all
// 说明
上面脚本中的big-file.ipa请换成你第一步查出的大文件名,或者这里直接写一个目录。
filter-branch命令可以用来重写Git仓库中的提交
--index-filter参数用来指定一条Bash命令,然后Git会检出(checkout)所有的提交, 执行该命令,然后重新提交。
–all参数表示我们需要重写所有分支(或引用)。

在重写提交的过程中,会有以下日志输出:

Rewrite 719c37316f88f43b7443fd6294e379f610a89793 (55/55)
# Ref 'refs/heads/master' was rewritten
重写

如果显示 xxxxx unchanged, 说明repo里没有找到该文件, 请检查路径和文件名是否正确,重复上面的脚本,把所有你想删除的文件都删掉。
注意: 如果报错说:

// 这个意思是你当前的仓库有改动内容,没有暂存,需要处理提交或者恢复改动才能继续操作
Proceeding with filter-branch...
Cannot rewrite branches: You have unstaged changes.

第四步:推送修改后的repo

以强制覆盖的方式推送你的repo, 命令如下:

// 删除后,到这里就可以提交成功了,后面的清理和回收空间
git push origin master --force

第五步:清理和回收空间

虽然上面我们已经删除了文件, 但是我们的repo里面仍然保留了这些objects, 等待垃圾回收(GC), 所以我们要用命令彻底清除它, 并收回空间,命令如下:

rm -rf .git/refs/original/
git reflog expire --expire=now --all
git gc --prune=now

至此,我们已经彻底的删除了我们不想要的文件

相关文章

  • .git提交记录中有大文件,推送到远程分支失败

    今天在迁移仓库的时候,更换了远程地址,使用命令推送到新的仓库的时候一直报失败,解决办法记录如下: 第一步:可以在....

  • Git 基本用法

    克隆 查看git状态 创建新的分支 切换分支 删除分支 添加新文件 提交 分支推到远程分支 查看提交记录 查看所有...

  • git常用指令

    下载远程仓库代码 git clone 代码仓库地址 从远程仓库拉取代码 git pull 提交代码到本地分支,并推...

  • Git与Github常用命令

    全局配置 配置SSHKEY 初始化本地仓库/提交/链接远程仓库 克隆远程仓库 git仓库操作 分支管理 分支数据推...

  • git 命令备忘

    记录个人 git 备忘,持续更新。 查看文件文件的提交记录 删除远程分支

  • git常用操作

    git clone 新建分支 切换分支 删除分支 删除远程分支 不会做merge,将自己的提交记录放到最前面 提交代码

  • 开发之路十——Git相关操作

    创建分支并提交到远程分支 1,git branch -r : 查看远程端库的分支情况2,git checkout ...

  • Git项目迁移

    为了保留历史提交记录或远程所有分支信息等,最好使用 git clone —bare old @git -> ...

  • git常用命令

    一、本地分支 二、远程分支 三、git提交规范

  • Git 上传文件命令

    git添加到本地仓库 git提交到本地仓库 git推送到远程仓库 git合并分支 当前配置链接命令 把当前地址设置...

网友评论

      本文标题:.git提交记录中有大文件,推送到远程分支失败

      本文链接:https://www.haomeiwen.com/subject/ulvstrtx.html