Git使用经验总结8-Git仓库历史记录清除

1. 引言

因为一些原因,Git 历史提交记录中会包含一些敏感信息,比如名字、邮箱、代码等等,因此就想将这些历史记录删掉。删除特定的历史提交记录还是很困难的,笔者这里的做法是干脆彻底清除 Git 历史记录,只保留当前工作目录的最新快照,重新开始一个干净的提交历史。这样做还有一个好处,就是可以改善当前的 Git 仓库体积,尤其是对于 Git 提交历史不太重要的仓库而言。

2. 方案

在进行操作之前先备份好仓库,然后进入项目目录:

bash 复制代码
cd /path/to/your/project

删除现有的 .git 目录,这会清除所有 Git 历史:

bash 复制代码
rm -rf .git

重新初始化 Git 仓库:

bash 复制代码
git init

切换到主分支:

bash 复制代码
git checkout -b main

如果有需要,设置新的用户名和邮箱:

bash 复制代码
git config user.name "your-github-username"
git config user.email "your-github-username@users.noreply.github.com"

添加所有文件并提交:

bash 复制代码
git add .
git commit -m "Initial commit (clean snapshot)"

强制推送到 GitHub,覆盖远程仓库:

bash 复制代码
# 先关联远程仓库(如果之前有)
git remote add origin https://github.com/your-username/your-repo.git

# 强制推送(--force 或 -f)
git push --force --set-upstream origin main

注意在这个流程中,也可以不一次提交所有的文件。由于网络的原因,一次提交内容太大可能会失败,可以先提交一个文件即可。等确定git push成功后就可以按照正常的步骤进行提交了。并且后续提交如果 Git 仓库的单个文件很大,可以写个脚本一个一个提交,这样更加稳妥一些。笔者使用的脚本如下:

powershell 复制代码
# submit-files-one-by-one.ps1

# 获取当前目录下所有文件(不包括子目录)
$files = Get-ChildItem -Path . -File

if ($files.Count -eq 0) {
    Write-Host "⚠️  当前目录下没有文件。" -ForegroundColor Yellow
    exit 0
}

# 确保在 main 分支
git checkout main 2>$null
if ($LASTEXITCODE -ne 0) {
    Write-Host "❌ 无法切换到 main 分支。请确保已初始化仓库并创建 main 分支。" -ForegroundColor Red
    exit 1
}

# 远程仓库地址(自动获取)
$remoteUrl = git remote get-url origin 2>$null
if (-not $remoteUrl) {
    Write-Host "❌ 未设置远程仓库 origin。请先运行:git remote add origin <url>" -ForegroundColor Red
    exit 1
}

Write-Host "📤 准备逐个提交 $($files.Count) 个文件到 $remoteUrl ..." -ForegroundColor Cyan

foreach ($file in $files) {
    $filename = $file.Name
    Write-Host "`n--- 处理文件: $filename ---" -ForegroundColor Green

    # 添加单个文件
    git add -- "$filename"
    if ($LASTEXITCODE -ne 0) {
        Write-Host "⚠️  无法添加文件 $filename,跳过。" -ForegroundColor Yellow
        continue
    }

    # 提交
    $commitMessage = "Add $filename"
    git commit -m $commitMessage
    if ($LASTEXITCODE -ne 0) {
        Write-Host "⚠️  提交失败(可能无变更),跳过推送。" -ForegroundColor Yellow
        continue
    }

    # 推送 + 重试最多3次
    $retry = 3
    $success = $false
    while ($retry -gt 0 -and -not $success) {
        Write-Host "🚀 正在推送 '$filename' ... (剩余重试: $retry)" -ForegroundColor Blue
        git push origin main
        if ($LASTEXITCODE -eq 0) {
            $success = $true
            Write-Host "✅ 成功推送 '$filename'" -ForegroundColor Green
        } else {
            $retry--
            if ($retry -gt 0) {
                Write-Host "⏳ 推送失败,等待 5 秒后重试..." -ForegroundColor Yellow
                Start-Sleep -Seconds 5
            }
        }
    }

    if (-not $success) {
        Write-Host "❌ 文件 '$filename' 推送最终失败,请检查网络或手动处理。" -ForegroundColor Red
    }
}

Write-Host "`n🎉 所有文件处理完成!" -ForegroundColor Magenta

3. 其他

注意这种方式其实相当于重新初始化了 Git 仓库,如果存在另一个本地端git pull是不会成功的,因为本地历史和远程历史分叉了,无法进行合并;这时就用户需要更新仓库的话就要重新进行git clone

其实实现本文的功能的一个更加简单的方法是在托管仓库网站(例如 GitHub )上删除原仓库,然后重新创建一个同名仓库。不过笔者不太确定是不是真的能行,因为仓库是有人在使用的,要尽量避免地址失效。程序员应该都写过或者理解一个bug:删除对象后新建个同名的对象有时候会不成功。

相关推荐
正经教主2 小时前
【Git】Git05-04:Github分支管理与协作流程
git·github
sean9084 小时前
git filter-repo(优秀的 git repo 历史重写工具) 实战
git·repo·工具
hen3y4 小时前
清理 Git 代码库大文件历史记录
运维·git
小Lu的开源日常5 小时前
踩坑日记:为什么Git 突然 Push 不上去了
git·ssh·github
LZ7工作室6 小时前
MAC编程:在MACOS安装和使用 Git 的方法
网络·git·macos·github·个人开发
T***16078 小时前
Git增强现实案例
git·ar
Arva .10 小时前
git常用
git
久莜10 小时前
【Git】使用教程
git
果子火火10 小时前
Git clone couldn‘t connect to server
git