我有一个GitHub回购用作多个项目的基础。我在回购中跟踪这些项目中的单独分支。这使我能够重用项目之间的公共部分,并轻松地在项目之间合并修复。
在实践中,这看起来像:
---------- ---------
| Remote | | Local |
---------- ---------
master
projectA => C:\Projects\ProjectA
projectB => C:\Projects\ProjectB
这个设置对我很有用,而且在大多数情况下,我很满意。有一件事困扰了我一段时间:我复制了我所拥有的每个项目的完整的本地回购,而我实际上只对此感兴趣在该项目的特定分支中。
因此,如果我的回购增加到10个项目的1GB,我将使用10GB的1GB代码。
有没有人建议我如何设置我的本地Git仓库以便摆脱这种冗余?
编辑: 要求是这些项目必须同时共存。我知道我可以切换分支,但这些项目使用npm / bower / gulp,然后我必须在每个交换机上运行。这不适合我的流程,它将成为在任何分支上快速修复的负担。
EDIT2: 关于代码重复的一些评论:repo包含一个WordPress模板,这意味着你最终会混合使用功能和设计。因此,设计(html,css,图像,脚本)在这些项目之间有所不同,但基础框架是共享的,大部分时间都保持不变。
所以从理论上讲,我可以将回购分拆成一个静态和动态的部分,但如果我必须去那里,我不认为游戏是值得的。
答案 0 :(得分:2)
在本地存储库中可以有多个工作树,因此您可以将同一个存储库(具有单个对象数据库)签出到多个工作树中,每个工作树都有自己的分支。
传统上,你会使用Git的--work-tree
option来做到这一点。如果您真的想要使用这些工作树,这可能会变得有点乏味。
但git-worktree
要救援!这是一个使用Git 2.5的新命令,允许您创建多个托管工作树,因此每个工作树在共享同一本地存储库时自行运行。 GitHub在命令上写了一个很好的introduction。
您可能拥有的另一个选项是拥有一个本地存储库,然后是该本地存储库的多个克隆。由于您可以在使用符号链接时进行本地克隆,因此您也可以共享同一个对象数据库。
当然,如果您实际上有多个单独的项目,那么您应该考虑创建多个单独的存储库。如果您有共享内容,则标识该内容并将其提取到您在每个项目中使用的公共存储库中。
答案 1 :(得分:1)
你发现了monorepo - 欢迎它的力量!
许多IT公司使用(或希望使用)单个仓库来保存所有代码,这种设置通常称为monorepo。 There is a lot of utility in monolithic source control,正如您已经找到的那样。
在我看来,同步整个项目是一个很小的代价。事实上,我并没有真正看到在分支机构中实现孤岛项目的理由 - 它们应该被分解为模块。如果你将它们放在分支机构中以加快构建时间或其他工具问题,那么有一堆专门用于处理monorepos的构建系统(Bazel,Buck,Pantsbuild,至少)。
磁盘存储很便宜并且下载发生一次然后只是那里的补充。这是一个很小的价格,可能不值得优化。我的建议是不要担心重复,直到它成为一个实际问题 - 它可能永远不会:)
答案 2 :(得分:0)
因此,如果我的回购增加到10个项目的1GB,我将使用10GB的1GB代码。
代码回购极不可能达到1GB。例如,Ruby一直到1998年的存储库只有177兆。
如果您提交图片,音频和视频等大型媒体文件,可能会遇到麻烦。这些将迅速膨胀存储库大小。为避免这种情况,请使用Git Large File Storage aka git-lfs。这允许您在git中存储大文件而不会使存储库膨胀。
有没有人建议如何设置我的本地Git仓库,以便我可以摆脱这种冗余?
不要单独检出每个分支,而是习惯在分支之间切换。
有时您可能想要切换,但是您还没有准备提交未提交的更改。你可以利用Git's stash来松开那未完成的工作。
或者,提交未完成的工作,在另一个分支中执行您需要的工作,当您返回时使用git commit --amend
添加到部分提交。
答案 3 :(得分:-1)
您可以尝试仅使用
克隆所需的特定分支git clone <url> --branch <branch> --single-branch <folder>