不能推送到GitHub,因为大文件,我已经删除了

目前我有

  1. 空的GitHub回购
  2. SSH服务器恢复(main)
  3. 当地的回购

SSH服务器回购是最新的回购(生产站点),所以我从那里克隆了一个Git到本地。然后我尝试做一个git push到GitHub。

一切都很好,但随后它说一些关于文件名。gz对GitHub太大。我不需要这个文件,所以我运行了几个Git命令从Git缓存中删除它,然后推回到SSH服务器。

我没有看到本地的大文件,但它仍然在SSH服务器上,即使git diff返回什么,git推送返回“一切都是最新的”-即使文件在本地回购中不可见,当我尝试推送到GitHub时,我仍然会得到错误

文件fpss.tar.gz是135.17 MB;这超过了GitHub的文件大小限制100mb

我遵循了“修复问题”列在GitHub帮助上下的步骤,所以这不应该足够吗?

当它不在本地或在git status/diff/push中列出时,文件如何仍然在以太中?

214520 次浏览

你可以使用

git filter-branch --index-filter 'git rm -r --cached --ignore-unmatch <file/dir>' HEAD

这将删除该文件历史记录中的所有内容。问题是该文件出现在历史记录中。

这个命令会改变提交的哈希值,这可能是一个真正的问题,特别是在共享存储库上。不应该在不了解后果的情况下进行。

编辑: git项目现在建议用户使用git filter-repo而不是git filter-branch


使用git filter-repo

