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

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

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

    我希望两个分支 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  
       271 天前
    要么把 test 放到第三个分支,要么用 CI/CD 工具去手动同步。
    kera0a
        2
    kera0a  
       271 天前 via iPhone
    子模块应该可以吧

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

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

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

    remote 一般只有一个,GitHub Action 啥的都可以实现
    Xu3Xan89YsA7oP64
        12
    Xu3Xan89YsA7oP64  
       271 天前
    从两个分支的公共 base 创建一个公共分支 Father 出来,从 Father 上 拉一个开发分支 Child 出来,把你需要同步的文件放到 Child 上,C 合并到 F 之后自动同步到你的两个开发分支
    至于怎么自动,自己研究下吧,最次也能写脚本调 openapi 实现。
    MAGA2022
        13
    MAGA2022  
       250 天前
    我觉得你要的是 git worktree
    https://git-scm.com/docs/git-worktree
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2431 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 16:04 · PVG 00:04 · LAX 08:04 · JFK 11:04
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.