问题标签 [git-subtree]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
26 回答
291367 浏览

git - 分离(移动)子目录到单独的 Git 存储库

我有一个Git存储库,其中包含许多子目录。现在我发现其中一个子目录与另一个无关,应该分离到一个单独的存储库。

如何在将文件历史记录保留在子目录中的同时做到这一点?

我想我可以制作一个克隆并删除每个克隆的不需要的部分,但我想这会在检查旧版本等时给我完整的树。这可能是可以接受的,但我更愿意假装两个存储库没有共享历史记录。

为了清楚起见,我有以下结构:

但我想要这个:

0 投票
2 回答
3086 浏览

git - 将更新合并到我的子树时 Git 感到困惑

我们之前在主存储库中使用了许多子模块,但为了提高项目的可维护性,我们启动了一个实验分支,将它们全部替换为子树。

这很好用 - 但是现在当我尝试更新其中一个子树时,它错误地将更新合并到一个完全错误的目录中,甚至不是子树。

主存储库,其中分支“子树”包含实验分支,是:git://github.com/hugowetterberg/goodold_drupal.git

要合并更新的存储库来自:git://github.com/voxpelli/drupal-oembed.git

通过做合并:git merge -s subtree oembed/master

更新应合并到的路径:sites/all/modules/oembed/

它们合并到的路径:modules/aggregator/translations/

任何人都知道如何将更新放入子树或错误可能是什么?

0 投票
26 回答
587225 浏览

git - 如何合并两个 Git 存储库?

考虑以下场景:

我在自己的 Git 存储库中开发了一个小型实验项目 A。它现在已经成熟,我希望 A 成为更大的项目 B 的一部分,它有自己的大存储库。我现在想将 A 添加为 B 的子目录。

如何在不丢失任何历史记录的情况下将 A 合并到 B 中?

0 投票
5 回答
10369 浏览

git - 将 Git 与 Magento 一起使用的最佳实践?

我正在研究如何在与供应商的库(在本例中为 Magento)集成的同时,最好地在我自己的存储库中为自定义代码工作。就我而言,我不需要向供应商推送补丁(尽管这将是一个很大的附带好处)。

我研究了 git submodule 和 git subtree。我认为 git submodule 不能满足我的需要。Magento 具有以下类型的树结构:

使用 git submodule 似乎在单独的文件夹中效果最好(例如 / 是您的应用程序, /vendor/magento 是子模块)。但是,由于这种程度的交织,子模块似乎不是一个好的解决方案。我错了吗?

这给我留下了 git subtree。但是对于 git subtree,相同的核心假设(供应商分支,顾名思义,是一个子树)并不成立。Magento 不是子树,而是我的项目适合的核心库。那是对的吗?

如果这两种 git 方法不起作用,是否还有其他我应该知道的方法可以完成我想要完成的工作?

