如何通过压缩提交将现有的subdir作为另一个git仓库的子树?

时间:2013-10-31 03:29:44

标签: git git-subtree

首先,我错误地将另一个repo源直接复制到一个较大的项目中,在一个子目录中。从那时起,原始的repo和subdir都发生了变化。现在我已经了解了git-subtree,我想将子目录作为一个真正的子树,以便我可以轻松地同步原始仓库中的更改。

我尝试了'git-subtree split',然后从原始repo中获取最新来源,它只是起作用。但是,我不想要整个历史,但'--squash'不能用于'拆分',这是我的命令

git subtree split -P xxx-dir --onto==1940032
git remote add xxx https://github.com....
git fetch xxx
git subtree pull -P xxx-dir xxx master
# the pull worked, but whole history of xxx was imported too. '--squash' didn't work for above 'pull'

git subtree merge -P xxx-dir xxx/master --squash
# Can't squash-merge: 'xxx-dir' was never added. 

看起来像壁球只适用于添加但不分割的子树。

有什么想法吗?感谢。

2 个答案:

答案 0 :(得分:1)

我对git-subtreegit subtree merge

感到困惑

它们是不同的东西但是git-subtree可能是某种git subtree merge stuff的包装器 https://git-scm.com/book/en/v1/Git-Tools-Subtree-Merging

对于两者之间的差异,这是一个很好的答案:
What is the difference between git subtree merge and git-subtree

据我所知,最容易做到的是

1。删除xxx-dir目录并提交更改

rm -r xxx-dir
commit -am "xxx subtree"

2。添加子树

git subtree add --prefix=xxx-dir --squash xxx master

缺点是这样做会改变3个提交的主要回购历史记录:

  1. 删除xxx-dir
  2. 的提交
  3. 将“导入”子树及其历史记录压缩为一次提交的提交
  4. 合并导入子树的提交
  5. 据我所知,这是git-subtree的一种限制。

    顺便说一句,这应该是the source code of git-subtree也许比我更熟练的人可以深入研究。

    侨!

答案 1 :(得分:0)

关于:

git subtree pull -P xxx-dir xxx master
# the pull worked, but whole history of xxx was imported too. '--squash' didn't work for above 'pull'

看来你没有使用--squash。或者你是想说你再次尝试了这个命令,而不是你在这里写的那个,用--squash? git subtree pull --squash -P xxx-dir xxx master

......并且关注:

git subtree merge -P xxx-dir xxx/master --squash
# Can't squash-merge: 'xxx-dir' was never added.

你从哪个分支运行过这个?您似乎正在尝试将已签出的同一分支中的更改合并到自身的子文件夹中。由于命令失败,因此无法合并。我不认为壁球是问题所在,只是它恰好是一种失败的壁球式合并。