git subtree:在派生存储库中更改子树分支/路径是否可行?

24
在存储库A中,文件夹sub被包括为存储库S的git子树 - 指向master分支。
我已将存储库A分叉到F。现在我想在F 中执行以下操作之一:
  • 更改sub以使用S的不同分支(即develop分支)
  • 或者:完全更改sub以使用不同的存储库
这两种情况是否有可能,如果可能,应如何操作?我需要了解任何副作用吗?
我如何确保我的子树更改在合并更改(拉取请求)时不会更新存储库A?除了隔离提交,是否还有其他方法?
1个回答

43
如果您使用的是git subtree(而不是git submodule)创建子树,则它只是一个普通的目录。要切换到另一个分支,只需删除该目录并从新分支重新创建子树即可。这是:
git rm <subtree>
git commit
git subtree add --prefix=<subtree> <repository_url> <branch>

那应该可以毫无问题地运行。


那样就不会与上游同步了吗?那我想我会试一试。 - CodeSmile
它不会与上游同步。<repository_url> 没有保存在任何地方;它只是用于命令知道从哪里获取文件。之后,您将在存储库中获得一个普通的子目录。 - elmart
啊,好的,我现在明白了... 子树只是简单地“复制”了另一个仓库提交的状态,就像我手动复制一样(但保留提交历史等信息)。所以这并没有解决我在两个仓库之间同步特定文件夹的原始问题,但已经足够回答这个问题了。 - CodeSmile
1
注意:在添加和拉取新的子树之前,最好先添加一个远程。根据我的经验,这样做效果更好,并且在添加子树后无法完成。请参见https://dev59.com/lGQn5IYBdhLWcg3wcWzM - Jorge Orpinel Pérez
由于子树是一个文件夹,您需要添加-r以递归删除它: git rm -r <subtree> - Skulas

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