虽然这个问题似乎是重复的或许多以前的问题(以及数十篇涉及类似主题的博客文章),但我需要让您意识到我正在寻找一种允许我编写脚本的方法。
- 所有分支和标签都应该 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 将有两个分支 master
和 develop
以及一个标记名称 v1.0
,我希望在 monorepo 存储库中看到分支 foo-master
和 foo-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/master
和foo/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/