标签: git-subtree

将git存储库中的文件夹拆分为单独的分支

我终于将我们的CVS存储库迁移到了git.不幸的是,我们没有在CVS中使用分支,但是不同的版本/分支被分成不同的子目录.

IE我们有以下目录结构:

/root
    /lib
    /tools
    /src
        /v1.0
        /v2.0
        /v3.5
Run Code Online (Sandbox Code Playgroud)

有没有办法将src子目录中的3个版本分成单独的分支,而不是保留每个版本的目录?

我在Stack Overflow 问题4877053上找到了同样的问题,其中提出了git-subtree的使用,但即使在阅读git-subtree手册后,我也不明白如何使用它来解决我的问题.

有人能给我一个更详细的解释,甚至是另一种解决方案吗?

我对git很新,也许这就是为什么我不理解子树手册;-)

非常感谢您的所有食物!

git git-subtree

6
推荐指数
1
解决办法
1225
查看次数

哪个更适合我的Git项目,子模块或子树

我有一个我正在开发的服务,它将由多个'位'组成.它将是开源的,所以我想让人们很容易看到整个项目,检查它,进行更改等,而不是给人们一个不同的项目列表来检查.

所以想象一下,我有一个名为'Flintstones'的项目,它由'Barney','Wilma'和'Bambam'组成.

据我所知,如果我用子树做到这一点,那么如果一个人检查出'Flintstones',他们会看到一切,但如果他们对Barney的代码进行了更改,他们必须将该代码合并回Barney存储库.所以这很糟糕,因为人们会改变代码,要么不知道它是一个子树,要么就是不知道它.

所有子模块示例都谈到它们被用于在项目中嵌入公共代码,但我是正确的说,如果一个人检查'Flintstones'并在'Barney'文件夹中进行更改,那么只需进行常规提交和推送然后那个变化发生在巴尼身上?这种情况下唯一的缺点是他们必须使用额外的语法检查项目以结帐子模块吗?

我想将其拆分出来,以便只对项目中发生变化的部分触发和执行构建,因此对Barney的更改导致只在我的CI服务器上构建和测试Barney(在这种情况下是竹子).随着时间的推移,不同的人将在代码的不同模块上工作,而不必知道其他模块.

git version-control git-submodules git-subtree

6
推荐指数
0
解决办法
462
查看次数

如果从不为上游做出贡献,git 子树会简化吗?

如果您希望在主项目中包含子项目但从不为上游贡献更改,则存在哪些优化(甚至包括 git subtree 的替代方案)?

实际用例:我将Ghost嵌入到现有的 express.js 网站中,例如嵌入 lib/Ghost。我需要对它进行一些黑客攻击,无论如何他们都不想贡献给上游的类型。对 Ghost 项目的任何正常贡献都将通过 GitHub 上的典型分叉完成,而不是从我的其他项目中完成。

因此,在最初将 Ghost 嵌入到我的项目中后,唯一发生的事情就是偶尔的本地源代码更改,以及有时从上游获取其主分支的更新。

在这种情况下, git subtree 是否仍然是一种合适的方法,如果是,那么是否有任何问题或简化适用,因为这种需要永远不会向上游做出贡献?因此,是否也可以将主 TryGhost/Ghost 存储库作为我的子树上游,而不是先分叉 Ghost 然后将分叉作为项目的上游?

git github git-subtree ghost-blog

6
推荐指数
1
解决办法
368
查看次数

我的 git 子树跟踪哪个远程分支?

假设有一个带有 master 的遥控器以及一个 dev 分支,我将其添加到子树中:

$ git remote add rem [URL]
$ git fetch rem
$ git subtree add -P=./sub rem/dev
Run Code Online (Sandbox Code Playgroud)

现在每次我运行时git subtree pull -P sub,分支 rem/dev 都会被获取并合并到 sub 中。好的

但后来我忘记了我是从 master 还是 dev 分支添加的。除了通过比较 git 日志来推断之外,git 有没有办法告诉我 rem 的哪个分支是 sub/tracking 中的子树?

子树很棘手...

git git-subtree git-branch

6
推荐指数
1
解决办法
1806
查看次数

如何推送一个浅克隆的 Git 子树?

我有一个存储库,其中包含一个用于将部署文件推送到不同遥控器的子树。

重新设置存储库时,我执行以下操作:

  • 克隆存储库。
  • 为子树添加遥控器。
  • 从子树远程获取。
  • 像往常一样提交并推送到主远程分支和子树。

