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

How can I add a specific folder when using git subtree?

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

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

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

现在在应用程序存储库中,我使用以下命令将功能分支添加为子树:

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 个文件从 feature-testbed 分支推送到 feature 分支时,我怎么能不把整个目录结构和它们一起拉呢?

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

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

这将在 repo 的根目录创建一个包含 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

现在您将在 <destination-dir/feature> 处获得 src/app/providers/... 的内容。

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

Repeated splits of exactly the same history are guaranteed to be identical (ie. to produce the same commit ids). Because of this, if you add new commits and then re-split, the new commits will be attached as commits on top of the history you generated last time, so 'git merge' and friends will work as expected.

我研究了 Scott Weldon 的解决方案。它会工作,但似乎 git 子树将所述目录拆分为它自己的 repo。至少那是我从阅读手册页和书籍中收集到的东西。 (如果我错了,很可能是这样,请告诉我。)那不是我想做的。

不过,我确实找到了解决问题的方法。这是我在我的项目中使用 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

效果很好。我的图书馆在一个合理的子文件夹中。不可否认,我必须使用整个库,而不仅仅是像自定义组件或提供程序这样的块,但在这种情况下没关系。