删除本地存储库中的历史记录,而不是使用--depth 1再次克隆它

boo*_*oop 6 git

标题基本上.

我只是混一些事情与我.gitignore和我的臃肿.gitDIR到> 100MB(它与总喜欢100commits回购..).

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

当没有办法做到这一点时,我只是让git clone --depth 1我的回购获得同样的效果.

Von*_*onC 1

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

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

  • 保持远程存储库完整意味着在本地使用,从 Git 2.0 开始git clone --depth 1这是安全的,正如我在此处记录的那样(即,您可以从本地浅层存储库推回到远程存储库)

第二种方法似乎最安全:

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

注意:对于具有完整历史记录的本地存储库,git gc仅此一项git repack不足以真正缩小.git文件夹的大小。
参见“git gc --aggressivegit repack”。

git gc
git repack -Ad      # kills in-pack garbage
git prune           # kills loose garbage
Run Code Online (Sandbox Code Playgroud)

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


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

请参阅“将 git 存储库转换为浅层存储库?

你可以试试:

cd /my/repo
git show-ref -s HEAD > .git/shallow
git reflog expire --expire=0
git prune
git prune-packed
Run Code Online (Sandbox Code Playgroud)