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

2024-03-29 13:07:51 +08:00
 ZedRover

我希望两个分支 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 不直接支持你描述的自动同步功能,但通过一些创造性的工作流管理和外部工具的辅助,可以实现类似的效果。每种方法都有其优缺点,选择哪一种取决于你的具体需求和团队工作流。

2982 次点击
所在节点    git
13 条回复
huangsijun17
2024-03-29 13:19:04 +08:00
要么把 test 放到第三个分支,要么用 CI/CD 工具去手动同步。
kera0a
2024-03-29 13:35:14 +08:00
子模块应该可以吧

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

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

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

remote 一般只有一个,GitHub Action 啥的都可以实现
Xu3Xan89YsA7oP64
2024-03-29 22:43:18 +08:00
从两个分支的公共 base 创建一个公共分支 Father 出来,从 Father 上 拉一个开发分支 Child 出来,把你需要同步的文件放到 Child 上,C 合并到 F 之后自动同步到你的两个开发分支
至于怎么自动,自己研究下吧,最次也能写脚本调 openapi 实现。
MAGA2022
2024-04-19 13:06:00 +08:00
我觉得你要的是 git worktree
https://git-scm.com/docs/git-worktree

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://ex.noerr.eu.org/t/1028084

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX