如何将一个Git仓库中的文件夹链接到另一个仓库?

121

我想创建一个公共仓库,用于存放主要仓库(私有)中的一些示例文件。是否有办法从一个Git仓库软链接几个文件夹到另一个Git仓库?

2个回答

197

那么你应该使用子模块来完成这个任务。

子模块是在同一根目录下的不同git存储库。
这样,您可以在根存储库内的文件夹级别上管理2个不同的项目

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


git submodule

像之前一样,将您的大型项目分解为子项目。
现在,使用以下命令将每个子项目添加到您的主项目中:

git submodule add <url>

项目添加到您的仓库后,您需要初始化并更新它。

git submodule init
git submodule update

截至Git 1.8.2,新增了选项--remote

git submodule update --remote --merge

将会从每个子模块中获取最新更改,将其合并,并检出子模块的最新修订版本。

正如文档所描述的:

--remote

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

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


但是,在影响与父层共享代码的C语言bug修复方案的情况下,我该如何推送提交?

同样:使用子模块将您的代码放置在主项目中作为其内容的一部分。在文件夹中本地拥有它和作为子模块的区别在于,在子模块中,内容被管理(提交)到一个不同的独立存储库中。


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

enter image description here


git subtree

Git subtree允许您将任何存储库插入到另一个存储库的子目录中。

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

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

无需编写如何设置和了解如何使用它的指南,您只需阅读这篇优秀的文章即可解释清楚。

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


10
很好的关于SubModules和SubTrees的参考资料。我没有看到你明确地解决在目标仓库中引用源仓库的子目录的问题。 - skitheo
如果您能添加一份代码示例,那将非常棒。 - mdabdullah
非常好的回答!我有一个相关问题要问:)是否可以只导入存储库A的一部分,而不是将存储库A导入存储库B?例如,B应该只包含来自存储库A的特定文件夹,而不是整个A。 - gab
你可以进行部分导入,我的信息中有我的电子邮件,请找到它并联系我,我会帮助你。 - CodeWizard
子模块的一个缺点是,如果我更改了子模块的内容,我需要提交两次,即子模块和父项目。还请参阅相关问题https://stackoverflow.com/questions/76454282/how-to-sync-a-public-subfolder-of-one-repository-with-another-repository/76462303#76462303 - Stefan

-3
我正在回答你的X问题,而不是你的Y问题(xyproblem.info);你不应该使用子模块来完成这个任务。你应该创建一个.gitignore文件来排除版本控制系统中的机密信息。或者,你可以让代码从版本控制系统目录外部读取配置文件,这样你就可以将它们保存在~/.config目录中。将配置文件存储在私有仓库中几乎永远都不是正确的方式。 @CodeWizard的答案完美地回答了Y问题。

8
楼主并没有说他想要将机密信息存储在另一个仓库中(相反,他有一个私人的、专有的仓库,他想要公开其中的一部分,包含一些示例代码)。但你提出了一个很好的普遍观点。 - Jonathan Fischer

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