【问题标题】:How can I create a gitsubtree of an existing repository?如何创建现有存储库的 gitsubtree?
【发布时间】:2013-07-24 10:58:54
【问题描述】:

我正在尝试创建现有存储库的 gitsubtree,例如:

-> 项目A/项目B

项目 A 是父项目,我想将项目 B 添加为 git 子树。

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

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

前缀“projectB”已经存在。

我不想再次下载所有存储库,我只想将此目录添加到我的 gitsubtree。

项目 A git 不跟踪此目录项目 B。

提前致谢

【问题讨论】:

  • projectB文件夹是否已经存在?如果是的话,它包含任何东西吗?如果要放置的目录包含任何内容,Git 子树将拒绝创建子树。
  • 如果 projectB 文件夹已经存在,目前似乎不可能(git v2.0),并且使用 rm -rf projectB 删除现有的 projectB 目录然后再​​执行 git subtree add projectB_directory git@github.com/projectB.git master 重新下载是唯一的选择。

标签: git repository git-subtree


【解决方案1】:

您可以使用 vanilla git 将 projectB 添加为 projectA 的子树(您不需要 git subtree)。

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 repo。
  2. 使用 projectB 的 url 添加一个名为 projectB_remote 的新远程。
  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

【讨论】:

  • 虽然此解决方案可能有效,但它不能回答 OP 问题。
  • 会创建“虚拟”目录projectB吗?
  • @Sandburg 是的,“虚拟”目录 projectB 将在 projectA 下创建。这是假设您在 projectA 存储库中还没有 projectB 文件夹。如果这样做,那么最后一个 git read-tree 步骤将失败,并出现“致命:拒绝合并不相关的历史”错误。
【解决方案2】:

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

我解决了这个问题,方法是在该子目录存在之前签出提交,执行 git subtree add,然后与包含我的旧子目录内容的分支合并。

【讨论】:

    猜你喜欢
    • 2015-09-29
    • 2019-02-14
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 2013-08-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多