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

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

  •  1
     
  •   andyJado · 337 天前 · 5288 次点击
    这是一个创建于 337 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

    还是学而不精啊…
    qqjt
        6
    qqjt  
       337 天前   ❤️ 1
    本地 commit 的时候,不先 commit submodule 的吗
    kneep
        7
    kneep  
       337 天前 via iPhone
    git reflog
    woodfizky
        8
    woodfizky  
       336 天前
    本地 commit 过用 git 可以找回来。

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

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

    我看你回复后又去复现了一下,会丢。
    cloudzhou
        24
    cloudzhou  
       336 天前
    @andyJado 复现你的操作,不管怎么切换 submodule 都保持了当时的一个 commit ,除非 reset hard ,不知道你怎么丢失的
    andyJado
        25
    andyJado  
    OP
       336 天前
    @cloudzhou

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

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

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

    以上来自 chatGPT 。
    owt5008137
        27
    owt5008137  
       336 天前 via Android
    子 repo 的 reflog 里有。默认设置映像中 3 天内都是不会 gc 掉的
    exch4nge
        28
    exch4nge  
       335 天前
    @andyJado #25 好奇试了下,切换到没有 submodule 的分支时,会提示 warning: unable to rmdir 'a': Directory not empty ,分支切换成功但是 submodule 对应目录还在
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4951 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 09:45 · PVG 17:45 · LAX 01:45 · JFK 04:45
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.