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

git 分离子文件夹导致的问题

  •  
  •   JCZ2MkKb5S8ZX9pq · 2020-12-27 07:02:38 +08:00 · 2427 次点击
    这是一个创建于 1188 天前的主题,其中的信息可能已经有所发展或是发生改变。
    • 有一个项目文件夹 Parent,其中有一个 child 文件夹。Parent 已经历过多次 commit,希望分离 child 为孤立的 git 。

    • 使用的方法是:

      • 复制 Parent 为副本
      • 在副本内过滤 git filter-branch --prune-empty --subdirectory-filter child
      • 这样获得的 child 看上去是对的
      • 再去 parent 里 ignore 掉 child 就好了
    • 但是隔了好久,发现有问题。因为 Parent 之前 commit 多次,而且有误操作,commit 了大文件进去。child 只有 20M,git 有 200M+。用了官方推荐的 BFG,的确能删除大文件,缩减到 100M,但还是很大。

    • 猜测可能是 filter 的问题,child 以外的子文件夹的 git 记录还在,虽然没有大文件,但也积少成多。

    提问

    • 现在还有没有办法理清 child 的 commit,使其摆脱 parent 的遗毒。

    • 用 BFG 能看到的那些大文件,直接用 git log 是看不到的,都是 child 目录以外的内容。child 的 git log 是干净的。但那些属于 parent 的记忆应该还保留在某处,怎么查看呢?

    9 条回复    2020-12-28 10:06:37 +08:00
    blakejia
        1
    blakejia  
       2020-12-27 09:47:15 +08:00
    git submodule?
    JCZ2MkKb5S8ZX9pq
        2
    JCZ2MkKb5S8ZX9pq  
    OP
       2020-12-27 09:50:31 +08:00
    @blakejia 现在已经不是拆分的问题了,是整理既有的 git 历史记录的问题。
    favourstreet
        3
    favourstreet  
       2020-12-27 10:04:54 +08:00 via Android   ❤️ 1
    如果楼主以为不该存在的文件实际上却是可达的,git 说什么也不会替你删除。如果是不可达的( unreachable, dangling ),git 不会自动删除还未过一个月期限和已经打包进 pack 的 object,所以,git reflog expire --expire=now --all ; git gc --prune=now ; git repack -a -d 来一套
    JCZ2MkKb5S8ZX9pq
        4
    JCZ2MkKb5S8ZX9pq  
    OP
       2020-12-27 12:11:15 +08:00
    @favourstreet 应该是远超一个月了,要不是用了 BFG,我都不知道以前竟然还把 pdf 和 psd 也 commit 了。

    现在从 git log 或者各个 gui 看,都只能看到 filter 的结果,也就是包含我目前目录的一些 commit 。
    请问具体我怎么能看到其他的内容呢?我 git 就用些基础功能,不太熟悉,请赐教。
    codehz
        5
    codehz  
       2020-12-27 13:08:56 +08:00
    (要不你去.git/objects 里找找大文件?然后 git cat-file 的方式看看是啥内容
    favourstreet
        6
    favourstreet  
       2020-12-27 13:19:05 +08:00
    @JCZ2MkKb5S8ZX9pq 我只能说从楼主的措辞来看 BFG 帮楼主看到了文件名,这意味着那些文件仍在 git 管理之下,楼主最好检查一下当初 subdirectory-filter 是否漏了什么,比如漏了 branch 或 tag 之类的 refs
    SoloCompany
        7
    SoloCompany  
       2020-12-27 17:56:55 +08:00
    用了 BFG 之后, BFG 的源文件也需要使用 filter-branch 删掉啊
    JCZ2MkKb5S8ZX9pq
        8
    JCZ2MkKb5S8ZX9pq  
    OP
       2020-12-27 21:18:29 +08:00
    @codehz

    的确大文件就是 objects 里,我不知道怎么看它到底是啥,原本是一整个 200M 的。我去搜下你说的这个命令。
    newdongyuwei
        9
    newdongyuwei  
       2020-12-28 10:06:37 +08:00
    推荐试试 git-filter-repo: https://github.com/newren/git-filter-repo
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   4090 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 05:21 · PVG 13:21 · LAX 22:21 · JFK 01:21
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.