ChatGPT解决这个技术问题 Extra ChatGPT

由于我已经删除的大文件,无法推送到 GitHub

目前我有

空 GitHub 存储库 SSH 服务器存储库(主) 本地存储库

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

一切都很顺利,但它说 filename.gz 对于 GitHub 来说太大了。我不需要这个文件,所以我运行了几个 Git 命令从 Git 缓存中删除它,然后推送回 SSH 服务器。

我在本地看不到大文件,但它仍然在 SSH 服务器上,即使 git diff 没有返回任何内容并且 git push 返回“一切都是最新的” - 即使当我尝试时该文件在本地存储库中不可见推送到 GitHub 我仍然收到错误

远程:错误:文件 fpss.tar.gz 为 135.17 MB;这超出了 GitHub 的 100 MB 文件大小限制

我按照“解决问题”listed on GitHub help 下的步骤进行操作,这还不够吗?

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

该文件仍然存在于历史中。您需要销毁历史记录,可能通过压缩添加和删除文件的提交。
@Shahbaz 我按照本网站上列出的“解决问题”下的步骤进行操作……这还不够吗? help.github.com/articles/working-with-large-files
那里的命令比我对git的了解更高级,所以我真的说不出来。无论如何,如果 git log -- the_big_file 向您返回任何内容,则该文件仍在历史记录中。
@Shahbaz 返回什么都没有><
如果您的历史对您来说无关紧要,那么您一定可以做到。虽然不会很好。您可以做的一件事是专门为 github 创建一个分支,在一次提交中压缩所有历史记录(实际上与您所说的相同,但不删除其他分支),然后只将该特定分支推送到 github。稍后,例如,当 master 分支中有提交时,您可以挑选所有提交并应用到 github 分支。 (不确定合并是否可行,但如果可以,那就更好了)

M
MacGyver

您可以使用

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

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

此命令会更改提交的哈希值,这可能是一个真正的问题,尤其是在共享存储库上。在不了解后果的情况下不应执行此操作。


为我工作,但我不得不“强制”它: git filter-branch --index-filter 'git rm -r --cached --ignore-unmatch ' -f HEAD
此命令会更改提交的哈希值,这可能是一个真正的问题,尤其是在共享存储库上。在不了解后果的情况下不应执行此操作。
您是否应该将 替换为导致问题的文件或目录的名称?
请注意,如果要将这些更改应用于所有分支,则需要使用 --all 标志而不是 HEAD
我得到:Rewrite 657560fa18c030bcfac9132ce1c3541e84a5bc2c (1/10) (0 seconds passed, remaining 0 predicted) /usr/lib/git-core/git-filter-branch: 1: eval: Syntax error: end of file unexpected
a
aheze

我发现 squashingfilter-branch 更有用。我做了以下事情:

本地删除大文件。提交本地删除。软重置 X 次提交(对我来说是 3 次):git reset --soft HEAD~3。然后一起重新提交所有更改(AKA squash) git commit -m "New message for the combined commit" Push squashed commit。

特殊情况(来自用户@lituo):如果以上不起作用,那么您可能有这种情况。 Commit 1 包含大文件,由于大文件错误,Commit 1 的推送失败。提交 2 通过 git rm --cached [file_name] 删除了大文件,但提交 2 的推送仍然失败。您可以按照上述相同的步骤操作,但不要使用 HEAD~3,而是使用 HEAD~2


这比最佳答案要好得多。最佳答案搞砸了你的整个提交历史。
这是迄今为止修复大型未提交或已提交文件的唯一答案,而无需完全破坏存储库!赞成,因此它可以移到顶部:-)
更好是一个强有力的词。这是一个简单的不同解决方案。您应该选择哪一个取决于您想要的结果和/或您当前的状态。
如果您在推送合并提交时遇到错误,您可以在分支上附加一个 + 号。 git push origin +name-of-branch 加号强制远程分支接受你重写的历史,否则你会得到不同的分支
S
Shreya

如果您在寻求帮助之前已经在搞乱您的存储库,那么我发现这是非常有用的东西。第一种:

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 status”应该说:

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

