关于 git 项目拆分的精度问题

2020-01-02 11:23:41 +08:00
 JCZ2MkKb5S8ZX9pq
3530 次点击
所在节点    git
21 条回复
vanton
2020-01-02 11:26:54 +08:00
用 .gitignore
JCZ2MkKb5S8ZX9pq
2020-01-02 11:32:52 +08:00
@vanton ignore 的话不合适。不想共享不等于不想 git,log 我还是要的。
orzorzorzorz
2020-01-02 11:35:38 +08:00
项目公有一个,私有一个,公共部分第三个。
xuanbg
2020-01-02 11:40:14 +08:00
项目公共的一个,私有的一个,私有的引用公共的。
JCZ2MkKb5S8ZX9pq
2020-01-02 11:44:41 +08:00
@orzorzorzorz
@xuanbg

没太明白,打个比方啊。
共有的叫 utilities_share,私有的就是 utilities。
然后本地的话,utilities 做 git,同时把 share 的那个 clone 为 utilities 的子目录,是这样吗?
orzorzorzorz
2020-01-02 12:32:28 +08:00
私有 utilities_private,共有 utilities_public,两者公共部分 utilities_common,三个 git。
networm
2020-01-02 13:00:27 +08:00
将现有工具目录中的脚本按照功能分别放在自己的子目录中,统一管理。
然后将要分享的脚本所在的目录提取为仓库,与他人共享。
以后的所有提交先在统一的仓库里提交,然后再在共享的仓库中提交。
具体的做法有几种,我偏好嵌套 Git 仓库这种方式,这样永远只有一份代码,不冗余。简单说就是进入统一 Git 仓库中的要共享的脚本所在子目录,执行 git init 再建一个仓库,这个仓库用于分享。实测在 Git 2.20.1 中子目录的改动既可以在统一仓库中提交,也可以在子目录中的仓库提交。我使用这种方法管理博客的 Hugo 主题。
另一种方法就是拷贝文件来同步,不管是手动拷贝还是 rsync,将子目录中的文件拷贝到另一个仓库中提交即可。
JCZ2MkKb5S8ZX9pq
2020-01-02 13:47:07 +08:00
@orzorzorzorz 这样本地管理有点重复吧?
JCZ2MkKb5S8ZX9pq
2020-01-02 13:48:49 +08:00
@networm
我在子目录碰到过一次问题,比如我有一个 tool_A,已经单独作为项目 git 过。
然后把这个 tool_A 移入 utilities 作为子目录,utilities 好像会自动 ignore 这个 tool_A 目录。
JCZ2MkKb5S8ZX9pq
2020-01-02 13:54:32 +08:00
@networm
另外作为子目录提交,我有点纠结的一点就是单个文件就要分一个目录并且 git,看上去有点蛋疼。
以前我也嵌套 git 仓库,前一阵刚剥离了不少。嵌套的话 commit 记录不是会有重复嘛?虽然说根目录我基本只做备份用,但感觉有点累赘,所以前一阵分了一下目录,分了几个大块单独 git,然后从根目录 ignore 出去了。
janus77
2020-01-02 14:30:25 +08:00
git sub module
networm
2020-01-02 15:13:12 +08:00
@JCZ2MkKb5S8ZX9pq 必须保证父目录已经是 Git 仓库后才能把其他 Git 仓库拖动到子目录中,否则在 git init 时会忽略。
Git 必须要以目录为单位来管理,这个没办法,只能单文件也得放在一个目录里。
Commit 记录不重复,逻辑上是属于不同仓库的 Commit,另外,你不一定要两个仓库保持一起提交,完全可以按照不同频率提交,包含的文件改动会有多有少。
根目录最大的作用不是备份,而是将不同的功能脚本整合为统一的整体,实现聚合的功能,发挥 1+1>2 的效果。
JCZ2MkKb5S8ZX9pq
2020-01-02 15:17:42 +08:00
@networm
脚本整合,我基本都通过 sys path 来搞了。
虽然还是有不少项目都直接引用了自己的工具包,好处是更新直接起作用。但有利有弊,现在越来越发现工具包改动经常影响到旧项目。所以最近调整习惯,都把工具单拆一份放到项目里了。
JCZ2MkKb5S8ZX9pq
2020-01-02 15:20:01 +08:00
@janus77 这个倒第一次看到,有点意思。
JCZ2MkKb5S8ZX9pq
2020-01-02 15:36:18 +08:00
@networm
你看看楼上兄弟提的那个 submodule,比较类似嵌套的 git。

然后我提到的那个问题,想到另一个问题。其实类似一个版本管理的问题。
比如一个工具模块 A,有若干版本 A1.0,A2.0。
要向下兼容又很麻烦或者多余,总之各种理由吧,版本向下不兼容了。

旧项目 old1/old2/old3 使用的是 A1.0,新项目 new1/2/3 用的是 A2.0。

这时候其实面对几个需求。
一个是 A1.0 发现了 bug 修改好了,怎么同步赋予 old1/2/3。
另一个需求是如果这个 bug 在 A1.0 和 2.0 都存在,都要改。那如果 A 版本很多,这里怎么简化。
networm
2020-01-02 19:47:45 +08:00
@ JCZ2MkKb5S8ZX9pq 我用过子模块 git submodule,我觉得很不好用。
至于为什么都放在一个仓库里,建议阅读深入《持续交付》,这里面实际上存在太多坑了。这里的关键是集成,最终所有东西在一起完成功能,应该尽可能的将所有东西放在一个仓库中。

至于你说的这个版本维护问题,你可以参考 Python 2 3,使用两个长期发布分支维护 Bug 修改,在一个分支上改完了 Bug 同步到另一个分支。
我建议尽可能只维护一个版本,可以把老版本升级到新版本,所有人统一在一个版本,问题较少。具体实践可以参考 Google Piper。
networm
2020-01-02 20:09:19 +08:00
@JCZ2MkKb5S8ZX9pq 整合我指的是所有东西结合在一起使用有加成的效果,不单指 Python 路径引用。
secondwtq
2020-01-02 22:44:36 +08:00
楼主的工具之间应该是没啥依赖关系的,用 monorepo 必要性不大
不过全拆了太麻烦,所以可能只能 monorepo …
JCZ2MkKb5S8ZX9pq
2020-01-02 23:21:29 +08:00
@networm
ok 我再试试看
jackleeforce3615
2020-01-03 11:11:53 +08:00
git submodule

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

https://www.v2ex.com/t/634359

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

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

© 2021 V2EX