我有一个parent_repo
和一个sub_repo
,如下所示:
.\parent
.\parent\parent_file.html
.\parent\.gitignore
.\parent\lib\sub_repo
.\parent\lib\sub_repo\sub_file.html
.\parent\lib\sub_repo\.gitignore
在我了解subtree
或submodule
之前,我使用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
已存在。
我可以遵循更简单的例子吗?
答案 0 :(得分:3)
首先让我们解释子树和子模块之间的主要区别:
它们都用于在现有仓库内部拥有另一个仓库。主要区别在于git submodule
是独立的自包含存储库,而subtree
将日期存储在父(原始)存储库中。
Now let's dig in and explain in more details:
强> 我可以遵循更简单的例子吗?
Submodule
是独立 git项目,因此代码将被检出新文件夹在根文件夹下,它不属于您的主分支。
您的根文件夹将包含一个子模块文件,您必须在每个克隆文件上init && update
。
# Add the desired submodule to your code base
git submodule add <url>
您必须运行两个命令:
git submodule init
初始化本地配置文件,
git submodule update
从该项目中获取所有数据,并检查超级项目中列出的相应提交:
所以完整的脚本是这样的:
git submodule add <url>
git submodule init
git submodule update
您只需要在根文件夹中,然后添加子模块文件夹。
git submodule add <url>
现在,当你克隆项目时,你只需要初始化并更新子模块
git submodule init
git submodule update
Git 1.8.2提供了一个新选项--remote
git submodule update --remote --merge
将从每个子模块的上游获取最新的更改,将它们合并,并检查子模块的最新版本。
git subtree
强> Git子树允许您将任何存储库作为另一个存储库的子目录插入
与submodule
非常相似,但主要区别在于管理代码的位置。在子模块中,内容放在一个单独的仓库中,并在那里进行管理,允许您将其克隆到许多其他仓库。
subtree
正在将内容作为根项目的一部分进行管理,而不是在单独的项目中。
不是写下如何设置它并理解如何使用它,你可以简单地阅读这篇能够解释它的优秀文章。
https://developer.atlassian.com/blog/2015/05/the-power-of-git-subtree/
答案 1 :(得分:0)
我想提供与 子树 方法有关的更具体的答案。这是我的首选方法,因为我需要能够将更改从父存储库推送到子存储库。
我们只需要创建 parent 存储库,删除 existing 存储库,然后将 existing 存储库添加回 parent 回购为子树。您的本地目录结构不会更改,模块之间的任何命名空间也不会更改。
以下假设您的本地计算机上有一个 existing 存储库,位于文件夹 existing / 中,并且您想将其嵌套在新的 parent 中存放在 parent / 文件夹中。
因此目录树应如下所示:
parent/
|
+-- existing/
| |
| +-- .git/
| |
| ...
...
过程:
!!!提交对现有存储库的任何更改!!! ,否则,您将丢失它们。
在名为 parent
的 parent / 文件夹中创建新的存储库将现有文件夹复制到另一个位置。您将需要它来复制任何.gitignored
使用rm -rf existing
删除 existing / 文件夹并提交
parent
存储库中进行跟踪将现有回购作为子树添加到 parent :
git remote add existing https://github.com/username/existing.git
git subtree add --prefix=existing/ existing master
复制回所有被忽略的文件,因此不在现有存储库中,但对于您的项目是必需的
就这样。现在,您可以通过existing
git subtree add
回购
示例:
在文件夹 existing / 中,
echo "a new text file in existing repo" >> newtextfile.txt
git add .
git commit -m "add new file to existing repo"
cd ../ # to parent folder
git subtree push --prefix=existing/ existing master
记住对 parent 存储库的更改也必须单独推送,并且对 existing 的更改将包括在父存储库中 。