【问题标题】:Is there a way to reduce the size of the git folder?有没有办法减小 git 文件夹的大小?
【发布时间】:2020-01-21 02:37:33
【问题描述】:

似乎我的项目随着每个 git commit/push 越来越大。有没有办法清理我的 git 文件夹?

【问题讨论】:

    标签: git


    【解决方案1】:

    我不确定你想要什么。首先,当然,每次提交/推送时,目录都会变大一些,因为它必须存储每个额外的提交。

    但是,您可能想要git gc,它将“清理不必要的文件并优化本地存储库”(manual page)。

    另一个可能相关的命令是git clean,它将删除您树中未跟踪的文件 (manual page)。

    【讨论】:

    • git clean -d -f -x 删除 .gitignore 等中列出的文件。例如。不属于 git、Pods 文件夹等的工作空间。
    • WARNING@Kalle 上面写的命令将删除你的 GIT 根目录中的每个>未跟踪的,只是“.gitignore 中列出的文件”。任何未被 Git 跟踪的东西,无论它是否在 .gitignore 中列出,都将被擦除。 git clean -dfX(注意X 上的大小写)只会删除在.gitignore 中具有适用规则的项目。 请注意这个警告: 永远不要运行git clean而不是在交互模式下运行它,用-i而不是-f,或者至少先做一个空运行——-n然后再次使用-f
    • 或者做一个备份:-)
    【解决方案2】:

    运行:

    git remote prune origin
    

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

    git gc --auto
    

    'G arbage C ollection' - 运行管理任务(压缩修订,删除松散/无法访问的对象)。 --auto 标志首先确定是否需要任何工作,如果不需要,则不做任何事情退出。

    【讨论】:

    • 对这些功能的一些解释?我知道我们可以用 Google 搜索他们并搜索他们的文档,但通常的做法是在仅涉及代码或命令时提供简短的答案描述。
    【解决方案3】:

    你的 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 存储库中存储了大型二进制文件,您可以考虑:

    正如我在“What are the file limits in Git (number and size)?”中提到的,最近(2015 年,此答案后 5 年)来自 GitHub 的Git LFS 是一种管理这些大文件的方法(通过将它们存储在外部 Git 存储库)。

    【讨论】:

    • 如果您经常添加/更新大型二进制文件(如图像),那么 git 大文件支持会很有帮助。见git-lfs.github.com。超级容易实现,由 github 支持。所有团队成员都需要安装它才能协作使用它。
    • @EricWoods 是的。我之前提到过 Git-LFS(64 次:stackoverflow.com/search?tab=newest&q=user%3a6309%20git-lfs)。我已经相应地编辑了这个旧答案。
    • 哈,确实!有趣的是,一个 9 岁以上的答案仍然相关(现在更重要的是 LFS 信息)。
    【解决方案4】:

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

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

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

    你等待巨大的 git 和外部处理的秒数被收集到很长的分钟,而这些时间被收集到花费数小时的低效时间,

    从头开始创建一个新的(完全,而不仅仅是一个分支)存储库,包括唯一最新版本的文件,自然你'将失去所有的历史,

    但是当在代码世界中不是时候变得多愁善感时,每次提交或差异都拖累整个 5 年的代码是没有意义的, 如果你怀旧的话,你仍然可以将旧的 git 和外部存储在某个地方:]

    但是,在某些时候你真的必须继续前进:]

    你的团队会感谢你的!

    【讨论】:

    • 完全同意,我们最近在旧存储库中采用了这种方法,并且没有回头;好吧,主要是因为我们不能,但你知道我的意思:)
    【解决方案5】:

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

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

    它将清除 git 用于从某些错误命令中恢复存储库的所有文件,例如,如果您执行了 git reset --hard,则通常可以恢复丢失的文件。但是如果你在git reflog expire... 命令之前执行git reset --hard,那么你就失去了一切。现在,您唯一的希望是使用一些工具来分析您的文件系统并尝试恢复已删除的文件(如果它们没有被覆盖)。

    【讨论】:

    • 我真的不会说这非常危险。我只是将它标记为您必须小心的东西。根据我的经验,很少有人真正接触过 reflog 或无法访问的对象——大多数人甚至不知道它们在那里或如何与它们交互,因此陷入了它们有用的情况,或者做事非常糟糕低效的方式。我什至会说,如果你不知道也无法弄清楚这些命令会做什么,那么你可以安全地运行它们!
    【解决方案6】:

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

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

    -i 代表交互式。

    【讨论】:

    • 虽然 OP 的问题含糊不清,在这方面这是一个很好的答案,但我确实想指出 git clean 与其说是清理存储库,不如说是清理目录。对于盲目复制/粘贴的用户,请注意;这会删除您在本地可能真正需要的未跟踪文件/目录。
    • git clean -d -x -f 如果你想深度清洁效果很好
    【解决方案7】:

    不知道会不会缩水,但是我跑git clean之后,也经常做git repack -ad,这样可以减少pack文件的数量。

    【讨论】:

    • repack 是git gc 进程的一部分,所以不需要单独运行
    猜你喜欢
    • 1970-01-01
    • 2019-12-05
    • 1970-01-01
    • 1970-01-01
    • 2022-08-19
    • 2022-08-23
    • 1970-01-01
    • 2019-08-20
    • 2021-09-24
    相关资源
    最近更新 更多