WARNING: git-filter-branch has a glut of gotchas generating mangled history
rewrites.  Hit Ctrl-C before proceeding to abort, then use an
alternative filtering tool such as 'git filter-repo'
(https://github.com/newren/git-filter-repo/) instead.  See the
filter-branch manual page for more details; to squelch this warning,
set FILTER_BRANCH_SQUELCH_WARNING=1.

安装

[brew|pip3|...] install git-filter-repo

使用

要删除任何使用路径前缀 example/path/to/something文件,您可以运行

git filter-repo --path example/path/to/something--invert-paths

要删除任何没有路径前缀 example/path/to/something文件,您可以运行

git filter-repo --path example/path/to/something

如果文件是添加在您最近的提交中,而你是还没有推送到远程存储库,你可以删除文件并修改提交,从在这里获取:

git rm --cached giant_file
# Stage "giant_file" for removal with "git rm"
# Leave it on disk with "--cached". if you want to remove it from disk
# then ignore the "--cached" parameter
git commit --amend -CHEAD
# Commit the current tree without the giant file using "git commit"
# Amend the previous commit with your change "--amend"
# (simply making a new commit won't work, as you need
# to remove the file from the unpushed history as well)
# Use the log/authorship/timestamp of the last commit (the one we are
# amending) with "-CHEAD", equivalent to --reuse-message=HEAD
git push
# Push our rewritten, smaller commit with "git push"

我有一个类似的问题,并使用以上步骤删除文件。它工作得很完美。

然后我在第二个文件上得到了一个错误,我需要删除: remote: error: File <path/filename>为109.99 MB;这超过了GitHub的文件大小限制100.00 MB < /代码> < / p >

我尝试了相同的步骤,得到一个错误:"A previous backup already exists in <path/filename>"

通过对这个网站的研究,我使用了命令:git filter-branch --force --index-filter "git rm --cached --ignore-unmatch <path/filename>" --prune-empty --tag-name-filter cat -- --all

工作很好,大文件被删除了。

令人难以置信的是,推送仍然失败,并出现另一个错误:error: RPC failed; curl 56 OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 104 fatal: The remote end hung up unexpectedly

我通过直接修改.git配置文件- postBuffer = 999999999来修复这个问题

在那之后,推力通过了!

我也遇到了同样的问题,但没有一个答案适合我。我通过以下步骤来解决:

1. 找出哪个提交包含大文件

git log --all -- 'large_file`

底部的提交是结果列表中的最古老的提交。

2. 找到最古老的那个。

git log

假设你有:

commit 3f7dd04a6e6dbdf1fff92df1f6344a06119d5d32

3.Git变基

git rebase -i 3f7dd04a6e6dbdf1fff92df1f6344a06119d5d32

提示:

  1. 列表项
  2. 我只是选择drop提交包含大文件。
  3. 你可能会在rebase过程中遇到冲突,修复它们并使用git rebase --continue继续直到你完成它。
  4. 如果在rebase过程中出现任何错误,使用git rebase --abort来取消它。

为什么GitHub拒绝我的回购,即使我删除了大文件?

Git存储了你项目的完整历史,所以即使你从你的项目中“删除”一个文件,Git回购在它的历史中仍然有一个文件的副本,如果你试图推到另一个存储库(比如一个托管在GitHub),那么Git 需要远程回购具有与你的本地回购相同的历史(即在它的历史中相同的大文件)。

我怎样才能让GitHub接受我的回购?

您需要在本地清理项目的Git历史记录,从所有历史记录中删除不需要的大文件,然后只使用“已清理”的历史记录。受影响的Git提交id将会改变。

我如何清理大文件从我的Git回购?

从Git历史记录中清除不需要的大文件的最佳工具是高炉煤气Repo-Cleaner——它是git-filter-branch的一个更简单、更快的替代方案,专门用于从Git历史记录中删除不需要的文件。

仔细遵循使用说明,核心部分就是:

$ java -jar bfg.jar --strip-blobs-bigger-than 100M my-repo.git

任何超过100MB大小的文件(不在你的最新的提交中)将从你的Git存储库的历史中删除。然后你可以使用git gc来清除死数据:

$ git gc --prune=now --aggressive

BFG通常至少比运行git-filter-branch10-50x,而且通常更容易使用。

完全披露:我是好心眼巨人回收清理器的作者。

我发现被压扁filter-branch更有用。我做了以下事情:

  1. 本地删除大文件。
  2. 提交本地删除。
  3. 软复位X次提交(对我来说是3):git reset --soft HEAD~3
  4. 然后重新将所有更改一起(AKA squash) git commit -m "New message for the combined commit"
  5. 推送压缩提交。

< >强特例< / >强 (from user @lituo):如果上面不起作用,那么你可能会遇到这种情况。提交1包含大文件,由于大文件错误,提交1的推送失败。提交2通过git rm --cached [file_name]删除了大文件,但提交2的推送仍然失败。你可以遵循上面相同的步骤,但使用HEAD~2而不是HEAD~3

如果你在寻求帮助之前就已经把你的回购搞得一团糟,我发现这里有一些非常有用的东西。第一种:< br >

git status

在此之后,您应该会看到类似于

On branch master
Your branch is ahead of 'origin/master' by 2 commits.
(use "git push" to publish your local commits)


nothing to commit, working tree clean

重要的部分是“2次提交”!从这里,继续输入:

git reset HEAD~<HOWEVER MANY COMMITS YOU WERE BEHIND>

所以,对于上面的例子,你可以输入:

git reset HEAD~2

在你输入之后,你的“git状态”应该是:

On branch master
Your branch is up to date with 'origin/master'.


nothing to commit, working tree clean
从那里,您可以删除大文件(假设您还没有这样做),并且您应该能够重新提交所有内容而不会丢失您的工作 我知道这不是一个超级花哨的回答,但我希望它能帮助到你!< / p >

这对我有用。来自github的文档 压缩Git提交 Git重置origin/master

git checkout master && git pull;
git merge feature_branch;
git add . --all;
git commit -m "your commit message"

查找文档在这里

我在补充第一个答案。

git filter-branch——index-filter 'git rm -r——cached——ignore-unmatch ' HEAD

从原点到主节点会有一些合并冲突。

你的分支和'origin/master'已经分离, 分别有114和109个不同的提交。 (使用“git pull”将远程分支合并到您的分支中)

请运行这个

Git重置-硬源/主

它将丢弃我所有阶段性和非阶段性的变化,忘记我当前本地分支上的所有内容,并使其与origin/master完全相同。

我尝试了以上所有的方法,但没有一个对我有效。

然后我想出了自己的解决办法。

  1. 首先,你需要一个干净的,最新的本地回购。删除所有大文件。

  2. 现在在你的repo文件夹外面创建一个新文件夹,并使用“Git create repository here”;为了使它成为一个新的Git存储库,我们将其命名为new_local_repo。就是它了!以上所有方法都说你必须清除历史记录…,好吧,我厌倦了,让我们创建一个新的回购,它根本没有历史!

  3. 将文件从旧的,混乱的本地repo复制到新的,美丽的repo。注意,文件夹图标上的绿色标志将消失,这是有希望的,因为这是一个新的回购!

  4. 提交到本地分支,然后推送到远程新分支。让我们称它为new_remote_branch。如果你不知道如何从一个新的本地回购,谷歌它。

  5. < p >恭喜!你已经将干净、最新的代码推送到GitHub。如果不再需要远程主分支,可以将new_remote_branch作为新的主分支。如果你不知道怎么做,那就算了。

  6. 最后一步,是时候删除混乱的旧本地回购了。以后只使用new_local_repo。

所以我遇到了一个特殊的情况:我从gitlab克隆了一个存储库,其中包含一个大于100 mb的文件,但在git历史的某个时刻被删除了。后来,当我添加了一个新的github私人回购,并试图推到新的回购,我得到了臭名昭著的“文件太大”错误。到此为止,我不再能够访问原始的gitlab回购。然而,我仍然能够在我的机器上的LOCAL存储库上使用bfg-repo-cleaner推到新的私有github回购:

$ cd ~
$ curl https://repo1.maven.org/maven2/com/madgag/bfg/1.13.0/bfg-1.13.0.jar > bfg.jar
$ cd my-project
$ git gc
$ cd ../
$ java -jar bfg.jar --strip-blobs-bigger-than 100M my-project
$ cd my-project
$ git reflog expire --expire=now --all && git gc --prune=now --aggressive
$ git remote -v # confirm origin is the remote you want to push to
$ git push origin master

将大文件/文件夹保存在工作文件夹中的解决方案

下面这句话解决了这里的问题(答案1):

git filter-branch --index-filter 'git rm -r --cached --ignore-unmatch <file/dir>' HEAD

如果文件/dir在工作树中,该命令也会删除文件/dir。

如果您希望将文件/文件夹保存在工作树中,我建议执行以下步骤。

  1. 在这个错误之后运行git reset HEAD^
  2. 将文件/文件夹添加到' '中。gitignore”的文件。

  3. 照常进行git add .,它可能捕获其他文件/文件夹,但必须捕获.gitignore文件。下一个是git commit -m"message",最后是git push origin <branch_name>

有时文件保存在跟踪历史中,请尝试以下步骤:

  1. git commit,如果你看到列出了大文件的创建模式,那么执行:
  2. <李> < p > git filter-branch --index-filter 'git rm -r --cached --ignore-unmatch filename' HEAD。 你应该看到一堆重写显示在你的控制台,以

    结尾

    Rm 'filename'和

    .最后一行裁判被重写

这是完成了。

我提出了一个非正统但简单的解决方案:

  • 只是忘记你最近有问题的本地git存储库和git clone你的存储库到一个新的目录。
  • git remote add upstream <your github rep here>
  • git pull upstream master
  • 在这一点上,只需复制您的新文件提交,从旧的可能包括您现在减少的大文件到您的新本地代表。
  • git add .
  • git commit -m "your commit text here"
  • git push origin master

瞧!对我来说很管用。

而不是做复杂的事情,复制你的回购(在你的电脑上)到另一个地方。删除大文件。做几个推拉动作。然后你的一些文件就会被“"<<<<<HEAD"。只需将备份文件复制到磁盘上的旧文件夹中。再做一次添加、提交、推送!

使您的本地回购与远程回购匹配(所有本地更改将丢失):

git reset --hard origin/master

然后再推。

当我的iOS项目没有gitignore文件时,我就遇到了这个问题

我想它可能是想把一个巨大的文件推送到github而github可能拒绝了这个巨大的文件或(多个文件)

如果你上传的是你自己的项目,那么就去目录所在的文件。 删除大文件。 然后点击“view”(窗口文件) 视图→检查隐藏文件夹 然后你就能看到了。”git的文件 删除.git文件 这将删除所有提交历史记录

不知怎的,这对我很管用。我尝试了所有的解决方案,但这个命令节省了我的时间。希望这也能帮助到你。


git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch <file/folder path>' --prune-empty --tag-name-filter cat -- --all


请自行承担风险。我不会为你的行为负责。

在根目录下执行该命令

对我有用的是:

  1. 重命名我的GitHub项目文件夹到其他东西
  2. 用正确的文件夹名称重新克隆repo
  3. 删除我重命名的repo中的.git文件夹(可能必须打开允许查看Windows中的隐藏文件)
  4. .git文件夹从正确的文件夹名移动到已重命名的文件夹名
  5. 删除重新克隆的repo文件夹,将原repo文件夹重命名为正确的名称
  6. 提交您的更改(没有大文件)并推送

我认为这是因为您删除的文件可能已经存在于您的提交,以检查这个第一次使用

git log

这将返回你在当前分支中提交的列表,找到你要找的提交的id,

然后使用,

git show <commit_id>

这应该显示包含文件的提交细节

现在要解决你的问题,使用

git reset --soft HEAD~1

这里HEAD~1上的1代表之前的提交,你可以根据你需要的提交使用不同的数字, 如果你需要第二次最后提交,只需使用git reset --soft HEAD~2

这将重置你的Head到以前的提交,如果这个提交没有大文件,那么你可以这样做,

git add .


git commit -m <message_for_commit>


git push origin <repo_name>

其他的

如果你想重置到一个不包含你的文件的特定提交,只需使用

git reset --soft <commit_id>

然后从这里创建一个新的提交,删除文件并推送它

我也有同样的问题。

为了解决这个问题,我取消了提交。然后,我分别重新提交每个文件。

在GitHub上检查你的最后一次提交id 然后使用这个

Git重置——soft <commit_id>

我想是因为工作。谢谢