如何合并包含另一个目录子集的分支的更改?

时间:2017-01-23 17:41:50

标签: git bitbucket git-svn

我会尽量保持简短。

我们有一个git存储库,它充当SVN镜像(由BitBucket管理)。这个仓库包含了自公司开始以来每个项目中的每个项目,每个开发人员克隆它都不是一个合理的请求(25 + 33GiB完全克隆和15 + GiB浅)但即便如此,我们也不会# 39;需要整个存储库的完整克隆,只需要一部分目录。

使用git-subtree,我设法拆分了所有感兴趣的目录,并认为我们可以使用git-subtree add将这些目录添加回本地存储库中。此过程对svn存储库是透明的。这很好,尺寸更易于管理(9 + 6GiB完整克隆和8GiB浅)。问题是我不知道我们如何能够在这些部分克隆中做出改变"并将它们合并回主分支。

我认为我们能够使用通常的拉取请求来获取它们,但由于树枝的树木不同,它的行为并不像我想要的那样(丢失的目录被视为删除)。我只想合并克隆目录的更改并保持其他目的不变。

我不认为使用稀疏结账会对此有所帮助,因为我们仍然必须克隆完整的回购以使其正常工作,这正是我试图避免的。

我可以用一些命令组合来使这一切都有效吗?

这是我用来拆分目录并检查目标目录的(修改过的)脚本:

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

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

checkout_projects.sh
实际的结帐脚本。

还有另一个从拆分子目录中获取更新,但我不在此处包含更新。

4 个答案:

答案 0 :(得分:4)

如果您不希望合并某些更改,请执行合并git checkout并在提交之前撤消合并结果中的这些更改。对于不需要的删除,只需git checkout --patch您想要的版本。对于不受欢迎的变化,(git ls-tree @; git ls-tree @^1|grep ^04)|sort -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 将足够容易地生成正确的树,所以

select *
from Products p
join (
      select i.productId
      from Invoice i
      group by i.productId
      having max(case when i.nvoiceType = 'proforma' then 1 else 2 end) = 1) iSum
on P.productId = iSum.productID
order by p.productId
合并后

你完成了。

答案 1 :(得分:2)

在你的情况下,我担心你必须使用樱桃选择将更改移动到原始存储库

答案 2 :(得分:2)

我拥有的最佳解决方案是在根存储库的浅层克隆的稀疏检出中运行以下内容:

<google.com>

答案 3 :(得分:2)

如果我正确理解你的脚本:

bigrepo内,$project分支 subdirs/$project上有其历史记录,其内容位于回购的根目录中 例如:如果您在git checkout subdirs/$project中运行bigrepo,则项目内容位于/(不在某些额外的子目录中)。

如果是这种情况:

我认为git subdir push -P $project的序列应该有效:

  • 来自任何地方的#34;本地回购&#34;分裂回购
  • 一个从拆分回购到bigrepo