一个 Git 仓库能否嵌套在另一个 Git 仓库中?

10

我有一个使用git进行管理的django项目。我将其git push到我的主机。现在,我想能够将其中一个目录(包括所有子目录)推送到另一个git仓库。如果可能的话,怎样才能做到呢?

编辑:所以我希望那个目录本身成为一个git仓库。

3个回答

21

您可以查看git对子模块的支持。您需要将第二个存储库作为一个子模块添加到主项目中,例如使用以下命令:

git submodule add git://wherever/blah.git library-code
git commit -m "Added a new submodule called 'library-code'"
当您切换到library-code子目录时,就好像父仓库不存在一样 - 您可以更改origin以使用您可以推送的传输方式,然后将其推送,就好像它是完全独立的。
要指定子模块处于特定版本,您应该进入子模块并使用git checkout切换到正确的版本。 然后,您返回到主存储库,使用以下命令暂存并提交新的子模块版本:
git add library-code
git commit -m 'Change the submodule version'

主仓库的树只存储子模块应该位于的版本,因此当您推送主仓库时,不会推送子模块中的任何文件。

为了拆分这个子目录并保留历史记录,您需要克隆原始仓库并使用git filter-branch重写历史记录,如本回答所述:

然后,您可以将其推送到新创建的GitHub仓库中,返回原始项目,删除子目录,并用上面描述的子模块替换它。

如果您对Git概念不太熟悉,则可能会有困难 - 我建议您事先阅读有关Git子模块的资料。


2
我已经在我的子目录中有代码,所以我想将它们转换为git仓库,并将它们推送到一个新的远程仓库(例如github)。你能给个例子吗?很抱歉我对这些东西很新手 :) - yasar
1
你想保留子目录中所有内容的历史记录吗? - Mark Longair
当我将较大的仓库推送到其他远程仓库时,子模块怎么办?这是否包括子模块的文件? - yasar
保留子模块的历史记录并不重要,只要大型仓库的历史记录没有被搞乱即可。 - yasar
1
我希望在我的回答编辑中添加了那些问题。如果您不关心子目录的历史记录,那么您就不需要担心git filter-branch步骤 - 您可以将子目录的内容复制到新创建的git存储库中,并将其推送到GitHub。 - Mark Longair

1

当您对特定目录进行更改、暂存这些更改并提交和推送时,您实际上正在“推送”该目录。

如果其他 Git 存储库仅具有您要推送的目录,并且这就是您希望将其作为存储库本身的原因,则可以查看 Git 子模块


1
你有没有研究过Git子模块?它允许Git仓库进行清晰的嵌套,但仍然保持完全独立。
这意味着你可以拥有一个子目录,具有不同的远程URL用于推送/拉取和不同的提交树+日志,而不会使主项目混乱不堪。

https://git.wiki.kernel.org/index.php/GitSubmoduleTutorial


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接