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

git 如何合并多个无关的仓库,形成一个仓库?

  •  
  •   sillydaddy · 2022-06-29 10:00:52 +08:00 · 3102 次点击
    这是一个创建于 888 天前的主题,其中的信息可能已经有所发展或是发生改变。

    应用场景是想偷懒把多个项目已经建好的仓库合并,用一个 git 仓库来管理,

    举例来说,原项目 1 的仓库在文件夹 repo1 ,原项目 2 在文件夹 repo2...,项目之间没有依赖关系。现在新建一个新文件夹 repo ,然后将 repo1 和 repo2 都作为子文件夹放到 repo 中。但是如何把项目 1 和项目 2 的历史提交记录合并到一起呢?

    17 条回复    2022-07-08 14:06:27 +08:00
    ihaoz
        1
    ihaoz  
       2022-06-29 10:05:34 +08:00
    git remote 设置远程仓库然后 merge 就行了,两个仓库所有的 commit 都会被保留。

    参考:
    https://segmentfault.com/a/1190000021919753
    noe132
        2
    noe132  
       2022-06-29 10:05:42 +08:00 via Android
    repo1 添加 repo2 为 remote ,然后 merge 进来就行了。
    FengMubai
        3
    FengMubai  
       2022-06-29 10:06:43 +08:00
    fpure
        4
    fpure  
       2022-06-29 10:07:05 +08:00
    也把 objects 目录拷进来,然后建分支就可以了
    Oktfolio
        5
    Oktfolio  
       2022-06-29 10:11:23 +08:00
    git merge <branch> --allow-unrelated-histories
    xtinput
        6
    xtinput  
       2022-06-29 10:12:43 +08:00
    git submodule
    dayeye2006199
        7
    dayeye2006199  
       2022-06-29 10:31:00 +08:00 via Android
    别用 submodule ,难用反直觉
    sillydaddy
        8
    sillydaddy  
    OP
       2022-06-29 12:22:20 +08:00
    @ihaoz
    @noe132
    试验了一下,补充一点,在 git merge --allow-unrelated-histories 之后,还需要使用 git mv 命令把文件移动到子文件夹。
    sillydaddy
        9
    sillydaddy  
    OP
       2022-06-29 12:25:01 +08:00
    Inf1nity
        10
    Inf1nity  
       2022-06-29 14:29:59 +08:00
    楼上说的很对,git submodule 的设计很反直觉,简而言之就是非常烂,如果有替代方案的话不建议使用。
    leo108
        11
    leo108  
       2022-06-29 14:32:27 +08:00
    git subtree
    sjhhjx0122
        12
    sjhhjx0122  
       2022-06-29 14:32:56 +08:00
    如果是前端项目 只是把所有库放一个仓库 monorepo 比如 pnpm 或者 lerna
    duke807
        13
    duke807  
       2022-06-29 15:47:56 +08:00 via Android
    @dayeye2006199
    @Inf1nity
    哪里反直覺,可以說說嗎?
    sillydaddy
        14
    sillydaddy  
    OP
       2022-06-30 08:49:12 +08:00
    @sjhhjx0122
    谢谢,我看看。
    alexsunxl
        15
    alexsunxl  
       2022-06-30 11:21:25 +08:00
    @dayeye2006199
    @Inf1nity
    @duke807

    说 submodule 难用可以。api 没那么方便也是。
    但改用的情况你也得用上呀。
    比如依赖他人的内部项目,不用 submodule 用啥。 直接拷贝过来,不得更新麻烦的吗?有些场景肯定用 submodule 方便呀
    这种内部的仓库又不是公开发布的包, 用包管理器就能更新
    Inf1nity
        16
    Inf1nity  
       2022-06-30 12:41:14 +08:00
    @alexsunxl #14 如果是本项目内部依赖别的项目 /仓库的话,子模块确实就是干这件事的最佳方案,但是楼主这里的前提是项目之间没有依赖关系,而且还要合并历史记录,这就有点复杂了,子模块不太能胜任这种场景。
    hpu423
        17
    hpu423  
       2022-07-08 14:06:27 +08:00
    https://cheatsheet.wang/ 看看里面的 submodule ,subtree 都可以满足,主要是滴耦合
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1007 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 21:46 · PVG 05:46 · LAX 13:46 · JFK 16:46
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.