为了账号安全,请及时绑定邮箱和手机立即绑定

从git / GitHub的历史记录中删除文件夹及其内容

从git / GitHub的历史记录中删除文件夹及其内容

Git
狐的传说 2019-10-04 14:22:09
我在GitHub帐户上的存储库上工作,这是我偶然发现的一个问题。带有安装了几个npm软件包的文件夹的Node.js项目包在node_modules文件夹中将该文件夹添加到git存储库中,并将代码推送到github(当时不考虑npm部分)意识到您并不需要该文件夹作为代码的一部分删除该文件夹,将其推送在那种情况下,总git repo的大小约为6MB,而实际代码(除该文件夹以外的所有代码)仅为300 KB左右。现在我最后要寻找的是一种从git的历史记录中删除该软件包文件夹的详细信息的方法,因此,如果有人对其进行了克隆,则不必下载价值6mb的历史记录,而只有这些文件才可以获取截至上一次提交将为300KB。我为此找到了可能的解决方案,并尝试了这两种方法从git存储库中删除文件(历史记录)http://help.github.com/remove-sensitive-data/https://gist.github.com/1588371Gist似乎在运行脚本后在哪里工作,它表明它删除了该文件夹,并表明修改了50个不同的提交。但这并没有让我推送该代码。当我尝试推动它时,它说Branch up to date但显示对50个提交进行了修改git status。其他2种方法也无济于事。现在,即使显示它摆脱了该文件夹的历史记录,当我在本地主机上检查该存储库的大小时,它仍约为6MB。(我也删除了该refs/original文件夹,但没有看到存储库大小的变化)。我要澄清的是,是否有一种方法不仅可以消除提交历史记录(这是我认为唯一发生的事情),而且可以摆脱那些git一直假设要回滚的文件。可以说为此提供了一个解决方案,该解决方案已在我的本地主机上应用,但无法复制到该GitHub存储库,是否可以克隆该存储库,回滚到第一个提交执行该技巧并将其推送(或者这意味着git将还有所有这些提交的历史吗?-又名6MB)。我的最终目标是从根本上找到摆脱git中文件夹内容的最佳方法,以便用户不必下载6MB的内容,而仍然可以拥有从未触及modules文件夹的其他提交(这很漂亮很多))在git的历史中。我怎样才能做到这一点?
查看完整描述

3 回答

?
青春有我

TA贡献1784条经验 获得超8个赞

我发现--tree-filter其他答案中使用的选项可能非常慢,尤其是在具有大量提交的大型存储库中。


这是我使用--index-filter选项可以从git历史记录中完全删除目录的方法,该方法运行起来要快得多:


# Make a fresh clone of YOUR_REPO

git clone YOUR_REPO

cd YOUR_REPO


# Create tracking branches of all branches

for remote in `git branch -r | grep -v /HEAD`; do git checkout --track $remote ; done


# Remove DIRECTORY_NAME from all commits, then remove the refs to the old commits

# (repeat these two commands for as many directories that you want to remove)

git filter-branch --index-filter 'git rm -rf --cached --ignore-unmatch DIRECTORY_NAME/' --prune-empty --tag-name-filter cat -- --all

git for-each-ref --format="%(refname)" refs/original/ | xargs -n 1 git update-ref -d


# Ensure all old refs are fully removed

rm -Rf .git/logs .git/refs/original


# Perform a garbage collection to remove commits with no refs

git gc --prune=all --aggressive


# Force push all branches to overwrite their history

# (use with caution!)

git push origin --all --force

git push origin --tags --force

您可以使用以下命令检查存储库的大小gc:


git count-objects -vH


查看完整回答
反对 回复 2019-10-04
  • 3 回答
  • 0 关注
  • 1016 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信