git,我爱你, submodule 全是 bug,这回丢大了。 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
git
Pro Git
Atlassian Git Tutorial
Pro Git 简体中文翻译
GitX
andyJado
V2EX    git

git,我爱你, submodule 全是 bug,这回丢大了。

  •  1
     
  •   andyJado 2024-01-16 16:53:29 +08:00 5986 次点击
    这是一个创建于 639 天前的主题,其中的信息可能已经有所发展或是发生改变。

    背景:原始库作为 submodule 在父 repo 下面。

    行为:本地 commit 了没有 push ,父 repo cehck 一下别的 branch ,check 回来。

    结果:submodule 所在文件空了,丢失了 commit 但没 push 的历史。

    28 条回复    2024-01-17 20:15:19 +08:00
    Aurora0
        1
    Aurora0  
       2024-01-16 17:02:18 +08:00
    JetBrains 家的软件有本地历史记录可以找回的
    KevinLock
        2
    KevinLock  
       2024-01-16 17:02:23 +08:00   1
    git reflog 找一下看能恢复吗?
    试着用 subtree 吧,submodule 坑太多了
    wgbx
        3
    wgbx  
       2024-01-16 17:03:36 +08:00
    git 只要 commit 就能找回来,有操作历史命令的,试试 git reflog
    wgbx
        4
    wgbx  
       2024-01-16 17:04:40 +08:00
    找到哈希 commit ,cherry-pick 啥的都可以弄回来
    konakona
        5
    konakona  
       2024-01-16 17:27:36 +08:00   4
    因为你本地 submodule 是游离分支吧,所以会丢失,但凡在你丢失之前执行一次 git log 看下 commit id ,这样一来在你发生“丢失”的时候,可以用 git cherry-pick 旧回来。

    还是学而不精啊…
    qqjt
        6
    qqjt  
       2024-01-16 17:29:26 +08:00   1
    本地 commit 的时候,不先 commit submodule 的吗
    kneep
        7
    kneep  
       2024-01-16 17:38:39 +08:00 via iPhone
    git reflog
    woodfizky
        8
    woodfizky  
       2024-01-16 18:03:41 +08:00
    本地 commit 过用 git 可以找回来。

    本地没 commit 过但是用的 jetbrains 的 IDE 可以用 local history 找回来。这个也是我本地忘了 commit 拉代码导致丢代码才发现的,本来都万念俱灰了。
    xfn
        9
    xfn  
       2024-01-16 20:29:15 +08:00   1
    可以看看 google 的 repo ,android 和 chromium 的源代码都是它管理的,每个项目都是由上百个的 git 仓库组成。我们自己的工程管理中也用得很顺
    MajestySolor
        10
    MajestySolor  
       2024-01-16 21:00:15 +08:00   1
    git 的 submodule 是巨坑,碰过一次就再也不想用了
    SingeeKing
        11
    SingeeKing  
    PRO
       2024-01-16 21:13:24 +08:00 via iPhone
    应该有 reflog ,checkout 会一并改 submodule 指向的 commit ,但是 commit 过不太容易丢
    Inf1nity
        12
    Inf1nity  
       2024-01-16 22:29:44 +08:00
    git submodule 确实是有挺多坑的,部分操作行为和结果非常反直觉。
    kennir
        13
    kennir  
       2024-01-16 22:31:34 +08:00
    submodule 问题太多了,我们用 git-repo 管理多仓库,配合 codeup 还不错
    tolbkni
        14
    tolbkni  
       2024-01-16 22:35:25 +08:00
    直接在 submodule 里改东西?我一般是会把 submodule 里的 repo 单独放个文件夹,所有改动在单独的 repo 里做,然后 push 到服务器上,submodule 只从服务器上拉取
    Maboroshii
        15
    Maboroshii  
       2024-01-17 00:30:49 +08:00 via Android
    submodule 概念的确难理解,我觉得不如 gitignore 加同步脚本来维护。。
    filtrate
        16
    filtrate  
       2024-01-17 07:51:01 +08:00 via iPhone
    repo 确实是个不错的替代/解决方案
    andyJado
        17
    andyJado  
    OP
       2024-01-17 08:18:10 +08:00
    @konakona
    @qqjt
    @KevinLock
    @wgbx
    父 repo 的 reflog 只记录一个 hash ,撒毛利的.git 都没了我 gi 啥有用?
    icegogh
        18
    icegogh  
       2024-01-17 08:20:56 +08:00 via Android
    git sub 相关的 api 水有点深,建议一般不到精通 git 的程度 不要触及
    retanoj
        19
    retanoj  
       2024-01-17 09:28:22 +08:00
    我想复现一下 OP 的操作,但有点没看明白。

    本地修改了 submodule 并 add && commit 了,在父 repo 的 status 里会显示一个修改。这时候父进行 checkout branch 这个修改会带过去的吧?为啥会丢呢?
    lvjiaxuan818
        20
    lvjiaxuan818  
       2024-01-17 09:32:32 +08:00   1
    submodule 已经不用了,workspace 你值得拥有。
    lisxour
        21
    lisxour  
       2024-01-17 09:48:41 +08:00
    给我的感觉是误操作导致的
    HangoX
        22
    HangoX  
       2024-01-17 10:09:15 +08:00
    subTree 好用点,对于本地来说没有任何感知
    andyJado
        23
    andyJado  
    OP
       2024-01-17 10:36:33 +08:00
    你 check 了一个新的 branch ,我 check 的是老 branch ,该 bc 我切出来的时候还没有 add submodule 。

    我看你回复后又去复现了一下,会丢。
    cloudzhou
        24
    cloudzhou  
       2024-01-17 12:42:07 +08:00
    @andyJado 复现你的操作,不管怎么切换 submodule 都保持了当时的一个 commit ,除非 reset hard ,不知道你怎么丢失的
    andyJado
        25
    andyJado  
    OP
       2024-01-17 14:39:42 +08:00
    @cloudzhou

    我又重建新两个 repo ,复现成功。

    关键:branch0 没有 submodule ,切 branch1 add & commit submodule ,回到 branch0 ,没有撒毛利。再回到 branch1 ,本地的 sumoli 空了,.git 都没有。
    konakona
        26
    konakona  
       2024-01-17 15:21:22 +08:00
    要不试试 `git fsck --lost-found`,这将列出孤立的 commit 和其他对象。

    在 `.git/lost-found/commit/` 目录下你可能会找到你丢失的 commit 对象。

    以上来自 chatGPT 。
    owt5008137
        27
    owt5008137  
       2024-01-17 17:43:10 +08:00 via Android
    子 repo 的 reflog 里有。默认设置映像中 3 天内都是不会 gc 掉的
    exch4nge
        28
    exch4nge  
       2024-01-17 20:15:19 +08:00
    @andyJado #25 好奇试了下,切换到没有 submodule 的分支时,会提示 warning: unable to rmdir 'a': Directory not empty ,分支切换成功但是 submodule 对应目录还在
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5625 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 34ms UTC 06:38 PVG 14:38 LAX 23:38 JFK 02:38
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86