猿问

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

我在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/1588371

Gist似乎在运行脚本后在哪里工作,它表明它删除了该文件夹,并表明修改了50个不同的提交。但这并没有让我推送该代码。当我尝试推动它时,它说Branch up to date但显示对50个提交进行了修改git status。其他2种方法也无济于事。


现在,即使显示它摆脱了该文件夹的历史记录,当我在本地主机上检查该存储库的大小时,它仍约为6MB。(我也删除了该refs/original文件夹,但没有看到存储库大小的变化)。


我要澄清的是,是否有一种方法不仅可以消除提交历史记录(这是我认为唯一发生的事情),而且可以摆脱那些git一直假设要回滚的文件。


可以说为此提供了一个解决方案,该解决方案已在我的本地主机上应用,但无法复制到该GitHub存储库,是否可以克隆该存储库,回滚到第一个提交执行该技巧并将其推送(或者这意味着git将还有所有这些提交的历史吗?-又名6MB)。


我的最终目标是从根本上找到摆脱git中文件夹内容的最佳方法,以便用户不必下载6MB的内容,而仍然可以拥有从未触及modules文件夹的其他提交(这很漂亮很多))在git的历史中。


我怎样才能做到这一点?


狐的传说
浏览 1025回答 3
3回答

青春有我

我发现--tree-filter其他答案中使用的选项可能非常慢,尤其是在具有大量提交的大型存储库中。这是我使用--index-filter选项可以从git历史记录中完全删除目录的方法,该方法运行起来要快得多:# Make a fresh clone of YOUR_REPOgit clone YOUR_REPOcd YOUR_REPO# Create tracking branches of all branchesfor 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 -- --allgit for-each-ref --format="%(refname)" refs/original/ | xargs -n 1 git update-ref -d# Ensure all old refs are fully removedrm -Rf .git/logs .git/refs/original# Perform a garbage collection to remove commits with no refsgit gc --prune=all --aggressive# Force push all branches to overwrite their history# (use with caution!)git push origin --all --forcegit push origin --tags --force您可以使用以下命令检查存储库的大小gc:git count-objects -vH
随时随地看视频慕课网APP
我要回答