【发布时间】:2019-07-18 03:55:01
【问题描述】:
我有一个类似这样的项目:
+ MonoRepo
- .git
+ PublicUtil
- .git
- PublicFile.js
+ PrivateStuff
- internalUseOfPublicUtil.js
通过这种结构,我们可以将更新推送到 PublicUtil,这些更新是受版本控制的并且可供公众查看。然后,同时在开发方面,我们只使用 MonoRepo 进行所有提交,然后有一个脚本在必要时推送到 subgits。
我们需要这个,因为(实际上)项目要大得多。想象一下 30 个 PublicUtil 存储库。我们不能使用子模块,因为这将导致内部开发人员不得不推送到多个存储库进行一次更新(通常,多个存储库需要同时修改),然后更新 MonoRepo。这意味着在连接不同 PR 之间的点时会浪费大量时间,并且当一个子模块在没有另一个子模块的情况下被拉出,或者某些东西还没有被推送时,偶尔会出现损坏,等等。
无论如何,既然我已经解释了我为什么要尝试实现这个奇怪的事情,那么问题/问题是:
据我所知,git 不允许用户从子文件夹中推送 .git。但是,我可能错了。所以,我不妨问一下:
有没有办法不忽略子文件夹中的 .git?
我可以很好地设置项目,但是如果我推送 MonoRepo 然后将其拉到另一台计算机上,它不会附带任何子文件夹 git,我将无法执行任何操作花式公开发布私人 git 内容的部分。
附:目前,我对如何解决这个问题的最佳猜测是制作一个用于重命名 git 文件夹的 pre-commit 和 post-commit 挂钩,仅由 MonoRepo 使用。我还需要一个后克隆……它会起作用,但如果可能的话,我宁愿不要那么笨拙。
【问题讨论】:
-
只需在每个不是顶级
.git的.git上运行rm -rf。如果您没有删除.git目录但 确实 以某种方式击败了子模块检测器,那么当您现在添加您将拥有的所有工作树文件时,您将获得相同的结果。 (是的,您可以这样做,但这种方式更容易。) -
我正在尝试将这些 .git(及其内容)包含在我的父级 .git 中。不要删除它们。我误解了你的建议吗?
-
你别无选择。 Git 不存储存储库。 Git 只存储 files (作为单个提交中的条目)。有一种特殊类型的文件,称为 gitlink,它将提交的哈希 ID 存储在另一个 Git 存储库中。这仅作为子模块的一部分有用:子模块告诉您的 Git 要克隆的其他 Git 存储库。然后 gitlink 告诉你的 Git 在另一个 Git 存储库中还有什么其他提交到另一个 Git 存储库中的
git checkout。 -
我没有 git 子模块。我已经解决了这些问题。我只是想存储文件。特别是在
**/.git中找到的文件。 -
嗯,你可以存储它们,但是你必须把它们变成一个 Git 存储库来检查它们——因为存储在 Git 存储库中的提交中的文件不是作为常规文件存储的,而是作为对象的数据库。然后,您必须运行
git checkout以将 Git 化的文件从数据库中提取为有用的格式。