有没有办法减小git文件夹的大小?


Answers:


214

我不确定你想要什么。首先,当然,每次您提交/推送目录时,目录都会变得更大一点,因为该目录必须存储所有其他提交。

但是,您可能希望git gc使用它将“清理不必要的文件并优化本地存储库”(手册页)。

另一种可能是相关的命令是git clean删除从你的树(未跟踪文件手册页)。


30
git clean -d -f -x删除.gitignore等文件。例如,不属于git,Pods文件夹等的工作空间
Kalle 2013年

102
WARNING如通过@Kalle写入上述命令将删除EVERY >未跟踪<文件和目录在您的GIT ROOT只是“文件中列出的.gitignore”。Git不会跟踪的所有内容,无论是否列出该内容.gitignore都将被擦除。git clean -dfX(请注意的情况X)只会删除中具有适用规则的项目.gitignore请注意这个警告: 切勿在git clean没有任何运行它在交互模式下,用-i而不是-f,或至少首先进行试运行- -n用,然后再次-f
阿德里安·

5
或进行备份:-)
Mateen Ulhaq '17

61

跑:

git remote prune origin

删除所有过时的跟踪分支,这些分支已在删除,origin但仍在中本地可用remotes/origin

git gc --auto

G ^ arbage Ç ollection” -运行内务处理任务(压缩版本,排除松/不可访问的对象)。该--auto标志首先确定是否需要进行任何工作,如果不需要则退出而不进行任何操作。


4
对这些功能有一些解释吗?我知道我们可以为他们提供Google搜索并搜索其文档,但是在仅涉及代码或命令的情况下,通常会对其进行简短描述。
Dzhuneyt 2014年

28

其中一个场景,你的混帐回购协议将得到认真更大的每提交一个你在哪里犯的二进制文件,你经常产生。它们的存储效率不如文本文件高

另一个是在一个仓库中有大量文件(这是git限制),而不是几个仓库(作为子模块管理)。

git space的这篇文章中,AlBlue提到:

请注意,Git(以及Hg和其他DVCS)确实遇到了一个问题,即签入(大)二进制文件然后将其删除,因为即使它们不是最新的,它们仍会显示在存储库中并占用空间。 。

如果您的git repo中存储了很大的二进制文件,则可以考虑:

正如我提到“ 什么是Git中的文件限制(数量和大小)? ”,最近的(2015年,这个答案后5年)的Git LFS从GitHub是管理这些大型文件(通过存储它们的方式以外的Git存储库)。


1
如果您有常规添加/更新的大二进制文件(如图像),则git大文件支持会很有帮助。参见git-lfs.github.com。超级容易实现,由github支持。所有团队成员都需要安装它才能协同使用。
埃里克·伍兹

@EricWoods是的。我之前提到过Git-LFS(64次:stackoverflow.com/search? tab=newest&q=user%3a6309%20git-lfs )。我已经相应地编辑了这个旧答案。
VonC

哈,的确如此!有趣的是,一个9岁以上的答案仍然很有意义(现在与LFS信息更加相关)。
埃里克·伍兹

22

是的是的, git gc解决方案自然是

在本地-您可以删除本地存储库,然后再次克隆它,

但是这里还有更重要的事情...

您等待巨大的git和外部组件处理的秒数被收集到很长的时间,其中花费了数小时的无效时间,

从头开始创建一个新的(完全不是分支)的存储库,包括唯一的最新版本的文件,自然地,您将丢失所有历史记录,

但是当在代码世界中没有时间变得感伤时,每次提交或比较都没有必要拖延整个5年的代码,如果怀旧的话,您仍然可以将旧的git和externals存储在某个地方:]

但是,在某些时候,您确实必须继续前进:]

您的团队将感谢您!


12
完全同意,我们最近在一个旧的存储库中采用了这种方法,并且没有回头。好吧,主要是因为我们做不到,但是您知道我的意思:)
WhatIsHeDoing

13

运行此命令非常危险,但是会通过删除所有git恢复/备份文件来缩小存储库:

git reflog expire --expire=now --all && git gc --prune=now --aggressive

它将删除git用于从某个错误命令恢复存储库的所有文件,例如,如果这样做了git reset --hard,通常可以恢复丢失的文件。但是,如果您在执行git reset --hardgit reflog expire...命令之前执行操作,那么您将丢失所有内容。现在,您唯一的希望是使用一些工具来分析文件系统,并尝试恢复已删除的文件(如果未覆盖)。


3
我真的不会把这称为极端危险。我只是给它贴上一些您必须小心的标签。以我的经验,很少有人真正接触过reflog或无法访问的对象-甚至不知道它们是否存在或如何与它们交互,因此陷入了有用的情况,或者做得很糟糕低效的方式。我要说的是,如果您不知道并且不知道这些命令会做什么,那么您可以安全地运行它们!
克里斯·摩根

10

git clean -d -f -i 是最好的方法。

这将有助于以更可控的方式进行清洁。

-i 代表互动。


3
尽管OP的问题含糊不清,在这方面这是一个很好的答案,但我确实要指出,git clean清理目录不是为了清理仓库。对于盲目复制/粘贴的用户,请当心;这将删除您实际上可能希望在本地存储的未跟踪文件/目录。
sraboy

git clean -d -x -f如果您想进行深度清理,效果很好
Rishabh Jain

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.