如何将文件夹从 git repo 链接到另一个 repo?

Posted

技术标签:

【中文标题】如何将文件夹从 git repo 链接到另一个 repo?【英文标题】:How to link folder from a git repo to another repo? 【发布时间】:2016-08-01 23:25:39 【问题描述】:

我想创建一个公共仓库来放置我的主仓库(私有)中的一些示例文件。有没有办法将几个文件夹从 git repo 软链接到另一个 git repo?

【问题讨论】:

【参考方案1】:

那么你应该为这个任务使用子模块。

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

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


git submodule

像您目前所做的那样,将您的大项目分解为子项目。 现在将每个子项目添加到您的主项目中:

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。


但是,在 C 中的 bug 修复会影响与父层共享的代码的情况下,我将如何推送提交?

再次重申:使用子模块会将您的代码作为其内容的一部分放在主项目中。将其本地放在文件夹中或将其作为子模块的一部分之间的区别在于,在子模块中,内容被管理(提交)到不同的独立存储库。


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


git subtree

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

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

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

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

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

【讨论】:

很好地参考了子模块和子树。我没有看到您明确解决了在目标存储库中引用源存储库的子目录的问题。 如果能加个代码示例就好了。【参考方案2】:

回答你的 X 问题而不是你的 Y 问题 (xyproblem.info),你应该使用子模块来完成这个任务。您应该创建一个 .gitignore 以从 VCS 中排除机密。或者,您可以让代码从 VCS 目录之外读取配置文件,这样您就可以将它们保存在 ~/.config 中。将配置文件存储在私有仓库中几乎从来都不是正确的方法。

附: CodeWizard 的回答完美地回答了 Y 问题。

【讨论】:

OP 没有说他想在另一个仓库中存储秘密(相反,他有一个私有的,即专有的仓库,他想公开这个仓库的一个子集,包含一些示例代码)。但你提出了一个很好的概括性观点。

以上是关于如何将文件夹从 git repo 链接到另一个 repo?的主要内容,如果未能解决你的问题,请参考以下文章

markdown 将git stashes从一个repo移动到另一个repo

如何从一个 Git 存储库迁移到另一个 Git 存储库?

如何删除git嵌套repo但保留其中一个分支的文件?

sh 将一个git repos复制到另一个

将 git repo 合并到另一个 repo 的分支中

Git将包含所有子模块的repo镜像到另一个repo