目前我有

空的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中列出时,文件如何仍然在以太中?


当前回答

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


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

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

在根目录下执行该命令

其他回答

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

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

First of all, you need a clean, up-to-date local repo. Delete all the large files. Now create a new folder OUTSIDE of your repo folder and use "Git create repository here" to make it a new Git repository, let's call it new_local_repo. This is it! All above methods said you have to clean the history..., well, I'm sick of that, let's create a new repo which has no history at all! Copy the files from your old, messed up local repo to the new, beautiful repo. Note that the green logo on the folder icon will disappear, this is promising because this is a new repo! Commit to the local branch and then push to remote new branch. Let's call it new_remote_branch. If you don't know how to push from a new local repo, Google it. Congrats! You have pushed your clean, up-to-date code to GitHub. If you don't need the remote master branch anymore, you can make your new_remote_branch as new master branch. If you don't know how to do it, Google it. Last step, it's time to delete the messed up old local repo. In the future you only use the 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

如果这个文件是你最近一次提交时添加的,而且你还没有推送到远程存储库,你可以删除这个文件并修改提交。

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 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

从那里,您可以删除大文件(假设您还没有这样做),并且您应该能够重新提交所有内容而不会丢失您的工作。

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

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

git log --all -- 'large_file`

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

2. 找到最古老的那个。

git log

假设你有:

commit 3f7dd04a6e6dbdf1fff92df1f6344a06119d5d32

3. 变基

git rebase -i 3f7dd04a6e6dbdf1fff92df1f6344a06119d5d32

小贴士:

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