如何"挂载"一个github存储库作为另一个存储库的子文件夹?

ein*_*ica 5 git github multiple-projects multiple-repositories

我有一个名为"foo"的github存储库(或者更确切地说是"myusername/foo").现在假设我想创建一个名为"bar"的存储库,它使用foo中的代码; 我只能制作文件的副本,但我不想需要提取更新 - 我想总是只看到"foo"存储库中的任何内容; 并且没有提交"来自foo的更新".我相信我已经注意到一些存储库,其中子文件夹实际上是单独的存储库; 我知道git支持子存储库或其他一些东西.那么,我可以执行这样的"存储库挂载"吗?如果是这样,怎么样?

如果我可以在某个版本或某个分支而不是主分支上安装"挂载",则可以获得奖励积分

Cod*_*ard 7

您有 2 个主要选项来管理 git 中的子项目。
Git 没有任何依赖管理器,最常见的选项如下:

  • 子模块
  • 子树

Submodules
允许将外部存储库嵌入源树的专用子目录中,始终指向特定提交。


git submodule

为了使用子模块,每个文件夹都将是一个独立的存储库,并将在不同的位置进行管理和存储。Git 将检出特定的提交(提交、版本、标签等)并将其用作子模块的HEAD。大多数情况下,子模块将位于分离的 HEAD 中。

# once you have a repo simply add it to git 
git submodule add <url>
Run Code Online (Sandbox Code Playgroud)

一旦将投影添加到您的存储库中,您必须初始化并更新它。

git submodule init
git submodule update
Run Code Online (Sandbox Code Playgroud)

Git 1.8.2--remote开始,添加了新选项

git submodule update --remote --merge
Run Code Online (Sandbox Code Playgroud)

fetch每个子模块中上游的最新更改merge them in,以及子模块check out的最新版本。

正如文档描述的那样:

--remote

此选项仅对更新命令有效。不要使用超级项目记录的 SHA-1 来更新子模块,而是使用子模块的远程跟踪分支的状态。

这相当于在每个子模块中运行 git pull 。


如何修复或更改子模块内的代码?

使用子模块会将您的代码作为其内容[新文件夹] 的一部分放置在您的主项目中。

将它放在本地文件夹中或将其作为子模块的一部分之间的区别在于,在子模块中,内容被管理(提交)到不同的独立存储库,如上所述。


这是子模块 - 另一个项目中的项目的说明,其中每个项目都是一个独立的项目。

在此处输入图片说明


git subtree

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

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

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

无需写下如何设置它并了解如何使用它,您只需阅读这篇出色的文章,它将解释这一切。

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


And*_*ost 7

除了子模块和子树,根据您的特定需求,您可能还想拥有另一个没有任何逻辑和管理的存储库。

在这种情况下,您可以将另一个存储库放在子目录中并将该子目录添加到.gitignore文件中。

例如

RepositoryA/
  - .gitignore (first option)
  - SomeDir/
    - .gitignore (second option)
    - RepositoryB/
Run Code Online (Sandbox Code Playgroud)

.gitignore(第一个选项)

添加其中之一:

  • SomeDir/RepositoryB/
  • **/RepositoryB/

.gitignore(第二个选项)

添加这个:

  • RepositoryB/

这种方式,正如我所说,不会添加任何逻辑/管理。它只是让您可以使用来自两个存储库的任何修订版本而不会发生任何冲突。