关于子模块和子树的信息有点令人困惑,常常是scornful而我只是想知道
什么是类库/框架的最佳git工作流程
子树和子模块似乎都是候选者,但有些人建议只将一切保存在一个存储库中。
方案
所以我有一个使用特定控件的WinForm项目,我希望单独管理该特定控件,使用测试工具,但是特定控件确实需要存在于主winform项目中,因为它对更新/测试很有用某些元素“活着”(例如具有复杂输入的东西)。
特定控件基于一个更通用的控件和我开发的框架,我想重用它。特定控件可以也可以重复使用
答案 0 :(得分:1)
最佳做法是尽可能使用单独的git repos。特别是如果你想使用像詹金斯这样的CBI工具。 Git子模块增加了很多复杂性。如果你是git的初学者,那么你的团队成员我强烈建议你不要使用子模块。
答案 1 :(得分:1)
有整个"项目"需要克隆和构建(通过构建服务器),包括其自定义类库"。有时构建服务器方法不受您的控制(即更改脚本以克隆多个回购)。
在这种情况下,必须添加类库#34;对于git repo但你想单独维护在这种情况下我发现了" git子树"是一个很好的解决方案。然而,这是一个混乱的地方。
如果你谷歌" git子树"你得到2个略有不同的结果
现在我欢迎澄清这个答案,但我的感觉是第二个已经取代了第一个。
我发现的关于如何使用git子树的最佳文章是here,还有关于git子树合并工作流here的非常详细的文章,它们都与 git子模块进行了比较,如果您有兴趣,可以在各自的文章中找到。
我现在如何使用
的摘要将我的类库的最新稳定版本引入主项目:
pullclasslibrary
推送我对主项目中的类库所做的任何更改:
pushclasslibrary
我如何到达
注意:它看起来令人生畏,但大部分都是"设置"并且它没有那么久
有两个单独的回购单,例如:
这里的目标是拥有" mainproject"包含来自" classlibrary"
的最新稳定代码进入你的主项目。 例如 " cd path / to / mainproject"
创建一个易于使用的"名称"您的班级图书?1
git remote add -f <a_remote_name> <your seperately maintained repo>
<强> e.g 强>
git remote add -f my_class_library path/to/classlibrary/.git
现在将其添加为子树
git subtree add --prefix <folder within main proj> <a_remote_name> <branch_in_class_library_you_want_to_track> --squash **?2**
<强> e.g。 强>
git subtree add --prefix source/libraries/class_library my_class_library stable --squash
现在我们执行一次提取,以便您的主项目完全了解类库和我们想要跟踪的分支
git fetch <a_remote_name> <branch_in_class_library_you_want_to_track>
<强> e.g。 强>
git fetch my_class_library stable
此时您只需拉动并按子树(库)
即可git subtree pull <folder within main proj> <a_remote_name> <branch_in_class_library_you_want_to_track> --squash
git subtree push <folder within main proj> <a_remote_name> <branch_in_class_library_you_want_to_track> --squash
我个人设置了一个bash别名,因为输入的内容很多:
例如
alias pullclasslib="git subtree pull --prefix source/libraries/class_library my_class_library stable --squash"
alias pushclasslib="git subtree push --prefix source/libraries/class_library my_class_library stable --squash"
那就是我如何到达那里:)
我跳过了一些细节,所以我强烈推荐reading the first article
<强>脚注:强>
?1 所以我们真的在创建一个&#34;远程&#34;就像&#34;起源&#34;是一个遥远的名字&#34;非常过分简化。 Git允许您创建任意数量的遥控器,因为它可以完全不同的存储库。默认&#34; git pull&#34;通常设置为&#34; git pull origin&#34;,其中origin是你克隆的git repo。
?2 --squash是可选的,值得自己阅读,但脏汇总是当你与--squash合并时,您转储提交历史记录。我个人的偏好是我不想要与我的主回购捆绑在一起的类库的丰富历史,它对我来说没有意义,最多我想要一个提交说&#34;拉最新版本班级图书馆&#34;。但是,如果我发现自己在主仓库中对类库进行了更改,并且我想将其推送到类库中,我确实希望将历史记录添加到它中。然而,我目前正在考虑压缩,以及它似乎推动我的主要回购的所有提交历史,就类库而言,这是没有意义的。所以我可能会坚持使用&#34;壁球&#34;的文章建议。双向。
<强> - UPDATE - 强>
我在壁球上改变了主意,我真的不建议在推动时省略它,因为它会占用你主要回购的所有历史记录,现在我已经做了几次,taints我班级图书馆的历史
稳定 请注意,这是您的类库回购中的一个分支,很可能您想跟踪&#34 ;主&#34;但我想在示例中创建一个明确的分离,所以我假装我的类库有一个名为&#34; stable&#34;的分支。如果这实际上造成了更多混淆,请道歉