如何创建现有存储库的Git子树?

11

我想创建一个现有仓库的 Git 子树,例如:

-> projectA/projectB

Project A 是父仓库,我希望将 Project B 作为 Git 子树添加到其中。

git subtree -P projectB ssh://git@github.com/projectB.git master

但它失败了,并显示以下消息:

前缀 'projectB' 已经存在。

我不想再次下载整个仓库,只想将此目录添加到我的 Git 子树中。

这个目录 Project B 没有被 Project A 的 Git 追踪。

谢谢。


1
项目B文件夹已经存在吗?如果存在,它包含任何内容吗?如果要放置子树的目录中包含任何内容,Git子树将拒绝创建该子树。 - Maic López Sáenz
目前似乎不可能(git v2.0),如果projectB文件夹已经存在,那么只能通过使用rm -rf projectB删除现有的projectB目录,然后再次使用git subtree add projectB_directory git@github.com/projectB.git master重新下载。 - Allen
2个回答

9
您可以使用普通的 git (不需要使用 git subtree)将 projectB 添加为 projectA 的子树。
cd projectA
git remote add projectB_remote git@github.com/projectB.git
git fetch projectB_remote
git checkout -b projectB_branch projectB_remote/master
git checkout master
git read-tree --prefix=projectB/ -u projectB_branch

解释

  1. 进入本地的projectA仓库。
  2. 添加一个名为projectB_remote,url为projectB的远程仓库。
  3. 克隆projectB_remote但不进行合并。
  4. 创建并切换到projectB_branch,将projectB_remote/master文件带入其中。
  5. 返回到projectA/master
  6. projectA/master中创建一个子树,其中包含projectB_branch的检出版本。

结果目录结构

projectA
    projectB
    other.txt
    project.txt
    A.txt
    files.txt

请参考http://www.git-scm.com/book/en/v1/Git-Tools-Subtree-Merging

4
尽管这个解决方案可能有效,但它并不能回答原帖的问题。 - Joshua Wilson
1
"virtual" 目录 projectB 会被创建吗? - Sandburg
1
@Sandburg 是的,“虚拟”目录projectB将在projectA下创建。这是假设您在projectA存储库中没有projectB文件夹的情况下。如果有,那么最后一个“git read-tree”步骤将失败,并显示“fatal: refusing to merge unrelated histories”错误。 - Devy

4

当添加子树时,似乎前缀(您将向其中添加子树的子目录)不能已经存在。

我通过在此子目录存在之前检出到一个提交,执行git subtree add,然后与包含我的旧子目录内容的分支合并来解决了这个问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接