使用git子树时如何添加特定文件夹?

时间:2016-10-26 15:51:00

标签: git git-subtree

我正在开发一个复杂的离子项目。我正在开发的许多组件和提供程序都是通用的,可以在我公司正在进行的其他项目中使用。这在软件开发中很常见。这是我提出的Git工作流程(此图显示了分支):

my-company-library-repo ----
                            |_ component 1 feature branch
                               |_ company component 1 feature branch testbed
                            |_ component 2 feature branch

测试平台中开发的最终组件代码(只是.ts.js文件)被推送到组件功能分支。测试台代码保留在测试平台分支中。此外,在功能分支中还会附带组件可能附带的任何文档。

现在在应用程序repo中,我使用以下命令将feature分支添加为子树:

git subtree add -P <destination-dir/feature> --squash <my-company-library-repo-url> <feature-branch-name>

这给了我以下内容(此图显示了文件夹结构):

my-app-repo-------
                  |_ company-library-feature-subtree

这应仅包含.js.ts及其子文件夹中的文档。我得到的只是部分工作。当它拉出子树时,它只会拉取组件及其doc文件,但文件会被拉入很长的子目录列表中,如下所示:

my-app-repo/src/feature-branch/feature/src/app/providers/...

这使得很难使用库,因为文件被放置了很多目录(未使用的目录)。

因此,当我将2个文件从功能测试分支推送到功能分支时,我怎么能不用它们拉出整个目录结构?

2 个答案:

答案 0 :(得分:7)

在将子树添加到my-app-repo之前,从my-company-library-repo拆分子树:

# In my-company-library-repo
git subtree split -P src/app/providers/... -b feature-new feature

这将创建一个新的历史记录,其内容为src/app/providers/...,位于回购的根目录,从feature分支开始,并在此历史记录末尾创建分支feature-new

然后将新分支作为子树添加到my-app-repo

# In my-app-repo
git subtree add -P <destination-dir/feature> --squash <my-company-library-repo> feature-new

现在,src/app/providers/...的内容为<destination-dir/feature>

你没有提到你是否会定期重复这个过程,但这也是可能的。从git-subtree手册页:

  

完全相同的历史记录的重复拆分保证是相同的(即产生相同的提交ID)。因此,如果您添加新提交然后重新拆分,新提交将作为提交附加在您上次生成的历史记录之上,因此“git merge”和朋友将按预期工作。

答案 1 :(得分:5)

我研究了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

这很有效。我的库在一个合理的子文件夹中。不可否认,我必须使用整个库,而不仅仅是像自定义组件或提供程序那样的块,但在这种情况下就可以了。