如何在不丢失分支和标签的情况下合并子文件夹中的git存储库?

时间:2016-09-28 14:57:36

标签: git git-merge monorepo

虽然这个问题似乎是重复的或许多以前的问题(以及数十篇关于类似主题的博客文章),但我需要让你知道我正在寻找一种方法,允许我编写脚本。< / p>

  • 所有分支和标签都应该合并
  • 分支和标签应该加上前缀以避免重叠
  • 文件不会重叠,因为我们导入到新的子文件夹。
  • 增量合并过程:稍后我可以合并新的存储库,因为我打算慢慢迁移到monorepo设置,一次一个存储库。

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

./merge-repo monorepo/subdir/foo git@github.com:example/foo.git

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

例如,如果foo.git具有两个分支masterdevelop以及一个标记名v1.0,则在执行合并之后,我希望看到分支{{1} }和foo-master以及monorepo存储库中的标记foo-develop

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

澄清

  • 如果我在foo.git repo的根目录中有README.txt,我希望在foo-v1.0内看到这个文件。这是允许我合并存储库而没有冲突的唯一方法,如果它们将成为大型仓库的子目录(以前不存在的子目录)。

更新

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

PS。我会尽快找到一个可靠的解决方案,并在许多存储库中进行测试。

2 个答案:

答案 0 :(得分:2)

您可以使用以下内容将远程存储库分支和标记拉入命名空间(即<prefix>)引用:

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

通过您的示例,这会为您提供分支foo/masterfoo/develop以及名为foo/v1.0的标记。不完全是你要求的,但也许那很好。请注意,--no-tags被指定为避免将标记提取到&#34; global&#34;命名空间。

此时您可能希望将其中一个分支合并到本地repo的主服务器中。这是一种方法:

$ 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"

答案 1 :(得分:1)

基本上,你需要做两件事:

  1. 导入所有底层git对象。
  2. 合并存储库(分支,标签等)的面向用户的结构
  3. 只需java -Dhttps.protocols=TLSv1.2,TLSv1.1,TLSv1 远程存储库的所有分支和标记即可完成前者。由于对象是由哈希索引的,因此使用union是一项微不足道的任务,你必须什么都不做。

    此时,您拥有存储库中的所有必需对象。你有所有远程分支,你可以列出它们,例如通过运行fetch(实际上,如果您对此名称模式没有问题,则无需执行任何操作)。

    据我所知,标签有点棘手。它们不是由远程控制器限定的,因此您不能只将它们全部一起取出并稍后重命名。这意味着,您必须手动获取标记列表(git branch -r --list '<remote_name>/*'),迭代它们,创建名称和提取更改的标记。