git - 如何 merge 子文件夹中的 git 存储库而不丢失分支和标签?

标签 git git-merge monorepo

虽然这个问题似乎是重复的或许多以前的问题(以及数十篇涉及类似主题的博客文章),但我需要让您意识到我正在寻找一种允许我编写脚本的方法。

  • 所有分支和标签都应该 merge
  • 分支和标签应该带有前缀以避免重叠
  • 文件不会重叠,因为我们导入到新的子文件夹。
  • 增量 merge 过程:稍后能够 merge 新的存储库,因为我计划慢慢迁移到单一存储库设置,一次一个存储库。

我尝试构建的脚本应该像这样工作:

./merge-repo monorepo/subdir/foo <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="086f617c486f617c607d6a266b6765" rel="noreferrer noopener nofollow">[email protected]</a>:example/foo.git

这假设目标存储库 (monorepo) 已克隆到 monorepo/ 文件夹中,并且没有任何本地更改。

例如,如果执行 merge 后 foo.git 将有两个分支 masterdevelop 以及一个标记名称 v1.0 ,我希望在 monorepo 存储库中看到分支 foo-masterfoo-develop 以及标签 foo-v1.0

我阅读了数十篇文章(或脚本),但到目前为止我找不到一篇解释如何获得它。

澄清

  • 如果我在 foo.git 存储库的根目录中有一个 README.txt,我希望在 monorepo/subdir/foo/README.txt 中看到此文件。如果这些存储库将成为大存储库的子目录(以前不存在的子目录),那么这是唯一允许我 merge 存储库而不会发生冲突的方法。

更新

虽然我还没有准备好说问题已解决,但我最终编写了这个 bash 脚本,该脚本应该在修补源存储库后执行 merge 。看看吧https://github.com/ssbarnea/monorepo/blob/master/git-monorepo-add.sh

PS。一旦我有了可靠的解决方案,并且经过许多存储库的测试,我会尽快给出正确的答案。

最佳答案

您可以将远程存储库分支和标签 pull 入命名空间(即 <prefix> )引用,如下所示:

git fetch --no-tags <url> \
    refs/heads/*:refs/heads/<prefix>/* \
    refs/tags/*:refs/tags/<prefix>/*

根据您的示例,这将为您提供分支 foo/masterfoo/develop和一个名为 foo/v1.0 的标签。不完全是你所要求的,但也许没关系。请注意--no-tags指定以避免将标签提取到“全局”命名空间中。

此时,您可能希望将这些分支之一 merge 到本地存储库的主分支中。这是解决此问题的一种方法:

$ git merge -s ours --no-commit foo/master
$ git read-tree --prefix=foo/ -u foo/master
$ git commit -m "merged in `master' from project foo"

关于git - 如何 merge 子文件夹中的 git 存储库而不丢失分支和标签?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39751106/

相关文章:

git - Docker Hub - 未触发正则表达式匹配的自动构建标签

git - 将 merge 冲突发送给协作者以在 Git 中解决

git - 告诉 git 不要 merge 二进制文件而是选择

git request-pull 从本地分支到远程master

svn - 如何使用 git-svn 将根植于不同目录的 svn 分支导入到 git 中?

eclipse - 有没有办法检索 eclipse 执行的 git 命令?

git - 如何在git中 merge 特定文件

git - 从 monorepo 中的子目录触发管道构建

javascript - 使用 TFS CI 发布多个 cobertura 覆盖范围

GitLab CI、monorepo 和功能分支