带子树的git clone - 前缀已​​经存在

时间:2017-07-20 18:31:40

标签: git git-subtree

我有一个回购包含"外部/"中的两个子树。文件夹中。

当我克隆repo时,它会下载所有文件,包括我之前在git subtree命令之后推送的代码。

现在,如果我想在另一台机器上克隆该repo并重新创建子树结构,那么git subtree add命令会失败,因为我想放置子树的文件夹已经包含了文件夹和文件。

这些是我跑的命令:

> git clone https://URL/<main>
> git remote add <component> https://URL/<component>
> cd <main>
> git subtree add --prefix external/<component> <component> master
ERROR: prefix 'external/<component>' already exists.

如何解决这个问题?或者,是否有更好的方法可以为新的克隆操作重新创建子树结构?

2 个答案:

答案 0 :(得分:2)

Git子树的要点是,您不需要在其他位置或另一台计算机上“重新创建”任何东西。当您clone存储库时,它已经通过常规提交将子树作为普通文件包含了

如果您只想“刷新”或“更新”子树的内容,请尝试pull

git subtree pull --prefix external/<component> <component> master

如果出于某种原因(请您澄清)确实要重新开始,则需要删除子目录,然后重新添加子树。

git rm -fr external/<component>
git commit -m "Removing old subtree"
git subtree add --prefix external/<component> <component> master

答案 1 :(得分:0)

您收到的错误是因为substree已经存在:

ERROR: prefix 'external/<component>' already exists.

这是因为克隆主仓库时,您还从subtree收到了代码。 Subtree 添加到存储库中时,您会将代码从外部branch / commit-hash提交到源存储库中;您是将源提交到您的存储库,而不是链接到外部存储库。如果/当您想将代码库从 Subtree 的源存储库插入到较新的提交时,可以执行以下命令:

git subtree pull --prefix external/<component> <component> <branch>

该命令将从指定的存储库和分支中提取HEAD,并将代码放在/external/<comonent>路径中现有代码的上方。执行此subtree命令后,您仍然需要执行git commit来更新代码。

关于Git的主要提示子树 Submodule 的不同之处在于 Submodule 创建了参考/源仓库中的快捷方式/链接到另一个(外部)仓库。使用 Submodule 时,克隆存储库的开发人员还必须具有凭据/对submodule-repo的访问权限,才能将链接的代码拉入要克隆的存储库中。 子树是对根存储库的代码提交。因此,如果您有权访问要克隆的存储库,则无需访问子树中引用的外部存储库。