虽然这个问题似乎是重复的或许多以前的问题(以及数十篇关于类似主题的博客文章),但我需要让你知道我正在寻找一种方法,允许我编写脚本。< / p>
我正在尝试构建的脚本应该像这样工作:
./merge-repo monorepo/subdir/foo git@github.com:example/foo.git
这将假设目标存储库(monorepo)已经克隆在monorepo/
文件夹中,并且没有任何本地更改。
例如,如果foo.git具有两个分支master
和develop
以及一个标记名v1.0
,则在执行合并之后,我希望看到分支{{1} }和foo-master
以及monorepo存储库中的标记foo-develop
。
我阅读了数十篇文章(或文字),但到目前为止,我找不到解释如何获得这篇文章的文章。
foo-v1.0
内看到这个文件。这是允许我合并存储库而没有冲突的唯一方法,如果它们将成为大型仓库的子目录(以前不存在的子目录)。虽然我还没有准备好说问题已经解决,但我最终编写了这个bash脚本,它应该在修补源存储库后执行合并。看看它https://github.com/ssbarnea/monorepo/blob/master/git-monorepo-add.sh
PS。我会尽快找到一个可靠的解决方案,并在许多存储库中进行测试。
答案 0 :(得分:2)
您可以使用以下内容将远程存储库分支和标记拉入命名空间(即<prefix>
)引用:
git fetch --no-tags <url> \
refs/heads/*:refs/heads/<prefix>/* \
refs/tags/*:refs/tags/<prefix>/*
通过您的示例,这会为您提供分支foo/master
和foo/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)
基本上,你需要做两件事:
只需java -Dhttps.protocols=TLSv1.2,TLSv1.1,TLSv1
远程存储库的所有分支和标记即可完成前者。由于对象是由哈希索引的,因此使用union是一项微不足道的任务,你必须什么都不做。
此时,您拥有存储库中的所有必需对象。你有所有远程分支,你可以列出它们,例如通过运行fetch
(实际上,如果您对此名称模式没有问题,则无需执行任何操作)。
据我所知,标签有点棘手。它们不是由远程控制器限定的,因此您不能只将它们全部一起取出并稍后重命名。这意味着,您必须手动获取标记列表(git branch -r --list '<remote_name>/*'
),迭代它们,创建名称和提取更改的标记。