10

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

如果我可以在某个版本或某个分支而不是 master 上拥有“挂载”,则可以加分

4

2 回答 2

9

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

  • 子模块
  • 子树

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


git submodule

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

# once you have a repo simply add it to git 
git submodule add <url>

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

git submodule init
git submodule update

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

git submodule update --remote --merge

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

正如文档所描述的那样:

--remote

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

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


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

使用 submodule 会将您的代码作为其内容[new folder]的一部分放在您的主项目中。

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


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

在此处输入图像描述


git subtree

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

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

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

无需写下如何设置它以及了解如何使用它,您只需阅读这篇将解释一切的优秀文章即可。

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

于 2017-02-04T19:02:25.640 回答
7

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

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

例如

RepositoryA/
  - .gitignore (first option)
  - SomeDir/
    - .gitignore (second option)
    - RepositoryB/

.gitignore(第一个选项)

添加以下之一:

  • SomeDir/RepositoryB/
  • **/RepositoryB/

.gitignore(第二个选项)

添加这个:

  • RepositoryB/

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

于 2017-02-04T23:11:28.597 回答