nothing to commit, working tree clean

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


优胜者。简单、干净、有效的 git 构建解决方案。喜欢这样的回答。
我很欣赏有关确定要返回多少次提交的建议,但是不包括“--soft”选项的情况是做什么(或不做什么)?
同意,这肯定是赢家
B
BlueMoon93

如果文件与您最近的提交一起添加,并且您尚未推送到远程存储库,您可以删除该文件并修改提交,取自 here

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"

此解决方案将不起作用,因为该文件不再位于 git 索引中(结果为 git status 处的 untracked 文件列表。
什么都没有发生。应用此功能后,它减少了文件总数,但在显示进程 99% 后它又卡住了。任何建议我缺少什么?
-CHEAD 是什么意思?
如果我想从一个特定的提交中尝试这个——而不是最后一次提交怎么办?我试过 git rm --cached giant_file commit_id 但它不起作用:(
@puifais 我将恢复到上一个提交,执行这些步骤,然后与当前提交合并。我不确定这是否是最好的方法,我不是 Git 专家
R
Roberto Tyley

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

Git 会存储您项目的完整历史记录,因此即使您从项目中“删除”一个文件,Git 存储库仍会在其历史记录中保存该文件的副本,并且如果您尝试推送到另一个存储库(例如托管在GitHub)然后 Git 要求远程仓库与您的本地仓库具有相同的历史记录(即其历史记录中的相同大文件)。

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

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

如何从我的 Git 存储库中清除大文件?

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

仔细按照usage instructions,核心部分就是这样:

$ 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,并且通常更易于使用。

全面披露:我是 BFG Repo-Cleaner 的作者。


我的案子还有其他并发症,无法进行挤压。 BFG 工具效果很好。谢谢。
这是一个了不起的解决方案
值得注意的是,BFG 并没有真正维护 number of years now
你的工具是一种魔法。谢谢您的帮助
A
Andre Odendaal

我遇到了类似的问题并使用 step above 删除了文件。它工作得很好。

然后我在需要删除的第二个文件上遇到错误:remote: error: File <path/filename> is 109.99 MB; this exceeds GitHub's file size limit of 100.00 MB

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

根据对 this website 的研究,我使用了以下命令: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

之后推就通过了!


我不得不应对删除大文件(如上所述)的另一个问题是其中一个文件夹中有一个井号 # 字符。这对于正常的 git 操作完全没有问题,但是对于 git rm,我需要提供文件的完整存储库路径名并用反斜杠转义 # 以使其工作
这也对我有用。我通过简单的推动避免了页面底部的 reset hard 步骤。 czettner.com/2015/07/16/…
这在运行 'git push -f origin' 后也有效
N
Nimantha

我已经尝试了上述所有方法,但它们都不适合我。

然后我想出了自己的解决方案。

首先,您需要一个干净、最新的本地存储库。删除所有大文件。现在在您的 repo 文件夹之外创建一个新文件夹,并使用“Git create repository here”将其设为新的 Git 存储库,我们将其命名为 new_local_repo。就是这个!以上所有方法都说你必须清理历史......,好吧,我厌倦了,让我们创建一个根本没有历史的新仓库!将文件从旧的、混乱的本地 repo 复制到新的、漂亮的 repo。请注意,文件夹图标上的绿色标志会消失,这是有希望的,因为这是一个新的 repo!提交到本地分支,然后推送到远程新分支。我们称它为 new_remote_branch。如果你不知道如何从一个新的本地仓库推送,谷歌一下。恭喜!您已将干净、最新的代码推送到 GitHub。如果您不再需要远程 master 分支,您可以将 new_remote_branch 设置为新的 master 分支。如果你不知道怎么做,谷歌它。最后一步,是时候删除混乱的旧本地仓库了。将来您只使用 new_local_repo。


W
William Hu

我遇到了同样的问题,没有一个答案对我有用。我通过以下步骤解决了:

1. 查找哪些提交包含大文件

git log --all -- 'large_file`

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

2. 找到最老之前的那个。

git log

假设你得到:

commit 3f7dd04a6e6dbdf1fff92df1f6344a06119d5d32

3. Git 变基

git rebase -i 3f7dd04a6e6dbdf1fff92df1f6344a06119d5d32

提示:

我刚刚为提交选择 drop 的列表项包含大文件。你可能会在 rebase 修复它们时遇到冲突,并使用 git rebase --continue 继续直到你完成它。如果在 rebase 期间出现任何问题,请使用 git rebase --abort 取消它。


第一步对我不起作用。我需要使用: git log --all --full-history -- "**/large_file"
A
Anthony Hull
K
Kiprono Elijah Koech

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

这是解决此处提出的问题的行(来自答案 1):

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

如果文件/目录在工作树中,此命令也会删除文件/目录。

如果您想将文件/文件夹保留在工作树中,我建议采取以下步骤。

在该错误之后运行 git reset HEAD^ 将有问题的文件/文件夹添加到 ``.gitignore``` 文件中。像往常一样继续 git add 。这可能会捕获其他文件/文件夹,但必须捕获 .gitignore 文件。接下来是 git commit -m"message" 最后是 git push origin


G
GPrathap

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


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

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

从根目录运行此命令


你应该解释解决方案
E
Emre

我从头开始的非正统但简单的解决方案:

忘记你最近有问题的本地 git 存储库,然后 git clone 你的存储库到一个新的目录。

git remote add upstream <你的 github 代表在这里>

git pull 上游大师

此时只需将您的新文件复制到提交,从旧的本地代表到您的新本地代表可能包括您现在减少的巨型文件。

混帐添加。

git commit -m "你的提交文本在这里"

git push 起源大师

瞧!在我的情况下就像一个魅力。


M
Minnat Ali

如果您要上传自己的项目,那么只需转到目录所在的文件即可。删除大文件。然后点击“查看”(窗口文件)查看->检查隐藏文件夹然后你将能够看到'.git'文件删除.git文件这将删除你所有的提交历史然后你可以像新的一样推送你的repo。 ..


N
Njoroge Mathu

这对我有用。来自 github 的文档 Squashing Git Commits git reset origin/master

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

查找文档 here


D
Daniel Viglione

所以我遇到了一个特殊的情况:我从 gitlab 克隆了一个存储库,其中包含一个大于 100 mb 的文件,但在 git 历史记录中的某个时刻被删除了。后来当我添加一个新的 github 私有仓库并尝试推送到新的仓库时,我得到了臭名昭著的“文件太大”错误。至此,我不再能够访问原始的 gitlab 存储库。但是,我仍然能够在我机器上的本地存储库上使用 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

T
Tree DR

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

git commit,如果您看到列出了大文件的创建模式,那么执行: git filter-branch --index-filter 'git rm -r --cached --ignore-unmatch filename' HEAD。您应该会在控制台中看到一堆 Rewrites,它们以 rm 'filename' 结尾,最后一行 Ref 被重写。

完成。


O
OverFlow Police

而不是做复杂的事情,将您的回购(在您的计算机上)复制到另一个地方。删除大文件。做几个推拉。然后你的一些文件会被“<<<<<< HEAD”之类的东西弄乱。只需将备份复制到磁盘上的旧文件夹中即可。再做一次添加、提交、推送!


M
MobileMon

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

我想也许它试图将一个巨大的文件推送到 github,而 github 可能拒绝了那个巨大的文件或(文件)


x
xinthose

什么对我有用:

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


N
Nikhith sunil

我之所以这样做,是因为您的已删除文件可能已经存在于您的提交中,以检查首次使用

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>

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


R
RAHUL KUMAR

我正在添加第一个答案。

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

来自源/主将存在一些合并冲突。

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

请运行这个

git reset --hard origin/master

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


B
Bishwas Mishra

使您的本地存储库与远程存储库匹配(所有本地更改都将丢失):

git reset --hard origin/master

然后再推。


这删除了我本地目录中的所有内容!!!!!!!!!!!!!!!!!!!!!!!!
@Afagh 再次阅读“使您的本地存储库与远程存储库匹配”。