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

时间:2017-02-04 11:10:07

标签: git github multiple-projects multiple-repositories

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

如果我可以拥有" mount"在特定版本或某个分支,而不是主人

2 个答案:

答案 0 :(得分:4)

您有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 子模块的最新版本。

正如the docs所描述的那样:

  

--remote

     

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

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

  

如何在子模块中修复或更改代码?

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

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

这是子模块的一个例子 - 项目在另一个项目中,每个项目都是一个独立的项目。

enter image description here

git subtree

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

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

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

不是写下如何设置它并理解如何使用它,你可以简单地阅读这篇能够解释它的优秀文章。

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

答案 1 :(得分:2)

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

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

E.g。

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

.gitignore(第一个选项)

添加其中一项:

  • SomeDir/RepositoryB/
  • **/RepositoryB/

.gitignore(第二个选项)

添加:

  • RepositoryB/

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