准备工作
最好先让每台引用了此仓库的电脑,先 git pull 一下,更新到最新状态
在主电脑上重写历史并强制推送
bash
# 1. 创建一个没有任何父提交的"孤儿分支"
git checkout --orphan new-main
# 2. 把当前工作区所有文件加入暂存区(会保留 .gitignore 规则)
git add -A
# 3. 创建全新的初始提交
git commit -m "Initial commit (history reset)"
# 4. 删除旧分支,并把当前分支改回原名
git branch -D master
git branch -m master
# 5. 强制推送,覆盖远程历史
git push -f origin master
# 6. 让远程本地引用也指向新的提交
git fetch origin
git branch --set-upstream-to=origin/master master
执行后,远程仓库只剩这一条新提交,.git/objects 里的旧对象在下次 GC 后会被真正释放,仓库体积会明显缩小
在另一台电脑上同步(不重新克隆)
关键动作:不要用 git pull(它会尝试做合并,因历史无关而失败),要用 fetch + reset。
bash
# 2. 拉取远程最新的引用,但先不合并
git fetch origin
# 3. 把本地分支硬重置到远程的新历史
git reset --hard origin/main
# 4. 清理可能残留的旧分支引用(可选)
git remote prune origin
执行后,这台电脑的本地分支也指向全新的初始提交,git log 只有一条记录,工作区文件内容保持最新状态
让两台电脑都释放磁盘空间
bash
git reflog expire --expire=now --all
git gc --prune=now --aggressive
让git服务器释放空间
bash
# 先进入git server容器
docker exec -it d1f7c7d93699 bash
# 去到仓库目录,释放空间
cd /data/git/repositories/<用户名>/<仓库名>.git
git reflog expire --expire-unreachable=now --all
git gc --prune=now