GIT 能不能两个分支共享文件 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
git
Pro Git
Atlassian Git Tutorial
Pro Git 简体中文翻译
GitX
ZedRover
V2EX    git

GIT 能不能两个分支共享文件

  •  
  •   ZedRover 2024-03-29 13:07:51 +08:00 3056 次点击
    这是一个创建于 563 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我希望两个分支 src 文件夹下的文件各自开发,test 文件夹下的文件在一个分支更新时另一个分支也自动更新,git 能否实现这种功能。如果 git 不能实现,有什么其他的工具能够实现么?

    chatgpt 的回答感觉都不太方便。

    使用子模块( Git Submodules ) 一个可能的解决方案是将 test 文件夹作为一个独立的 Git 仓库(子模块),然后在你的主仓库中以子模块的形式引入它。这样,不管是在哪个分支上对 test 子模块进行更新,只要提交了更新并推送到远程仓库,其他分支就可以通过更新子模块来获取这些更改。

    创建 test 的独立仓库:首先,你需要将 test 文件夹提取出来,使其成为一个独立的 Git 仓库。 在主仓库中添加子模块:然后,在你的主仓库中,使用 git submodule add <repository-url> <path>命令添加这个 test 仓库作为子模块。 更新子模块:当 test 仓库更新后,你需要在主仓库中手动更新子模块引用,通常是通过 git submodule update --remote 命令。 使用 Git Hooks 另一个方案是使用 Git 钩子( hooks ),特别是 pre-commit 钩子,在每次提交前自动检查 test 文件夹的更改,并将这些更改复制到另一个分支。这种方法需要编写自定义脚本,并且可能会复杂且难以管理。

    使用外部同步工具 如果这些 Git 内置的解决方案不满足需求,你可以考虑使用外部的文件同步工具,比如 rsync (适用于 Unix-like 系统),或者开发一个自定义的脚本,用来监控 test 文件夹的更改,并自动将这些更改同步到其他分支或仓库。这可能涉及到复杂的逻辑,特别是在处理并发更改和冲突解决时。

    考虑工作流调整 最后,值得考虑的是,如果你经常需要在分支之间同步特定文件夹的更改,可能需要重新考虑你的开发工作流。可能的调整包括重新组织项目结构,使得需要同步的文件夹更容易管理,或者调整团队的分支策略,以减少需要这种类型同步的场景。

    总的来说,虽然 Git 不直接支持你描述的自动同步功能,但通过一些创造性的工作流管理和外部工具的辅助,可以实现类似的效果。每种方法都有其优缺点,选择哪一种取决于你的具体需求和团队工作流。

    13 条回复    2024-04-19 13:06:00 +08:00
    huangsijun17
        1
    huangsijun17  
       2024-03-29 13:19:04 +08:00
    要么把 test 放到第三个分支,要么用 CI/CD 工具去手动同步。
    kera0a
        2
    kera0a  
       2024-03-29 13:35:14 +08:00 via iPhone
    子模块应该可以吧

    或者 test 文件夹从 git 中排除,让 git 不要管理,这样每个分支的代码都访问同一份 test 。

    然后 test 传到你用的语言的包管理工具,有更新自动拉取,或你自己写个自动脚本。
    hello2090
        3
    hello2090  
       2024-03-29 13:35:18 +08:00
    clearcase 可以
    nulIptr
        4
    nulIptr  
       2024-03-29 13:41:05 +08:00
    可以参考算法做微调的时候的做法吗,test 文件夹是 nas 之类的远程文件系统。所有人都操作这个玩意
    jgh004
        5
    jgh004  
       2024-03-29 13:43:21 +08:00
    不能
    zhtyytg
        6
    zhtyytg  
       2024-03-29 13:45:32 +08:00
    需求:两个分支 src 文件夹下的文件各自开发,test 文件夹下的文件在一个分支更新时另一个分支也自动更新。
    分析:其实你只是希望 test 独立于 src 管理
    src 里面的作为 submodule ,test 还是在根目录 git 上,是否可以满足?
    dallaslu
        7
    dallaslu  
       2024-03-29 14:37:55 +08:00
    submodule
    52icarus
        8
    52icarus  
       2024-03-29 17:52:48 +08:00
    这种需求其实是 svn 的强项. 使用 svn 外链来比较方便.如果是使用 git .其实使用 submodule 也不方便.不如直接用 mklink 来做个链接(windows). linux macos 可以直接用软链接
    realJamespond
        9
    realJamespond  
       2024-03-29 18:11:24 +08:00
    gitignore 加上要共享的文件,然后在 githook 里 pull 时 rsync 或其它方法同步这个文件
    tuutoo
        10
    tuutoo  
       2024-03-29 22:06:29 +08:00 via Android
    那两个仓库。一个库把 test 在 gitignore 中排除,把 test 目录用另一个仓库去管理。
    ETiV
        11
    ETiV  
       2024-03-29 22:38:09 +08:00 via iPhone
    如果你有 remote 的话,在 remote 做 hook 就行:a 分支目录有变更就往 b 分支的相同路径同步内容,反之 b 有变更就往 a 同步

    不推荐在本地做 hook:烦在每个人都需要做一次

    remote 一般只有一个,GitHub Action 啥的都可以实现
    Xu3Xan89YsA7oP64
        12
    Xu3Xan89YsA7oP64  
       2024-03-29 22:43:18 +08:00
    从两个分支的公共 base 创建一个公共分支 Father 出来,从 Father 上 拉一个开发分支 Child 出来,把你需要同步的文件放到 Child 上,C 合并到 F 之后自动同步到你的两个开发分支
    至于怎么自动,自己研究下吧,最次也能写脚本调 openapi 实现。
    MAGA2022
        13
    MAGA2022  
       2024-04-19 13:06:00 +08:00
    我觉得你要的是 git worktree
    https://git-scm.com/docs/git-worktree
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5427 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 07:40 PVG 15:40 LAX 00:40 JFK 03:40
    Do have faith in what you're doing.
    ubao 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