【问题标题】:Delete history in local repository instead of cloning it again with --depth 1删除本地存储库中的历史记录,而不是使用 --depth 1 再次克隆它
【发布时间】:2016-02-27 15:21:17
【问题描述】:

基本上是标题。

我只是将一些东西与我的 .gitignore 混合在一起,并将我的 .git 目录膨胀到 > 100mb(这是一个总共有 100 次提交的回购......)。

所以我是一个懒惰的人,想知道是否可以删除我的历史记录。我不想改变某些东西或东西,我只想缩小我的 .git 目录大小。

当没有办法做到这一点时,我只会 git clone --depth 1 我的 repo 以获得相同的效果。

【问题讨论】:

  • 为什么不用你想保留的文件开始一个新的仓库?
  • @Thilo 我看不到链接的问题如何回答我的问题。我不想重新初始化我的存储库,更不用说push -f 任何东西
  • 开始一个新的 repo 和扔掉所有历史有什么区别?
  • 11 个月 0 票?我是不是刚醒来就进入了磁盘空间无限的替代宇宙?

标签: git


【解决方案1】:

这是两个相互冲突的目标:

  • 删除历史意味着一个全新的回购(rm -Rf .gitgit init .):这意味着您必须使用git push --force强制推送您的新本地回购,破坏远程仓库的历史记录,

  • 保持远程仓库完好无损意味着在本地使用git clone --depth 1,即safe to do since Git 2.0, as I have documented here(即,您可以从本地浅层仓库推回远程仓库)

第二种方法似乎最安全:

  • 保留远程仓库
  • 在本地优化磁盘空间

注意:对于具有完整历史记录的本地存储库,单独使用 git gcgit repack 不足以真正缩小 .git 文件夹的大小。
见“git gc --aggressive vs git repack”。

git gc
git repack -Ad      # kills in-pack garbage
git prune           # kills loose garbage

(这对新克隆的 repo 没有多大作用,这只对你已经工作了一段时间的本地 repo 有效) 另外,如果您在过去进行过git filter-branch 之类的操作,您的.git 文件夹仍会保留一个类似.git/refs/original/ 的文件夹,如果您想减小.git/ 的大小,则需要删除该文件夹。


AFAIU 最初的问题以及我想如何做到这一点正是在不删除 .git 文件夹的情况下,只需删除 git 日志数据的本地副本以使其状态与 git clone --depth 1 之后的状态相同

见“Converting git repository to shallow?

你可以试试:

cd /my/repo
git show-ref -s HEAD > .git/shallow
git reflog expire --expire=0
git prune
git prune-packed

【讨论】:

  • AFAIU 原始问题以及我想如何做到这一点正是在不删除 .git 文件夹的情况下,只需删除 git log 数据的本地副本以使其状态 与@987654344 之后的状态相同@。到目前为止,gcrepack 将 .git 文件夹从 1.6G 减少到 0.5G,而使用新克隆时,它的大小小于 50Mb。而prune 不知何故将其恢复为 1.6G。
  • 好的,看起来git pull --depth 1 工作在一个简单的克隆存储库中,主库中的 1.6Gb 对象包在某种程度上是存储的差异,因为有一个不同的远程存储为“上游”
  • 即使在删除其他遥控器后,我仍然无法通过 git 命令删除 1.6Gb 包。
  • @int 并在 git 远程修剪上游之后?
  • 好消息:看起来像“将 git repo 转换为浅”是问题,答案是正确的,我只是没有正确执行它(合并冲突并在设置浅头时忘记了它)和破坏了我的回购。但是,它看起来仍然是正确的问题和正确的答案,谢谢。我还不能奖励积分,还有 15 小时。
猜你喜欢
  • 2015-05-29
  • 1970-01-01
  • 1970-01-01
  • 2015-01-12
  • 2022-01-07
  • 1970-01-01
  • 2016-10-07
  • 2023-03-31
  • 2011-10-18
相关资源
最近更新 更多