我正在开发一个复杂的离子项目.我正在开发的许多组件和提供程序都是通用的,可以在我公司正在进行的其他项目中使用.这在软件开发中很常见.这是我提出的Git工作流程(此图显示了分支):
my-company-library-repo ----
|_ component 1 feature branch
|_ company component 1 feature branch testbed
|_ component 2 feature branch
Run Code Online (Sandbox Code Playgroud)
在测试平台中开发的最终组件代码(仅一个.ts或.js文件)被推送到组件功能分支.测试台代码保留在测试平台分支中.此外,在功能分支中还会附带组件可能附带的任何文档.
现在在应用程序repo中,我使用以下命令将feature分支添加为子树:
git subtree add -P <destination-dir/feature> --squash <my-company-library-repo-url> <feature-branch-name>
Run Code Online (Sandbox Code Playgroud)
这给了我以下(此图显示了文件夹结构):
my-app-repo-------
|_ company-library-feature-subtree
Run Code Online (Sandbox Code Playgroud)
这应该只包含它的子文件夹中的.jsor .ts和它的文档.我得到的只是部分工作.当它拉出子树时,它只会拉取组件及其doc文件,但文件会被拉入很长的子目录列表,如下所示:
my-app-repo/src/feature-branch/feature/src/app/providers/...
Run Code Online (Sandbox Code Playgroud)
这使得很难使用库,因为文件被放置了很多目录(未使用的目录).
因此,当我将我的2个文件从功能测试平台分支推送到功能分支时,我怎么能不用它们拉出整个目录结构?
在添加子树之前my-app-repo,从my-company-library-repo以下位置拆分子树:
# In my-company-library-repo
git subtree split -P src/app/providers/... -b feature-new feature
Run Code Online (Sandbox Code Playgroud)
这将创建一个新的历史记录,其内容src/app/providers/...位于repo的根目录,从feature分支开始,并feature-new在此历史记录的末尾创建分支.
然后将该新分支添加为子树my-app-repo:
# In my-app-repo
git subtree add -P <destination-dir/feature> --squash <my-company-library-repo> feature-new
Run Code Online (Sandbox Code Playgroud)
现在你将拥有src/app/providers/...at 的内容<destination-dir/feature>.
你没有提到你是否会定期重复这个过程,但这也是可能的.从git-subtree手册页:
完全相同历史的重复拆分保证是相同的(即产生相同的提交ID).因此,如果您添加新提交然后重新拆分,新提交将作为提交附加在您上次生成的历史记录之上,因此'
git merge'和朋友将按预期工作.
我研究了Scott Weldon的解决方案。它可以工作,但是git子树似乎将所述目录拆分成自己的存储库。至少那是我从阅读手册和书本中学到的东西,而并非如此。(如果我错了,很可能是这种情况,请让我知道。)那不是我想要做的。
但是,我确实找到了解决我问题的方法。这是我在项目中使用Git子树合并策略(而不是GIT SUBTREE命令)执行的操作:
$ git remote add my-library <my-library-url>
$ git fetch my-library
$ git checkout -b my-library-branch my-library/master
$ git checkout master
$ git read-tree --prefix=<desired/library/dir> -u my-library-branch
$ git commit -m "Merged library project as subdirectory"
$ git push
Run Code Online (Sandbox Code Playgroud)
这很棒。我的图书馆在合理的子文件夹中。诚然,我必须带走整个库,而不仅仅是像自定义组件或提供程序这样的块,但在这种情况下就可以了。