2

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

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

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

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

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

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

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

澄清

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

更新

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

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

4

2 回答 2

3

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

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

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

此时,您可能希望将这些分支之一合并到您本地 repo 的 master 中。这是解决此问题的一种方法:

$ 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"
于 2016-09-28T15:29:08.230 回答
1

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

  1. 导入所有底层 git 对象。
  2. 合并存储库的面向用户的结构(分支、标签等)

前者只需fetching 远程存储库的所有分支和标签即可。由于对象是由哈希索引的,因此采用联合是一项微不足道的任务,您无需执行任何操作。

此时,您的存储库中拥有所有必要的对象。你已经拥有了所有的远程分支,你可以通过运行来列出它们git branch -r --list '<remote_name>/*'(实际上,如果你对这个名称模式没问题,你不需要做任何事情)。

据我所知,标签有点棘手。它们不受遥控器的限制,因此您不能将它们全部一起获取并稍后重命名。这意味着,您必须手动获取标签列表 ( git ls-remote --tags <remote_name>),对它们进行迭代,创建具有更改名称的标签并获取。

于 2016-09-28T15:16:44.267 回答