git 当我的分支比主分支提前5次提交时,如何在提交中删除一个太大的文件

cbjzeqam  于 2022-12-21  发布在  Git
关注(0)|答案(8)|浏览(168)

背景

我独自在一个项目上工作,我一直使用github来保存我的工作,而不是保存在我的电脑上。不幸的是,我添加了一个非常大的文件到本地存储库:300mb(超过了Github的限制)。
"我所做的"
我将努力为我的成就创造历史:
1.我(默默地)把所有东西都加到索引里:

git add *

1.我提交了更改:

git commit -m "Blablabla"

1.我试着晋升为起源大师

git push origin master

这花了一段时间,所以我只需要CTRL+C,并重复步骤2和3四次,直到我意识到一个文件太大,无法推送到github。
1.我犯了一个可怕的错误,删除了我的大文件(我不记得我是使用了git rm还是简单rm)
1.我按照(https://help.github.com/articles/remove-sensitive-data)上的说明操作
1.当我尝试git filter分支时,我得到了以下错误:“无法重写分支:您有未暂存的更改。”

fkvaft9z

fkvaft9z1#

我使用的一个简单解决方案:

1.对你想撤销的提交次数执行**git reset HEAD^,它会保留你的修改和文件的实际状态,只是刷新它们的提交。
1.一旦提交被撤销,您可以
然后考虑如何以更好的方式重新提交文件**,例如:删除/忽略大文件,然后添加你想要的,然后再次提交。或者使用Git LFS来跟踪那些大文件。

编辑:如果您的提交需要认证,这个答案也是可以接受的(例如:用户名和电子邮件),并且您需要在提交后添加正确的凭据。您可以以相同的方式撤消操作。
问题:是否有人能找到一种方法,直接挑出不好的提交并修改它呢?我特别想问的是,如果有人只需要重新验证他的提交,就像这里一样,但是文件不需要修改,只需要提交来验证.

pzfprimi

pzfprimi2#

当你删除了你的文件,这将是一个更改,这是git抱怨的未暂存的更改。如果你做了一个git状态,你应该会看到文件被列为已移除/已删除。要撤销这个更改,你应该git checkout -- <filename>。然后文件将被恢复,你的分支应该是干净的。你也可以git reset --hard,这将使你的repo回到你提交时的状态。
我假设这是最后一次提交你想要删除的大文件,你可以执行git reset HEAD~然后重做一次(不添加大文件),然后你就可以执行git push了。
因为文件不在最后一次提交中,所以你可以毫无问题地完成最后的步骤。你只需要提交或删除你的修改。
http://git-scm.com/book/en/Git-Tools-Rewriting-History

5kgi1eie

5kgi1eie3#

Github的解决方案非常简洁。在推送之前我做了一些提交,所以很难撤销。Github的解决方案是:移除在较早提交中添加的文件
如果这个大文件是在之前的提交中添加的,你需要从仓库历史记录中删除它,最快的方法是使用The BFG(一个更快,更简单的git-filter-分支替代方法):

bfg --strip-blobs-bigger-than 50M
# Git history will be cleaned - files in your latest commit will *not* be touched

https://help.github.com/articles/working-with-large-files/
https://rtyley.github.io/bfg-repo-cleaner/

70gysomp

70gysomp4#

这是在参考上面的BFG帖子,我会直接评论,但我不知道如何做到这一点,作为一个低声誉的新用户。
你可能想先用“git gc”重新打包。
我有问题,让BFG的工作,直到我这样做,这似乎是一个常见的问题,如果你只在本地回购工作,并准备的东西,把一个远程的第一次。
相关的谷歌点击,其中twigged我到它:https://github.com/rtyley/bfg-repo-cleaner/issues/65

sshcrbum

sshcrbum5#

看起来您唯一的问题是有未暂存的更改,您没有给予任何细节,说明实际上什么是不同步的,所以这是一个在黑暗中拍摄的镜头,但是假设您在步骤4中简单地-rm d文件,您将使用以下命令从索引中恢复它:

git checkout large_file

如果没有,你就只能靠自己了。你的目标是确保你的索引和你的工作树处于相同的状态。这显示为git status报告没有要提交的东西,工作目录干净。
确保树干净的核心选项是git reset --hard。如果你想尝试,请事先备份你的树+repo。
一旦工作副本是干净的,就可以继续执行步骤5和6。

lsmd5eda

lsmd5eda6#

我一次又一次地遇到这个问题,我似乎没有学会不这样做。这里提供的解决方案以前对我有效,但由于某种原因这次没有,但下面是有效的解决方案(来自https://medium.com/analytics-vidhya/tutorial-removing-large-files-from-git-78dbf4cf83a):
删除大文件

git rm --cached <filename>

然后,要编辑提交

git commit --amend -C HEAD

然后可以使用以下命令推送修改后的提交

git push
slhcrj9b

slhcrj9b7#

以下是对我起作用的方法:
1.下载并安装BFG Repo-Cleaner(BFG),它可以在here上获得。我的下载是bfg-1.13.0.jar
1.将下载的jar文件(在我的例子中是bfg-1.13.0.jar)移动到${JAVA_HOME}/lib可能会很有帮助。我之所以这样做,是因为我希望将Java特定的库放在一个比较合理的位置,因为它们不像普通的Windows安装。您可能希望将jar文件重命名为bfg.jar以简化操作-如下所示。在这里我使用bfg.jar,实际上是指bfg-1.13.0.jar
1.运行java -jar ${JAVA_HOME}/lib/bfg.jar --delete-files <file_name> --no-blob-protection .;您应该将整个<file_name>替换为导致问题的特定文件名-请注意,文件的路径不是必需的,只有文件名本身。
1.运行git reflog expire --expire=now --all && git gc --prune=now --aggressive完成高炉煤气清扫作业
1.最后,运行git push origin main --force来完成推送任何未完成的本地提交。
1.如果到目前为止您已成功完成所有操作,则您的问题已解决
1.接下来,如果你希望避免这个问题再次发生,请务必检查你是否无意中将目录中的超大文件添加到Git中。

rsl1atfo

rsl1atfo8#

复制最新的存储库状态

第一个月

将原始存储库重置为提交大文件之前的状态

cd original_repo && git reset --hard {commit_before_large_file}

从repo_tmp中删除.git,这样我们只获取内容

cd .. && rm -rf repo_tmp/.git
将repo_tmp(最新的repo状态)复制并替换到原始的repo文件夹
cp -r repo_tmp original_repo

现在添加、提交和推送,一切就绪

git add . && git commit -m "be gone large file" && git push

相关问题