听起来这些存储库有一些共同的历史,或者您已经确定了如何处理它,以便您的 30 个文件正确合并 - 因此您只需要阻止其他 90 个文件被添加到目标分支...
这里有一个警告[1],但有一种方法:
git checkout repo_a_branch
git merge --no-commit repo_b_branch
暂定合并结果现已暂存但尚未提交,因此您可以对其进行修改。如果这 90 个文件很容易通过将它们与 30 个文件区分开来的路径或 glob 来识别,那么您可以
git rm path-or-glob-of-unwanted-files
然后是commit。
如果所有文件都以某种方式混合在一起会造成困难,您可以这样做
git status --porcelain |grep ^A |cut -d ' ' -f3 |xargs git rm -f
删除不需要的文件后,您可以commit 完成合并。
[1] 如果你有
x -- x -- x <--(repo_b_branch)
...
x -- x -- x <--(repo_a_branch)
你找到了一些解决方案来创建
x -- x -- x <--(repo_b_branch)
... \
x -- x -- x -- M <--(repo_a_branch)
如果M 仍然只有 30 个文件,那么M 将被视为删除 90 个“其他”文件。因此,如果将来您尝试从 repo_a_branch 合并到 repo_b,您将处理那些从合并中取出的文件。
更一般地说,您在这里所拥有的有时被称为“邪恶合并”,因为它“隐藏”了相对于默认合并结果的更改。尤其是在默认合并已成功完成的情况下,如果您运行某些假定默认合并的命令,这可能会导致麻烦。
这适用于上述解决方案,也适用于生成此提交图同时仅将 30 个文件保留在 repo a 中的任何其他解决方案。