我不愿意追求的最后一个选择是拥有一个 repo,然后我只需将其应用于最新的供应商更改(从 tarball 中提取)。我不愿意追求这一点,因为我觉得拥有供应商的日志信息(从https://github.com/magentomirror/magento-mirror提取)对于整理新更新和找出哪些变化影响了我非常有帮助.

0 投票
3 回答
817 浏览

git - 如何在不使用分支的情况下在同一个基本目录中创建两个 Git 存储库?

我们目前正在将我们的 Magento Enterprise(电子商务 Web 应用程序)文件移动到 Git 中。httpdocs/.gitignore 文件包含以下内容:

在初始化、提交和推送 httpdocs/ 之后,我们的第一个 Git 存储库就成功创建了。我们现在想将上述两个目录放入它们自己的单独存储库中。(一起,在一个存储库中!)我们在这里遇到的问题是这些目录共享一个公共根目录,该根目录已经包含我们的第一个 Git 存储库;即:httpdocs/

我已经读过子模块功能可以将其他存储库嵌入现有树的子目录中。但是,例如kernel.orggit-scm.com上的文档似乎非常复杂,以至于我怀疑这是否真的是前进的道路。我们所需要的只是两个独立的存储库,它们恰好具有相同的根。

我读过的另一种可能的解决方案可能是从 app/design/frontend/company/website/ 初始化并添加 skin/frontend/company/website/ 作为移植点,以便将这些目录连接在一起。然而,再一次,这似乎过于复杂,并且打算在从另一个修订控制系统迁移到 Git 时使用。

0 投票
2 回答
7842 浏览

git - git-subtree 没有保留历史记录,所以我无法推送子树更改,我该如何解决这个问题/以后避免这个问题?

我一直在使用 git-subtree 扩展(https://github.com/apenwarr/git-subtree)来管理我们主项目中的子项目。除了当我尝试从我们的主项目中拆分对子项目所做的更改时它失败之外,它正在做我想要的事情。

例如,早些时候我做过

在我们的主项目中将库代码引入 Some/Sub/Dir。这里的一切都很好,所以我将我的更改推送到我们的中心主项目裸 git repo。然后我决定在 Some/Sub/Dir 中更改我的本地版本的 lib,提交它,然后将其拆分以将其推回 lib.git 存储库

一切都按预期工作。不再需要我删除的 repo 的本地副本。

从我们的中央仓库克隆了一个新的仓库副本后,我对 Some/Sub/Dir 中的 lib 进行了一些更改,并决定将这些更改拆分出来并将它们推送回 lib.git 存储库。我尝试使用与以前相同的子树拆分命令,但是这次我最终得到以下输出:

d76a03f0ec7e20724bcfa253e6a03683211a7bb1 来自我添加子树时:

这实际上是指 lib.git 存储库中的提交。


我能够拼凑起来的(我是一个 git noob,所以我可能是错的,忽略了某些东西,或者在这里使用了不正确的术语),'git subtree add --squash' 将带来整个历史将远程 lib.git 存储库放入当前存储库,将其压缩为单独的提交,然后将该提交添加到工作分支中。lib.git 提交历史保留在当前存储库中,但是它们是悬空提交,因为除了通过 squash 提交的文本之外,它们实际上并没有被引用。只要那些悬空提交仍然存在,git-subtree 就可以使用它们来执行拆分,但是由于推送或拉取不包含悬空对象(或者如果我运行 gc 并完全修剪悬空对象),那些悬空提交就会丢失并且git-subtree 不再具有执行拆分所需的信息。

我添加了一个脚本,可以完全重现我遇到的问题。


我的问题是:

1)我可以做些什么来处理现有的情况,我现在有子树,我想合并回它们的原始仓库,但不再有任何类型的历史将它们链接在一起。我目前的想法是做类似的事情:

拆分自“git subtree add”以来的所有历史记录并将其合并回原始存储库(幸运的是,自添加以来没有任何更改)。这是最好的方法吗?关于我应该如何执行合并的任何建议?

2)我能做些什么来让 git-subtree 按预期工作吗?我相信如果我在 'git subtree add' 上省略 --squash 参数,那么一切都会正常工作,但这会导致一堆不相关的历史记录被注入到我的 repo 中。有没有办法保留所需的提交(最好不保留图书馆的整个历史)?

0 投票
5 回答
6074 浏览

git - git:如何从项目中分离库?过滤器分支,子树?

所以,我有一个更大的(封闭源代码)项目,并且在这个项目的上下文中创建了一个库,我认为它在其他地方也可能有用。

我现在想在自己的项目中拆分该库,该项目可以作为 github 或类似的开源项目。当然,图书馆(以及它的历史)不应该包含我们项目的任何痕迹。

git-subtree 在这里似乎是一个解决方案,但它并不完全适合。

我的目录布局是这样的(因为它是一个 Java 项目):

  • 击剑游戏 (git workdir)
    • 源代码
        • 击剑游戏
          • 交通 (我的图书馆)
            • 协议 (库的一部分)
            • 围栏(与图书馆接口的主要项目的一部分)
            • 客户端(与库接口的主要项目的一部分)
            • 服务器(与库接口的主项目的一部分)
          • 客户(主要项目的一部分)
          • 服务器(主项目的一部分)
          • ... (主要项目的一部分)
    • 其他文件和目录(构建系统、网站等 - 主项目的一部分)

拆分后,我希望库的目录布局如下所示(包括直接在粗体目录中的任何文件):

  • 我的图书馆(名称待定)
    • 源代码
        • 击剑游戏
          • 交通 (我的图书馆)
            • 协议 (库的一部分)

历史记录还应该只包含与存储库的这一部分相关的主项目历史记录的一部分。

第一眼看到我git-subtree split --prefix=src/de/fencing_ame/transport,但这会

  1. 给我一棵植根于的树transport(不会编译)和
  2. 包括transport/client,transport/servertransport/fencing目录。

第一点可以通过git subtree add --prefix=src/de/fencing_ame/transport <commit>在接收端使用来缓解,但我认为 git-subtree 对导出这些子目录也没有多大作用。(这个想法实际上是能够在这里分享完整的树)。

