目前我有

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

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

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

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

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

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

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


当前回答

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

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

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

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

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

错误后运行git重置HEAD^ 将文件/文件夹添加到' '中。gitignore”的文件。 继续像往常一样添加git。它可以捕获其他文件/文件夹,但必须捕获.gitignore文件。接下来是git commit -m"message",最后git push origin <branch_name>

其他回答

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

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

git log --all -- 'large_file`

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

2. 找到最古老的那个。

git log

假设你有:

commit 3f7dd04a6e6dbdf1fff92df1f6344a06119d5d32

3. 变基

git rebase -i 3f7dd04a6e6dbdf1fff92df1f6344a06119d5d32

小贴士:

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

对我有用的是:

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

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

如果你看到创建模式中列出了大文件,那么执行: git filter-branch——index-filter 'git rm -r——cached——ignore-unmatch filename' HEAD。 你应该看到一堆重写显示在你的控制台,以: Rm 'filename'和 最后一行Ref被重写了。

这是完成了。

你可以使用

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

我发现压缩比过滤分支更有用。我做了以下事情:

本地删除大文件。 提交本地删除。 软重置回X次提交(对我来说是3):git重置-软头~3。 然后重新提交所有的更改(AKA squash) git commit -m "合并提交的新消息" 推送压缩提交。

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