5

想象一下,您有一个带有子目录“A/mySubDir”的仓库“A”,并且您想将“A/mySubDir”分离到一个新的仓库“B”中

git init B
cd <repo A>
git subtree split --prefix==A/mySubDir --branch=split
git push 'B' split:master

假设 repo 'A' 上的 HEAD 现在在 12fe。我更新了“A/mySubDir”中的一些文件。

当“A/mySubDir”中的文件发生变化时,如何使“B”保持最新?

git subtree split --prefix==A/mySubDir --branch=split 12fe..

以错误结尾说:Branch 'split' is not an anchestor of commit 'XXXX'

有没有人有胶水。

问候,格特

4

1 回答 1

5

您已经完成了第一步(拆分您的存储A库),但您还没有将存储库B放回 A,如“使用 Git 子树进行存储库分离”中所述:

这是一个摘录,适合您的A/mySubDir - B情况:

将存储库添加为主存储库的子树

在您的主存储库中,您需要摆脱拆分的原始文件,然后将远程存储库添加为子树。

删除您拆分的整个目录,然后提交。

git rm -r A/muSubdir
git commit -am "Remove split code."

将新的共享存储库添加为远程

git remote add B /url/to/B.git

现在将远程存储库添加为子树

git subtree add --prefix=A/mySubDir --squash shared master

注意:我们使用这个-–squash开关是因为我们可能只想要一个代表X共享模块版本的快照提交,而不是让我们自己的提交历史与虚假的上游错误修复提交复杂化。当然,如果您想要整个历史记录,请随时关闭该开关。

您现在拥有基于上游存储库的子树。好的。

http://makingsoftware.files.wordpress.com/2013/02/gitsubtreeadd_thumb.png?w=500&h=196

在图像中,您可以看到底部提交是包含所有上游代码的压缩提交,它与您的代码合并。

重要提示:不要试图重新设置此. 按原样推。
如果你变基, git subtree 将无法在你执行 next 时协调提交subtree pull

到目前为止,一切都很好。但如果您无法从上游存储库接收更改,这并没有多大用处。幸运的是,这很容易。

拉取上游变更

要从上游存储库中提取更改,只需使用以下命令:

git subtree pull --prefix=A/mySubDir --squash shared master

(您将所有较新的上游提交压缩为一个,然后将合并到您的存储库中)。
重要提示:如上所述,不要对这些提交进行变基

将更改推送到上游存储库

为上游存储库贡献更改非常简单:

git subtree push --prefix=A/mySubDir --squash shared master
于 2013-11-09T10:10:05.197 回答