12

git-subtree用来从我的项目中提取目录。

git subtree split --prefix=src/SubProject --branch=SubProject origin/master

鉴于这就是我希望开始项目的方式(特别是 no ),我如何才能在连续运行时--rejoin仅将更改从origin/masterto拆分?SubProject

对于较小的项目,这一直运行良好。我可以忍受大约 5 秒的时间来拆分项目。但在较大的存储库上,这可能需要相当长的时间。我已经看到每次拆分最多需要五分钟。我想合作的一些项目在一个存储库中有超过 45 个子项目。

我尝试了很多我认为可能有效的方法,但每一种都以某种方式失败了。我的要求是:

  • 不得以任何方式弄乱origin/master(所以大多数情况--rejoin下是不可能的)
  • 它不能添加额外的合并提交(想想:--ff-only当从 获取新更改时origin/master
  • 存储库SubProject必须具有稳定的提交 ID。这意味着在对 进行一次或多次增量更新后SubProject,如果我重新运行本文顶部的原始命令,它的历史记录中应该具有相同的提交 ID。
  • 它必须是自动化的,不需要人工干预

我不害怕复杂的解决方案,但它需要自动化。因为历史改变而失败是好的;此时脚本可以退回以从头开始构建整个事物。在这种情况下,用户知道他们做了什么,所以他们可以从头开始经历一个非常漫长的重建过程。:)

--重新加入

我尝试使用--rejoin并保留一个额外的origin/masteraround副本,作为--rejoin. 我在这里遇到的问题是我无法干预git rebase origin/mastergit merge --ff-only origin/master不干预。我需要能够以自动化的方式做到这一点,所以这是不可接受的。

合并提交

我能够让它按我的意愿工作,git merge origin/master但它导致了合并提交。由于此合并提交永远不会上游,因此我认为无法预测未来的历史,因此git subtree split原始环境中的新鲜事物将无法重现相同的确切历史。我可能错了。如果是这样,请向我解释这将如何安全。:)

提交范围

我尝试使用提交范围,并且能够创建一个新的子树拆分,SubProject其中仅包含从某个时间点到HEAD. 这可能会起作用,除非它看起来好像生成了一组新的提交 ID,所以我认为这不是一个选项。

4

1 回答 1

3

实施了一个补丁subtree split简化玩这个。现在,您可以显式指定在没有其他父级时填充的父级:

$ git init
$ for i in {1..100}; do
   echo $i >q
   git add q
   git commit -m $i
   mkdir -p qqq
   echo $i > qqq/w
   git add qqq/w
   git commit -m "qqq/$i"
done

$ # let's do full split
$ /home/vi/src/git/git/contrib/subtree/git-subtree.sh split \
    --prefix=qqq --branch qqq HEAD
...7/200 (6)...58/200 (57)...142/200 (141)...176/200 (175)...
Created branch 'qqq'
f5120d3e676e2966802c8829b13a34c8d0c2dac4

$ # now let's do partial split
$ /home/vi/src/git/git/contrib/subtree/git-subtree.sh split \
    --prefix=qqq --branch qqq2 HEAD~100
...20/100 (19)...
Created branch 'qqq2'
3632fb9fc5c7a7f0b4bf8c6743e2cd372a6d8e52

$ # Now let's "continue the work" on qqq2
$ /home/vi/src/git/git/contrib/subtree/git-subtree.sh split \
   --prefix=qqq --branch qqq2 \
   --graft-parent=3632fb9fc5c7a7f0b4bf8c6743e2cd372a6d8e52 \
   HEAD~100..HEAD
Grafting 3632fb9fc5c7a7f0b4bf8c6743e2cd372a6d8e52\n
...10/100 (9)...
Updated branch 'qqq2'
f5120d3e676e2966802c8829b13a34c8d0c2dac4
于 2013-05-07T02:10:54.993 回答