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