Git 仓库中删除大文件的历史提交记录

本文介绍如何使用GitHub for Windows对大型代码库进行清理,包括删除敏感数据、生成文件、更新本地历史文件等步骤,以减小代码库大小并优化存储。

刚接触这东西,会使用GitHub for windows 之后,感觉挺好用的。

不过最近发现,代码库已经有90M大小了。想一想,除了把ttf字体文件提交了之外,图片素材,和编译后的class文件都提交了。

网上找一些方法,删除历史记录。综合一下,总算成功了。


官方教程:

https://help.github.com/articles/remove-sensitive-data   

相关教程:

http://yihui.name/cn/2010/12/animation-update-1-1-5/

http://www.azhowto.com/removing-sensitive-data-from-git/

其中要填的是路径。官方教程里就位于根目录,所以直接写的文件名。

上面还提到了,windows下要用双引号。(其实后来发现单引号也行)

路径分隔符,要使用斜杠 / 


可以这样,删除生成文件。

git filter-branch --force --index-filter "git rm --cached --ignore-unmatch ./myproject/bins/*" --prune-empty --tag-name-filter cat  HEAD -- --all


PS:

又试了几下,上面的命令好像有些问题了,也可以用这条命令

git filter-branch --force --index-filter "git rm --cached --ignore-unmatch *.jar" HEAD -- --all


官方教程里的命令好像有点问题,在 cat 后面少了个 HEAD

参考网上的一些资料,最后我用的是这样的命令

git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch *.class'   --prune-empty --tag-name-filter cat HEAD -- --all


然后 按照Animation 文章里面的,运行后面几条命令,把改动push 到远端服务器上。

然后把本地历史文件也情况,这下 du -sh 就看到文件夹已经只有  100多K 了


git push origin master --force
rm -Force -R .git/refs/original/
git reflog expire --expire=now --all
git gc --prune=now
git gc --aggressive --prune=now



PS: 某处看到的,添加到 .gitignore 之后,有些文件还是被跟踪了,因为这些文件已经被 add了。 只要  git rm 这些文件,ignore 列表就生效了。

git rm --cached git rm会本地删除文件,并取消git的跟踪。 用 git rm --cached 可以本地不删除,并取消git 的跟踪。然后 commit 就好啦



本人优快云博客目录:

http://blog.youkuaiyun.com/tidus5


<think>好的,我现在需要帮助用户解决如何用Git命令删除远程仓库提交历史。首先,我得回忆一下相关的Git操作。用户想要删除远程仓库历史,这可能意味着他们想将远程仓库回退到某个特定的提交,或者完全清除历史记录,只保留最新的提交。不过,Git本身的设计是保存完整的历史,所以直接删除远程历史并不常见,通常需要强制推送来覆盖远程分支。 首先,我想到的是使用git reset命令将本地仓库回退到某个旧的提交,比如使用git reset --hard <commit-hash>。这样本地仓库历史就被改写了。然后,用git push --force命令强制推送到远程仓库,覆盖远程分支的历史。不过,这样做可能会有风险,因为会改变历史,影响其他协作者的工作。因此,需要提醒用户谨慎操作,并确保团队其他成员知道这个变更。 另外,用户可能想完全删除所有提交历史,只保留最新的文件状态。这种情况下,可以新建一个孤立分支,然后将所有文件作为初始提交,再强制推送到远程仓库。步骤大致是:使用git checkout --orphan new_branch创建一个没有历史的新分支,添加所有文件并提交,然后删除原来的主分支(比如master或main),再将这个新分支重命名为原来的主分支,最后强制推送。这种方法会彻底清除历史,只保留一次提交。 需要确保用户了解这些操作的影响,尤其是强制推送会覆盖远程仓库,可能导致数据丢失。还要提醒他们在操作前备份当前的仓库状态,以防万一。此外,如果仓库是多人协作的,必须通知所有成员,避免他们基于旧的历史继续工作,导致合并冲突。 另外,参考引用中的内容,比如引用[2]提到了git reset --hard的使用,可以用来丢弃本地的修改,但这里需要的是对远程仓库的操作,所以结合强制推送。引用[1]提到另一个Git进程可能正在运行的问题,如果在操作过程中遇到此类错误,用户需要先确保没有其他Git进程在运行,或者手动删除锁定文件。 最后,生成相关问题时要考虑用户可能进一步的问题,比如如何回退到特定提交、强制推送的风险,或者如何清理本地历史等。确保问题覆盖用户可能需要的后续步骤和注意事项。</think>要删除远程仓库中的提交记录,需通过改写本地历史后强制推送覆盖远程分支。以下是具体步骤及注意事项: ### 方法1:使用`git reset`回退本地历史 1. **回退本地分支到目标提交**: ```bash git reset --hard <commit-hash> ``` 例如回退到前第5个提交: ```bash git reset --hard HEAD~5 ``` 2. **强制推送到远程仓库**: ```bash git push --force origin <branch-name> ``` 这会用本地历史覆盖远程分支[^2] ### 方法2:创建新孤立分支(完全删除历史) 1. **创建无历史新分支**: ```bash git checkout --orphan new_branch git add -A git commit -m "Initial commit" ``` 2. **替换远程主分支**: ```bash git branch -D main/master # 删除旧分支 git branch -m main/master # 重命名新分支 git push -f origin main/master ``` ### 重要注意事项 1. **数据丢失风险**:强制推送会永久删除后续提交记录,建议提前备份 2. **协作影响**:需通知所有协作者重新克隆仓库,否则会导致历史不一致[^1] 3. **仓库保护**:某些平台(如GitHub)默认保护主分支,需先解除保护才能强制推送
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值