11

我正在使用 Avery Pennarun 的 git-subtree,它是 git 的扩展。

如何使用 git subtree 从子仓库中挑选提交到我的主仓库中?另外,在我已经对该前缀执行 git subtree pull 之后,如何转到子仓库历史记录中的特定提交?

我主要在壁球提交模式下运行它。

4

1 回答 1

7

我如何进入子回购历史中的特定提交?

如果你已经压缩了提交,那么就没有办法了,因为 squash 会丢失不同的提交。

否则,使用未压缩的子树,您可以导航到子树的任何提交,其哈希值与创建子树的原始存储库中的哈希值相同。

git subtree(没有壁球)实际上将来自外部存储库的所有相关提交作为当前存储库中的独立树添加到您的存储库中。当您执行 a 时,git subtree add您会注意到添加了几个提交(来自外部存储库的所有原始提交)和最后一个合并提交,它将内容从该子树移动到使用该--prefix选项指定的给定目录。简而言之,它从另一个不相关的存储库中签出一个分支,然后通过将所有内容移动到给定的子文件夹中将其合并到您当前的分支中。

这意味着您可以使用外部回购的历史记录,您可以像这样签出它,请记住,作为一个完全不同的树,这个签出可能会修改您工作区的所有内容,这在大项目可能很长。

这使我们进入第二个:

如何使用 git subtree 从子仓库中挑选提交到我的主仓库中?

似乎目前没有git subtree自己支持的“樱桃采摘”。但是考虑到上述所有的含义,可以做到以下几点。

# move yourself to the subtree commit of your choice
git checkout <subtree-hash>

# fetch commits from the subtree repository, to have available the commit you want
# to cherry pick.
git fetch <path-to-remote>

# cherry pick the hash you want
git cherry-pick <cherry-hash>

# move back to your original branch
git checkout <your-branch>

# subtree merge your cherry pick (using the previous HEAD),
# so that it gets moved to the correct location specified by prefix.
git subtree merge --prefix <subtree-prefix> HEAD@{1}

# Since you probably fetched more commits that you needed from
# the remote, you might want to clean those that where not needed
git gc

考虑到这样做之后,如果您尝试git subtree pull对子树进行更新,并且它包括您挑选的提交,您将以冲突结束,因为您将在同一个地方进行两次更改。

如果您可以访问原始子树存储库,另一个更简单的选择是在一个分支中选择樱桃,然后只git subtree pull选择那个特定的分支。

于 2013-01-17T01:08:18.653 回答