【发布时间】:2020-01-21 02:37:33
【问题描述】:
似乎我的项目随着每个 git commit/push 越来越大。有没有办法清理我的 git 文件夹?
【问题讨论】:
标签: git
似乎我的项目随着每个 git commit/push 越来越大。有没有办法清理我的 git 文件夹?
【问题讨论】:
标签: git
我不确定你想要什么。首先,当然,每次提交/推送时,目录都会变大一些,因为它必须存储每个额外的提交。
但是,您可能想要git gc,它将“清理不必要的文件并优化本地存储库”(manual page)。
另一个可能相关的命令是git clean,它将删除您树中未跟踪的文件 (manual page)。
【讨论】:
WARNING@Kalle 上面写的命令将删除你的 GIT 根目录中的每个>未跟踪的,不只是“.gitignore 中列出的文件”。任何未被 Git 跟踪的东西,无论它是否在 .gitignore 中列出,都将被擦除。 git clean -dfX(注意X 上的大小写)只会删除在.gitignore 中具有适用规则的项目。 请注意这个警告: 永远不要运行git clean而不是在交互模式下运行它,用-i而不是-f,或者至少先做一个空运行——-n然后再次使用-f。
运行:
git remote prune origin
删除已在origin 删除但在remotes/origin 本地仍可用的所有过时跟踪分支。
git gc --auto
'G arbage C ollection' - 运行管理任务(压缩修订,删除松散/无法访问的对象)。 --auto 标志首先确定是否需要任何工作,如果不需要,则不做任何事情退出。
【讨论】:
你的 git repo 会随着每次提交而严重变大的一种情况是你提交定期生成的二进制文件。 Their storage won't be as efficient than text file.
另一种情况是,您在 一个 存储库(limit of git)中拥有大量文件,而不是多个子存储库 (managed as submodules)。
在article on git space 中,AlBlue 提到:
请注意,Git(以及 Hg 和其他 DVCS)确实存在一个问题,即(大型)二进制文件被签入,然后被删除,因为它们仍会出现在存储库中并占用空间,即使它们'不是当前的。
如果您的 git 存储库中存储了大型二进制文件,您可以考虑:
git filter-branch(警告:这将重写历史记录,如果您已经推送了您的 repo 并且其他人已经从中提取了,这很糟糕)正如我在“What are the file limits in Git (number and size)?”中提到的,最近(2015 年,此答案后 5 年)来自 GitHub 的Git LFS 是一种管理这些大文件的方法(通过将它们存储在外部 Git 存储库)。
【讨论】:
是的,git gc 自然是解决方案,
在本地 - 您可以删除本地存储库并再次克隆它,
你等待巨大的 git 和外部处理的秒数被收集到很长的分钟,而这些时间被收集到花费数小时的低效时间,
从头开始创建一个新的(完全,而不仅仅是一个分支)存储库,包括唯一最新版本的文件,自然你'将失去所有的历史,
但是当在代码世界中不是时候变得多愁善感时,每次提交或差异都拖累整个 5 年的代码是没有意义的, 如果你怀旧的话,你仍然可以将旧的 git 和外部存储在某个地方:]
但是,在某些时候你真的必须继续前进:]
你的团队会感谢你的!
【讨论】:
运行此命令非常危险,但会通过删除所有 git 恢复/备份文件来缩小存储库:
git reflog expire --expire=now --all && git gc --prune=now --aggressive
它将清除 git 用于从某些错误命令中恢复存储库的所有文件,例如,如果您执行了 git reset --hard,则通常可以恢复丢失的文件。但是如果你在git reflog expire... 命令之前执行git reset --hard,那么你就失去了一切。现在,您唯一的希望是使用一些工具来分析您的文件系统并尝试恢复已删除的文件(如果它们没有被覆盖)。
【讨论】:
git clean -d -f -i 是最好的方法。
这将有助于以更可控的方式进行清洁。
-i 代表交互式。
【讨论】:
git clean 与其说是清理存储库,不如说是清理目录。对于盲目复制/粘贴的用户,请注意;这会删除您在本地可能真正需要的未跟踪文件/目录。
不知道会不会缩水,但是我跑git clean之后,也经常做git repack -ad,这样可以减少pack文件的数量。
【讨论】:
git gc 进程的一部分,所以不需要单独运行