逐步使用分支提取子树

Bea*_*sen 12 git git-subtree

我正在使用git-subtree从项目中提取目录.

git subtree split --prefix=src/SubProject --branch=SubProject origin/master
Run Code Online (Sandbox Code Playgroud)

鉴于这是我怎么想启动项目开始与(特别是不--rejoin)如何从分裂只有改变origin/masterSubProject在后续运行?

对于较小的项目,这一直很好.我可以用大约5秒的时间来分割项目.但是在较大的存储库中,这可能需要相当长的时间.我发现每次拆分需要5分钟.我想要合作的一些项目在一个存储库中有超过45个子项目.

我尝试了许多我认为可能有用的东西,但每种东西都以这种或那种方式失败了.我的要求是:

  • 绝不能以origin/master任何方式搞乱(所以大部分--rejoin都是不可能的)
  • 它不能添加额外的合并提交(想一想:--ff-only从中获取新的更改origin/master)
  • SubProject库必须有稳定的提交ID的.这意味着在一次或多次增量更新后SubProject,它应该在其历史记录中具有相同的提交ID,如果我在此帖子的顶部重新运行原始命令,它将获得.
  • 它必须是自动化的,无需人工干预

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

--rejoin

我尝试使用--rejoin并保留一个额外的副本,origin/master只是作为添加的更改历史记录的容器--rejoin.我遇到了这里的问题是,我是不能够或者git rebase origin/mastergit merge --ff-only origin/master不加干预.我需要能够以自动方式执行此操作,因此这是不可接受的.

合并提交

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

提交范围

我尝试使用提交范围,我能够创建一个新的子树分割,SubProject其中只包含一个特定时间点的提交列表HEAD.这可能会有效,除非它看起来好像生成了一组新的提交ID,所以我认为这不是一个选项.

Vi.*_*Vi. 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
Run Code Online (Sandbox Code Playgroud)