Git:如何将Git子树与现有的Git子repo结合使用?

icnyk63a  于 2022-09-21  发布在  Git
关注(0)|答案(2)|浏览(262)

我有一个parent_repo和一个sub_repo,如下所示:

.parent
.parentparent_file.html
.parent.gitignore
.parentlibsub_repo
.parentlibsub_reposub_file.html
.parentlibsub_repo.gitignore

在我了解subtreesubmodule之前,我对这两个repos都使用了Git。但当人们看到parent_repo时,他们看不到sub_repo的代码。

建议使用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已经存在。

有没有更简单的例子可以让我效仿?

nwnhqdif

nwnhqdif1#

首先,让我们解释一下子树和子模块之间的主要区别:

它们都用于在现有回购中进行另一次回购。主要区别在于,gitsubmodule是独立的自包含存储库,而subtree将日期存储在父(原始)存储库中。

Now let's dig in and explain in more details:

有没有更简单的例子可以让我效仿?

  • Submodule*是一个独立Git项目,因此代码将被 checkout 到根文件夹下的新文件夹,而不是主分支的一部分。

您的根文件夹将包含一个子模块文件,并且您必须在您创建的每个克隆上init && update它。


# Add the desired submodule to your code base

git submodule add <url>

您必须运行两个命令:

git submodule init

初始化本地配置文件,并

git submodule update

要从该项目获取所有数据并 checkout 您的超级项目中列出的相应提交:

所以完整的剧本是这样的:

git submodule add <url>
git submodule init
git submodule update

您只需位于根文件夹中,然后添加子模块文件夹。

git submodule add <url>

现在,当您克隆项目时,只需初始化并更新子模块

git submodule init
git submodule update

Git 1.8.2提供了一个新选项--远程

git submodule update --remote --merge

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

git subtree

  • Git子树允许您将任何存储库作为另一个存储库的子目录插入*

submodule非常相似,但主要区别在于您的代码在哪里被管理。在子模块中,内容放在单独的repo中,并在那里进行管理,这允许您将其克隆到许多其他repos中。

  • subtree*将内容作为根项目的一部分进行管理,而不是在单独的项目中。

不需要写下如何设置和理解如何使用它,你可以简单地阅读这篇出色的帖子,它将解释一切。

https://developer.atlassian.com/blog/2015/05/the-power-of-git-subtree/

yhxst69z

yhxst69z2#

我想提供一个与子树方法相关的更具体的答案。这是我首选的方法,因为我需要能够将更改从父repo推送到子repo。

我们只需创建repo,删除现有repo,然后将现有repo作为子树添加回repo。您的本地目录结构不会改变,模块之间的任何命名空间也不会改变。

下面假设您的本地计算机上的文件夹Existing/内有一个现有Repo,并且您希望将其嵌套在文件夹Parent/中的新ParentRepo中。

因此,目录树应该如下所示:

parent/
 |
 +-- existing/
 |     |
 |     +-- .git/
 |     |
 |     ...
 ...

进程

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/*中,

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

请记住,对回购的更改也必须单独推送,对现有的更改将包括在父回购*中。

相关问题