背景
我独自在一个项目上工作,我一直使用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分支时,我得到了以下错误:“无法重写分支:您有未暂存的更改。”
8条答案
按热度按时间fkvaft9z1#
我使用的一个简单解决方案:
1.对你想撤销的提交次数执行**
git reset HEAD^
,它会保留你的修改和文件的实际状态,只是刷新它们的提交。1.一旦提交被撤销,您可以然后考虑如何以更好的方式重新提交文件**,例如:删除/忽略大文件,然后添加你想要的,然后再次提交。或者使用Git LFS来跟踪那些大文件。
编辑:如果您的提交需要认证,这个答案也是可以接受的(例如:用户名和电子邮件),并且您需要在提交后添加正确的凭据。您可以以相同的方式撤消操作。
问题:是否有人能找到一种方法,直接挑出不好的提交并修改它呢?我特别想问的是,如果有人只需要重新验证他的提交,就像这里一样,但是文件不需要修改,只需要提交来验证.
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
5kgi1eie3#
Github的解决方案非常简洁。在推送之前我做了一些提交,所以很难撤销。Github的解决方案是:移除在较早提交中添加的文件
如果这个大文件是在之前的提交中添加的,你需要从仓库历史记录中删除它,最快的方法是使用The BFG(一个更快,更简单的git-filter-分支替代方法):
https://help.github.com/articles/working-with-large-files/
https://rtyley.github.io/bfg-repo-cleaner/
70gysomp4#
这是在参考上面的BFG帖子,我会直接评论,但我不知道如何做到这一点,作为一个低声誉的新用户。
你可能想先用“git gc”重新打包。
我有问题,让BFG的工作,直到我这样做,这似乎是一个常见的问题,如果你只在本地回购工作,并准备的东西,把一个远程的第一次。
相关的谷歌点击,其中twigged我到它:https://github.com/rtyley/bfg-repo-cleaner/issues/65
sshcrbum5#
看起来您唯一的问题是有未暂存的更改,您没有给予任何细节,说明实际上什么是不同步的,所以这是一个在黑暗中拍摄的镜头,但是假设您在步骤4中简单地-
rm
d文件,您将使用以下命令从索引中恢复它:如果没有,你就只能靠自己了。你的目标是确保你的索引和你的工作树处于相同的状态。这显示为
git status
报告没有要提交的东西,工作目录干净。确保树干净的核心选项是
git reset --hard
。如果你想尝试,请事先备份你的树+repo。一旦工作副本是干净的,就可以继续执行步骤5和6。
lsmd5eda6#
我一次又一次地遇到这个问题,我似乎没有学会不这样做。这里提供的解决方案以前对我有效,但由于某种原因这次没有,但下面是有效的解决方案(来自https://medium.com/analytics-vidhya/tutorial-removing-large-files-from-git-78dbf4cf83a):
删除大文件
然后,要编辑提交
然后可以使用以下命令推送修改后的提交
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中。
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