我有一个parent_repo
和一个sub_repo
,如下所示:
.parent
.parentparent_file.html
.parent.gitignore
.parentlibsub_repo
.parentlibsub_reposub_file.html
.parentlibsub_repo.gitignore
在我了解subtree
或submodule
之前,我对这两个repos都使用了Git。但当人们看到parent_repo
时,他们看不到sub_repo
的代码。
建议使用subtree
或submodule
。What does a grey icon in remote GitHub mean
那我该怎么办呢?要使sub_repo
代码在parent_repo
中可用?
我查看了子模块和子树的文档。看起来子树比子模块更好。但是这些教程并不是很有说明性的(https://medium.com/@v/git-subtrees-a-tutorial-6ff568381844#.aztjizd8g).
我运行git subtree add —-prefix=lib/sub_repo my-subtree master
,它报告前缀lib/sub_repo
已经存在。
有没有更简单的例子可以让我效仿?
2条答案
按热度按时间nwnhqdif1#
首先,让我们解释一下子树和子模块之间的主要区别:
它们都用于在现有回购中进行另一次回购。主要区别在于,git
submodule
是独立的自包含存储库,而subtree
将日期存储在父(原始)存储库中。Now let's dig in and explain in more details:
有没有更简单的例子可以让我效仿?
Submodule
*是一个独立Git项目,因此代码将被 checkout 到根文件夹下的新文件夹,而不是主分支的一部分。您的根文件夹将包含一个子模块文件,并且您必须在您创建的每个克隆上
init && update
它。您必须运行两个命令:
初始化本地配置文件,并
要从该项目获取所有数据并 checkout 您的超级项目中列出的相应提交:
所以完整的剧本是这样的:
您只需位于根文件夹中,然后添加子模块文件夹。
现在,当您克隆项目时,只需初始化并更新子模块
Git 1.8.2提供了一个新选项--远程
将从每个子模块的上游获取最新的更改,合并它们,并检出子模块的最新版本。
git subtree
与
submodule
非常相似,但主要区别在于您的代码在哪里被管理。在子模块中,内容放在单独的repo中,并在那里进行管理,这允许您将其克隆到许多其他repos中。subtree
*将内容作为根项目的一部分进行管理,而不是在单独的项目中。不需要写下如何设置和理解如何使用它,你可以简单地阅读这篇出色的帖子,它将解释一切。
https://developer.atlassian.com/blog/2015/05/the-power-of-git-subtree/
yhxst69z2#
我想提供一个与子树方法相关的更具体的答案。这是我首选的方法,因为我需要能够将更改从父repo推送到子repo。
我们只需创建父repo,删除现有repo,然后将现有repo作为子树添加回父repo。您的本地目录结构不会改变,模块之间的任何命名空间也不会改变。
下面假设您的本地计算机上的文件夹Existing/内有一个现有Repo,并且您希望将其嵌套在文件夹Parent/中的新ParentRepo中。
因此,目录树应该如下所示:
进程:
1.**!提交对现有回购的任何更改!**否则,您将丢失这些更改。
在名为Parent的*Parent/*文件夹中创建新回购
您将收到与嵌套的现有回购相关的警告;忽略它
将Existing文件夹复制到其他位置。您将需要它来复制回任何.gitignored格式的文件
删除包含
rm -rf existing
的*Existing/*文件夹并提交现在将在
parent
回购中跟踪任何提交将已有回购作为子树添加到Parent中:
git remote add existing https://github.com/username/existing.git
git subtree add --prefix=existing/ existing master
就是这样。现在,您可以通过
git subtree add
单独将任何更改推送到existing
回购示例:
在文件夹*Existing/*中,
请记住,对父回购的更改也必须单独推送,对现有的更改将包括在父回购*中。