我最近尝试通过将--depth参数添加到第一步和第三步来减小本地磁盘的大小。

推送到主远程工作正常,但我无法再推送到子树。我得到: error: failed to push some refs to '<repo>' hint: Updates were rejected because the tip of your current branch is behind hint: its remote counterpart. Integrate the remote changes (e.g. hint: 'git pull ...') before pushing again.

是否有任何机制可以实现这一目标?我尝试增加深度,但最终我不得不从遥控器获取 --unshallow才能再次推送我的子树。

我的本地 Git 版本是 2.7,子树遥控器是 2.3。主存储库位于 GitHub 上。

git github git-subtree

6
推荐指数
0
解决办法
270
查看次数

如何使用git子树添加本地repo?

假设我有一个已经是 git repo“sub”的目录,现在我希望它成为我新创建的超级目录“sup”的子树。

我已经搜索了文档,但所有教程都是关于添加远程存储库或从现有提交中拆分。如何将现有的 git 存储库添加到主 git 存储库?

使用git subtree add --prefix=sub sub会给出警告子已经存在。

git git-subtree

6
推荐指数
1
解决办法
3837
查看次数

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

我正在开发一个复杂的离子项目.我正在开发的许多组件和提供程序都是通用的,可以在我公司正在进行的其他项目中使用.这在软件开发中很常见.这是我提出的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个文件从功能测试平台分支推送到功能分支时,我怎么能不用它们拉出整个目录结构?

git git-subtree

6
推荐指数
2
解决办法
3789
查看次数

迁移到Git时如何处理部分svn:externals?

我想将 SVN 存储库导入 GitHub Enterprise 存储库

与此相关的问题有很多,其中大多数都可以通过 Git 子模块或 Git 子树来解决。

就我而言,我有两个存储库:

  • 主项目存储库
  • 模块存储库(超过 2 GB 的大型 SVN 存储库)

该模块存储库具有以下架构:

foolib/
   moduleA/
      ...
   moduleB/
      ...
   ...
Run Code Online (Sandbox Code Playgroud)

对于该项目,只有很少的模块foolib被用作svn:externals. 例如,这个主项目仅使用moduleAfrom foolib.

正如这个问题中提到的,一种可能的解决方案是使用稀疏结帐。我猜 Git 子树也能做到这一点。不幸的是它没有解决主要问题。

如果我的项目很小,只要我从 得到一些东西foolib,即使使用 space-checkout,我也会检索到整个历史记录foolib例如2 GB)。SVN 不存在这个问题,因为svn:externals属性只获取它需要的内容,而不是整个历史记录。

我可以想象做一些愚蠢的事情,例如使用中列出的提交动态重新创建本地稀疏存储库git log --follow foolib/moduleA。但我认为这不是一个好的解决方案。

在 Git 中获得类似行为而无需获取foolib我只需要几个模块的所有内容的整个历史记录的正确工作流程是什么?

svn git svn-externals git-subtree

6
推荐指数
0
解决办法
473
查看次数

在git repo中推送子树

我对Git很新:我来自SVN,在那里我发现了非常强大的外部功能.在Git中我找不到类似的东西:

  • 子模块非常适合添加并非总是需要的项目模块.它们必须在repo克隆后初始化,并且不能仅包含原始项目的子目录.
  • 子树非常适合添加库(它们也允许子目录包含),但推送它们真的很痛苦.

所以场景是这样的:我有一个项目,我想在其中包含一些库.我希望有可能改变所有这些库并将它们推送到自己的库中.此外,这些库中的一些是较大项目的子目录(例如,如果项目还包括演示或自述文件,我将不会在我的项目中包含这些目录).

我怎样才能做到这一点?

我试过了:

好吧,如果你已达到这一点,感谢你的耐心,现在我想要别的东西尝试,因为现在我的结论是:"Git中不允许子树推送"ç_ç

git git-subtree

5
推荐指数
1
解决办法
1561
查看次数

当git子树推/拉时,如何避免每次输入--prefix?

我们必须git remote add origin http://...避免重复输入实际的源代码路径.但是怎么样git subtree --prefix=...?当我拉/推子树内容时,很难跟踪,记住和不稳定的输入前缀路径.

是否有自动跟踪前缀路径的内置功能?

prefix git-subtree

5
推荐指数
1
解决办法
319
查看次数