Git:如何在现有的git子仓库中使用git子树?

时间:2016-04-19 13:45:25

标签: git

我有一个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

在我了解subtreesubmodule之前,我使用git进行两个回购。但是当人们看到parent_repo时,他们看不到sub_repo的代码。

enter image description here

建议我使用subtreesubmoduleWhat 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 个答案:

答案 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

将从每个子模块的上游获取最新的更改,将它们合并,并检查子模块的最新版本。

enter image description here

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/
 |     |
 |     ...
 ...

过程

  1. !!!提交对现有存储库的任何更改!!! ,否则,您将丢失它们。

  2. 在名为 parent

    parent / 文件夹中创建新的存储库
    • 您会收到与嵌套的现有存储库相关的警告;忽略它
  3. 现有文件夹复制到另一个位置。您将需要它来复制任何.gitignored

  4. 文件
  5. 使用rm -rf existing删除 existing / 文件夹并提交

    • 现在所有提交都将在parent存储库中进行跟踪
  6. 现有回购作为子树添加到 parent

    git remote add existing https://github.com/username/existing.git

    git subtree add --prefix=existing/ existing master

  7. 复制回所有被忽略的文件,因此不在现有存储库中,但对于您的项目是必需的

就这样。现在,您可以通过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 的更改将包括在父存储库中