V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
git
Pro Git
Atlassian Git Tutorial
Pro Git 简体中文翻译
GitX
flyn
V2EX  ›  git

Git 删除最早一次提交的问题

  •  1
     
  •   flyn · 2020-06-18 21:06:13 +08:00 · 3187 次点击
    这是一个创建于 1378 天前的主题,其中的信息可能已经有所发展或是发生改变。

    求助 V 友们,我刚刚学了 Git 不久,可能遇到了非常蠢的问题,大佬轻点喷:

    由于不太了解原理,第一次 git commit 提交了一个大文件然后推送到了远程。然后在网上查资料,想在彻底删除这个大文件的基础上保留后面的所有 commit 。但是关于如下两个问题没有找到理想的解决方法。

    1. 查阅资料发现,想要删除中间的一个 commit,需要使用 git rebase -i <欲删除的 commit 对应的前一串 hash>,然后从 pick 改成 drop 之类的 balabala 。那么问题来了,我想删掉最早一个 commit,那么这个 commit 的前面已经没有提交记录了......所以该怎么做呢?

    2. 接上个问题,因为没有找到合适的方法,干脆降低期望值,直接新建一个分支,扔掉了之前所有的 commit 和旧分支。然后问题来了,大文件占用的空间依然没有减少。于是查资料,按照网上各种千篇一律转载的方法,比如这个https://www.jianshu.com/p/c699e83026c4,然后卡在了 git verify-pack -v .git/objects/pack/pack-<hash>.idx | sort -k 3 -n | tail -10 这步,提示我找不到文件。我已经填写了文件资源管理器中找到的占用空间最大的那个 .idx 文件对应的 dat 文件的 hash 了。那么我该如何做呢?

    8 条回复    2020-06-19 09:38:45 +08:00
    hantsy
        1
    hantsy  
       2020-06-18 21:07:58 +08:00   ❤️ 2
    git rebase -i --root
    monsterxx03
        2
    monsterxx03  
       2020-06-18 21:28:02 +08:00 via Android   ❤️ 1
    还可以用 git filter-repo 插件清理大文件
    AlisaDestiny
        3
    AlisaDestiny  
       2020-06-18 23:23:27 +08:00
    如果你 commit history 不重要,你可以直接删掉 repo,然后删除本地项目下的.git 目录。重新建立一个同名项目,git init ,git remote add origin.再 push 上去。
    Vegetable
        4
    Vegetable  
       2020-06-18 23:26:32 +08:00
    git gc --aggressivey 应能删掉不被引用的文件
    Ariver
        5
    Ariver  
       2020-06-19 06:27:23 +08:00 via iPhone
    最简单的重新初始化一个 repo
    msg7086
        6
    msg7086  
       2020-06-19 06:34:35 +08:00 via Android
    腾空间需要做一个很复杂的 gc,需要把没用的对象都强制过期才能 gc 掉。可以搜一下命令,我自己也记不住,得每次搜。
    baiyi
        7
    baiyi  
       2020-06-19 08:43:11 +08:00   ❤️ 1
    如果你已经重写了,并且保证没有分支或其他引用能指向,那就可以 gc,试试 git gc --prune=now
    vevlins
        8
    vevlins  
       2020-06-19 09:38:45 +08:00
    没解决过这种问题,提两个思路,不一定可行:
    1.试试 git revert 抵消掉第一次 commit,推到远程后删掉本地仓库,再用 git clone --depth 1 从远程仓库只拉取最近一次 commit
    2. git cherry-pick 把后面的 commit 都搬走,然后删掉原来的分支
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3317 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 39ms · UTC 11:24 · PVG 19:24 · LAX 04:24 · JFK 07:24
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.