Git子树:将子树移动到另一个目录并拉出它

时间:2017-09-05 13:01:37

标签: git git-subtree

我们说我创建了一个这样的子树:

git subtree --add --prefix=subdir <path_to_remote> <remote_branch> --squash

然后我想移动/重命名subdir,所以我这样做: git mv subdir dir2 / subdir

现在,当我尝试将该子树拉到新的前缀时:

git subtree --pull --prefix=dir2/subdir <path_to_remote> <remote_branch> --squash

git说:

Can't squash-merge: 'dir2/subdir' was never added.

我该怎么做呢?

1 个答案:

答案 0 :(得分:2)

git subtree命令知道您的子树,因为当您add子树时,它会在第一次提交中存储名称:

Add 'subdir/' from commit 'c7fbc973614eced220dcef1663d43dad90676e00'

git-subtree-dir: subdir
git-subtree-mainline: c166dc69165f6678d3c409df344c4ed9577a2e11
git-subtree-split: c7fbc973614eced220dcef1663d43dad90676e00
带有git subtree pull选项的

--squash查找包含git-subtree-dir的提交,以查找来自远程存储库的最新提交,从而查找应用和压缩所有提交的点。

在许多情况下,git subtree split --rejoin操作将成功:

$ git subtree split --rejoin --prefix=dir2/subdir HEAD
Merge made by the 'ours' strategy.
25070c483647f8136655d0e0c6c3d62f469177aa

结果提交如下:

Split 'dir2/subdir/' into commit '25070c483647f8136655d0e0c6c3d62f469177aa'

git-subtree-dir: dir2/subdir
git-subtree-mainline: 59cc3c770e78dbc30bdfe36a6b4e14ce83b38f6c
git-subtree-split: 25070c483647f8136655d0e0c6c3d62f469177aa

在大多数情况下,将找到此提交,下一个git subtree pull --squash将成功。请注意,有时子树操作会失败,并在您的repo的工作副本中留下子树的分支。确保删除任何剩余的临时分支以开始清理。

有时上述操作没有成功,但我从未找到原因。在这些情况下,您可以重新定义添加子树的提交,并通过修改提交消息手动更改目录名称。但是,此操作会破坏其他人的整个历史记录。