我会尽量保持简短。
我们有一个充当 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/