git - 如何 merge 来自包含另一个目录子集的分支的更改?

标签 git bitbucket git-svn

我会尽量保持简短。

我们有一个充当 SVN 镜像的 git 存储库(由 BitBucket 管理)。这个 repo 包含公司自开始以来的每个项目,让每个开发人员克隆这不是一个合理的要求(25+33GiB 完整克隆和 15+GiB 浅层克隆)但即使那样,我们也不不需要整个存储库的完整克隆,只需要其中目录的一个子集。

使用 git-subtree,我设法分离出所有感兴趣的目录,并认为我们可以使用 git-subtree add 将这些目录添加回我们的本地存储库。这个过程对 svn 存储库是透明的。这效果很好,而且大小更易于管理(9+6GiB 完整克隆和 8GiB 浅克隆)。问题是我不知道我们如何才能将我们在这些“部分克隆”中所做的更改 merge 回主分支。

我认为我们可以使用通常的 pull 请求来获取它们,但由于分支的树不同,它的行为不像我希望的那样(丢失的目录被视为删除).我只想 merge 克隆目录的更改,而其他目录保持不变。

我认为使用稀疏 checkout 在这里没有帮助,因为我们仍然必须克隆完整的 repo 才能使其正常工作,这正是我试图避免的。

我可以使用一些命令组合来实现这一切吗?


这是我用来拆分目录和检查感兴趣目录的(修改过的)脚本:

split_projects.sh
我使用 git-subtree 来拆分和重新加入目录,并使用 git-replace 来提高重新拆分的速度(只处理新的提交)。请注意,重新加入提交到主存储库(我不愿意尝试提交,尤其是在 svn 镜像中)。

initial_setup.sh
这是准备本地 repo 的脚本。供 Windows 用户使用,其中许多人对 git 或命令行工具的使用经验不多。

checkout_projects.sh
实际的 checkout 脚本。

还有另一个从拆分子目录中提取更新,但我不包括在这里。

最佳答案

如果您不想将某些更改 merge 回来,请执行 merge --no-commit 并在提交之前撤消 merge 结果中的这些更改。对于不需要的删除,只需 git checkout 你想要的版本。对于不需要的更改,git checkout --patch

另一个选项,如果它真的只是折叠 merge 分支中缺少的顶层子树,可能会更简单,那就是进行 merge 并在之后修改它,a (git ls-tree @; git ls-tree @^1|grep ^04)|排序-usk4 | git mktree 将很容易地生成正确的树,所以

fixup=`(git ls-tree @; git ls-tree @^1|grep ^04)|sort -usk4|git mktree`

commit=`git show -s --pretty=%B @|git commit-tree -p @^1 -p @^2 $fixup`

git update-ref -m 'fold in missing subdirectories' @ $commit

merge 后就完成了。

关于git - 如何 merge 来自包含另一个目录子集的分支的更改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41812387/

相关文章:

git push heroku master 说 "Everything up-to-date",但应用程序不是最新的

git - 如何查找给定提交是否在分支的第一父链上

github - 从 bitbucket 克隆 repo 时出现 Google Cloud Platform 错误

bitbucket - 我可以简单地删除本地 git 克隆目录而不会出现问题吗? (乌龟git/bitbucket)

git - Git 如何忽略以数字开头的文件?

Git 交互式 rebase 挤压提交 - 任何快捷方式

windows - sourceTree (git) 中命令行的公钥问题

svn - 将源代码从 PVCS 迁移到 SVN

git - 我如何避免像这样的 git-svn 和 svn CRLF 问题?

git - git svn clone 失败后我能做什么?