我必须在这里使用git filter-branch吗?

拆分后,我希望能够使用 git-subtree 或 git-submodule 将主项目中的库导入到单独的子目录中,而不是现在的位置。我想象这样的布局

  • 击剑游戏 (git workdir)
    • 源代码
        • 击剑游戏
          • 运输 (空)
            • 围栏(与图书馆接口的主要项目的一部分)
            • 客户端(与库接口的主要项目的一部分)
            • 服务器(与库接口的主项目的一部分)
          • 客户(主要项目的一部分)
          • 服务器(主项目的一部分)
          • ... (主要项目的一部分)
    • 我的图书馆
      • 源代码
          • 击剑游戏
            • 交通 (我的图书馆)
              • 协议 (库的一部分)
    • 其他文件和目录(构建系统、网站等 - 主项目的一部分)
这样做最无痛的方法是什么?除了 git-subtree 和 git-filter-branch 之外,还有其他工具可以实现这个目标吗?

0 投票
4 回答
3347 浏览

git - Git 子树工作流程

在我当前的项目中,我正在使用一个开源论坛(https://github.com/vanillaforums/Garden)。我打算做这样的事情:

通过这种方式,我可以更改 vanilla 文件夹(如更改配置)并将其提交到我的 master 分支,我也可以切换到我的 vanilla 分支以获取更新。我的问题是当我尝试将分支合并在一起时

问题是“更新提交”在我的提交之上并“覆盖”了我的更改。我宁愿在更新的基础上重播我的提交。有没有一种简单的方法可以做到这一点?我不太擅长 git,所以也许这是错误的方法。此外,我真的不想将我的历史与香草历史混为一谈。

0 投票
4 回答
27137 浏览

git-submodules - Git 子模块的替代品?

我觉得使用 Git 子模块对我的开发工作流程来说有点麻烦。我听说过 Git 子树和 Gitslave。

  • 是否有更多工具可用于多个存储库项目,它们如何比较?
  • 这些工具可以在 Windows 上运行吗?
0 投票
1 回答
2473 浏览

git - Git子树合并策略或子树命令?

我正在开始一个新的 Zend Framework 项目,我将在其中与设计师合作。我将使用 git 维护这个项目代码,通常设计师不会说 git(或任何编程语言),所以我想让他的事情变得简单,否则我担心他根本不会使用 git。我的计划是给他一些 Git gui,然后他应该只使用基本的 git 功能,例如提交、差异、获取、合并、推送和拉取。

我正在使用 gitolite 来维护我们的 git 存储库的共享副本,并且由于它具有细粒度的权限系统,我将仅授予设计人员 RW 访问权限以访问专用分支(设计)并读取其他分支的访问权限。

为了简单起见,我只想与他分享主项目中的一些文件夹(遵循ZF 推荐的结构),他确实需要访问这些文件夹才能完成工作。同时我希望我们俩仍然可以相互融合。

他的分支的简化结构应该是这样的:

我知道我可以使用子模块来完成这项任务,但维护起来会很痛苦,因为我应该将我的项目拆分为(至少)4 个子存储库,他应该只能访问子存储库,并且他有 3 个存储库可以使用. 出于这个原因,如果这是唯一的解决方案,我将放弃这个想法。

我已经阅读过的一些链接让我认为我所要求的是可能的:

这是我的问题:

  1. 如何创建缩减分支designgit checkout -b designgit mv/rm?)
  2. 如何配置 git 以跟踪跨分支的编辑(所以我可以git merge design从主分支,反之亦然)

更新:

我发现了解决这两个 SO 问题的另一种可能方法

我尝试git rm all-unneeded-stuff在设计分支中实现第一个之后,我在主分支中进行了提交,其中涉及白名单路径中的一个文件和黑名单路径中的另一个文件,但git merge失败并显示以下消息

然后我在主分支中添加了一个新目录,并在从设计合并时添加了新目录。我在驱动程序中放了一些调试回显,我发现在这两种情况下都没有调用它,可能是因为它不是真正的合并。

我还没有尝试过第二种方法(.gitignore 方法),但如果我理解该方法不符合我的需求,因为它只会忽略设计分支中的黑名单文件,但它们将在设计分支,打破了我的要求。

我在GitHub 上推送了我的实验

更新 2:

我认为目前没有解决方案。使用当前的 git 实现,这根本无法实现。

我很想被反驳,但我又怕它不会发生。