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 · 5343 次点击
    这是一个创建于 371 天前的主题,其中的信息可能已经有所发展或是发生改变。

    背景:原始库作为 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  
       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 加同步脚本来维护。。
    jinqzzz
        16
    jinqzzz  
       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   ·   实用小工具   ·   5598 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 03:12 · PVG 11:12 · LAX 19:12 · JFK 22:12
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.