我正在使用我的GitHub帐户上的存储库,这是我偶然发现的一个问题 .
-
Node.js项目,其中包含安装了几个npm软件包的文件夹
-
这些包位于
node_modules
文件夹中 -
将该文件夹添加到git repository并将代码推送到github(当时没有想到npm部分)
-
意识到您并不真正需要该文件夹作为代码的一部分
-
删除了该文件夹,推了它
在那个例子中,总git repo的大小大约是 6MB ,其中实际代码(除了该文件夹之外的所有代码)仅在 300 KB 左右 .
现在我正在寻找的是从git的历史中删除该包文件夹的细节的一种方法,所以如果有人克隆它,他们不必下载6mb的历史记录,他们将获得唯一的实际文件截至上次提交时将为300KB .
我查找了可能的解决方案并尝试了这两种方法
Gist似乎在运行脚本之后起作用,它表明它摆脱了该文件夹,之后它显示了50个不同的提交被修改 . 但它没有让我推动那些代码 . 当我试图推送它时,它说 Branch up to date
但是显示了50个提交被 git status
修改 . 其他两种方法也没有帮助 .
现在即使它显示它摆脱了该文件夹的历史记录,当我在我的localhost上检查该repo的大小时,它仍然是大约6MB . (我也删除了 refs/original
文件夹,但没有看到回购邮件大小的变化) .
我要澄清的是,如果有一种方法可以摆脱提交历史(这是我认为发生的唯一事情),而且那些文件git保持假设一个人想要回滚 .
让我们说一个解决方案是为此而呈现并应用于我的localhost但不能复制到该GitHub仓库,是否有可能克隆该repo,回滚到第一个提交执行技巧并推送它(或者这是否意味着git将仍然有所有这些提交的历史? - 又名.6MB) .
我的最终目标是基本上找到从git中删除文件夹内容的最佳方法,这样用户就不必下载6MB的东西,仍然可能有其他提交从未触及过模块文件夹(那很漂亮)他们中的所有人都在git的历史中 .
我怎样才能做到这一点?
6 回答
如果你在这里复制粘贴代码:
这是从历史记录中删除
node_modules
的示例我发现其他答案中使用的
--tree-filter
选项可能非常慢,特别是在具有大量提交的大型存储库中 .这是我使用
--index-filter
选项从git历史记录中完全删除目录的方法,该选项运行得更快:您可以在
gc
之前和之后检查存储库的大小:除了流行的答案above,我想为 Windows -systems添加一些注释 . 命令
完美 without any 修改!因此, you must not 使用
Remove-Item
,del
或其他任何内容而不是rm -rf
.如果需要指定文件或目录的路径,请使用 slashes ,如
./path/to/node_modules
我找到的最好和最准确的方法是下载bfg.jar文件:https://rtyley.github.io/bfg-repo-cleaner/
然后运行命令:
如果要删除文件,请使用delete-files选项:
完成复制和粘贴配方,只需在测试后添加注释中的命令(用于复制粘贴解决方案):
在此之后,您可以从.gitignore中删除“node_modules /”行
我使用git on windows从旧的C#项目中删除了bin和obj文件夹 . 小心
它通过删除git install文件夹中的usr / bin文件夹来破坏git安装的完整性 .