无法从 git commit 中删除文件

Posted

技术标签:

【中文标题】无法从 git commit 中删除文件【英文标题】:Can't remove file from git commit 【发布时间】:2014-02-05 18:38:42 【问题描述】:

如何丢弃所有尚未推送的 git 提交,然后强制 git 不提交 data/ 目录中的任何内容?

我正在尝试从我的 c9.io 项目中强制覆盖对存储在 github 上的项目的所有更改。我不小心 git 添加了一些 mongodb 数据文件。我试图将 data/ 目录添加到 .gitignore。我从 github 拉取更新的 .gitignore,但是当我尝试使用 git push 时,这些顽固的 data/ 文件仍处于待提交状态。我还尝试了 git reset、git rebase、git clean 和 this,我将 dmpfile.sql 更改为 pi/data/node-login.1。

请帮助我已经做了几个小时了,我真的很沮丧

Counting objects: 15, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (13/13), done.
Writing objects: 100% (13/13), 150.22 KiB | 92 KiB/s, done.
Total 13 (delta 6), reused 0 (delta 0)
remote: warning: File pi/data/local.0 is 64.00 MB; this is larger than GitHub's recommended maximum file size of 50 MB
remote: warning: File pi/data/node-login.0 is 64.00 MB; this is larger than GitHub's recommended maximum file size of 50 MB
remote: error: GH001: Large files detected.
remote: error: Trace: e6ade98208c08b634ed28aefea36dfbb
remote: error: See http://git.io/iEPt8g for more information.
remote: error: File pi/data/node-login.1 is 128.00 MB; this exceeds GitHub's file size limit of 100 MB
To git@github.com:bobbyg603/goddard.git
 ! [remote rejected] master -> master (pre-receive hook declined)
error: failed to push some refs to 'git@github.com:bobbyg603/goddard.git'

.gitignore:

lib-cov
*.seed
*.log
*.csv
*.dat
*.out
*.pid
*.gz

data/

pids
logs
results

npm-debug.log
node_modules

.project
.settings

谢谢, 鲍比

【问题讨论】:

显示你的 .gitignore 规则。 您链接到一个页面,该页面讨论使用git filter-branch 从您的历史记录中删除文件。这是正确的做法。你在这个过程中遇到了什么问题? 谢谢克里斯!我第一次尝试时一定打错了。我再次运行命令,它似乎已经工作了:) 【参考方案1】:

感谢 Chris,我能够通过运行以下命令来解决此问题:

git filter-branch -f --index-filter 'git rm --cached --ignore-unmatch pi/data/node-login.0'

git filter-branch -f --index-filter 'git rm --cached --ignore-unmatch pi/data/node-login.1'

git filter-branch -f --index-filter 'git rm --cached --ignore-unmatch pi/data/local.0'

【讨论】:

小心,它会重写所有历史。 或使用The BFG Repo Cleaner。我两种方式都做过,BFG 速度更快,但设置起来需要更小心,而 git filter-branch 是一个不错的单线。 我尝试了很多解决方案,只有一个有效。非常感谢! 为了扩展 Sheraz 的评论,在 Windows 中确保使用双引号而不是单引号,如果您的路径和/或文件名称中有空格,请用单引号将其括起来。所以git filter-branch -f --index-filter "git rm --cached --ignore-unmatch 'path/with/spaces/in/file name.txt'"。见***.com/a/33741936/6169534。还要确保你在正确的目录中! 各位,对远程文件有影响吗?【参考方案2】:
git filter-branch -f --index-filter "git rm -rf --cached --ignore-unmatch FOLDERNAME" -- --all

将 FOLDERNAME 替换为您希望从给定 git 存储库中删除的文件或文件夹。

【讨论】:

我收到另一个关于脏工作目录的错误。通过确保我不断更新的 jupyter 检查点被忽略并且我的 gitignore 被提交然后这个工作来修复它。 它在推送时给了我错误..“错误:未能将一些参考推送到 https//...”并给出“提示:更新被拒绝,因为您当前分支的尖端落后” .但是当我拉它时,它产生了很多冲突。【参考方案3】:

我用过BFG Repo Cleanner,简单快捷,效果很好

【讨论】:

【参考方案4】:

这对我有用:

git rm --cached name_of_a_giant_file
git rm --cached name_of_another_giant_file
git commit --amend -CHEAD
git push

来源:Github Help: Working with large files

【讨论】:

什么也没发生。应用此功能后,虽然它减少了文件总数,但在显示进程 99% 后它又卡住了。有什么建议我缺少什么? @biscuit314 请更新命令:git commit --amend -CHEAD【参考方案5】:
git filter-branch --tree-filter 'rm -rf path/whaever' HEAD

这有点简单,它是一种从历史中删除和重写它的方法。结果就是这样

Rewrite 5ac3045254d33fc5bb2b9fb05dccbdbb986b1885 (61/62) (24 seconds passed, remaining 0 predicted)
Ref 'refs/heads/features_X' was rewritten

现在,我可以推了

【讨论】:

非常感谢!这是唯一适用于我的特殊情况的方法。

以上是关于无法从 git commit 中删除文件的主要内容,如果未能解决你的问题,请参考以下文章

markdown 如何从项目git commit history中查找和恢复已删除的文件

如何删除git中的文件

git在本地修改并删除一个文件后怎样从服务端拉取

git 恢复一个被删除的文件,本地已经删除很久了,而且不知道commit_id ,只记得文件名

怎么删除git远程仓库上某次commit

git删除缓存区中文件