这是一个示例目录结构
ParentRepo/
.git/
parent_file
ChildRepo/
.git/
child_file
child_untracked
我希望 ParentRepo 跟踪其自身下所有文件的更改(跟踪parent_file
、child_file
、child_untracked
但不跟踪ChildRepo/.git
),就好像ChildRepo
它不是 git 存储库一样,但我需要将其保留ChildRepo
为 git 存储库
有三个硬性要求
- ChildRepo 的内容必须直接在 ParentRepo 中跟踪,而不是作为对 ChildRepo 提交的引用。例如,我必须能够
ChildRepo/
仅使用目录中的信息在 ParentRepo 历史记录中的任何时间点删除和恢复其内容ParentRepo/.git/
,而无需使用来自其他服务器或备份的 ChildRepo 外部副本。将 ChildRepo 添加为 ParentRepo 的子模块是不够的,因为如果整个目录 ChildRepo 被删除,则无法仅使用 ParentRepo 中的信息进行恢复。ChildRepo/.git/
无需恢复 - ChildRepo 必须保留为一个 git repo,并拥有独立于 ParentRepo 的开发历史;我们不能删除该
ChildRepo/.git/
文件夹 - ParentRepo 必须能够跟踪从未提交给 ChildRepo 的更改,例如,
child_untracked
可能永远不会进入 ChildRepo 的历史记录,但仍然可以从 ParentRepo 跟踪它
目前,git 将任何带有 .git/ 子目录的目录视为 git repo,我需要绕过这种行为
这些是奇怪的冲突要求的原因
- 任何先前版本的完整构建都必须是可能的,但 ChildRepo 的上游副本无法保证将来可用。如果将来 ChildRepo 从 ParentRepo 中移除,则可能会破坏依赖于 ChildRepo 的先前构建,因为其内容未存储在 ParentRepo 中,并且上游已被永久删除。至于为什么 ChildRepo 不能单独备份,因为没有办法强制要求 ChildRepo 的副本必须与 ParentRepo 一起存储,以备 ParentRepo 的整个未来使用;而且,例如,如果 ChildRepo 的历史记录被重写,也无法保证 ChildRepo 的副本包含 ParentRepo 引用的所有提交。保存先前的构建是主要目标,并且在此至关重要,因此父级仓库必须跟踪所有依赖项的内容,而不仅仅是版本。
- ChildRepo 必须独立于 ParentRepo 追踪自己的开发历史
- 这并不总是有意义的,也不总是能够在我需要提交 ParentRepo 的确切时刻提交 ChildRepo
使用将其作为子模块取消跟踪
git rm --cached
,然后使用低级工具将其重新添加为子目录(或者更确切地说,添加一些单独的文件):以前可以简单地这样做:
尾部
/
很重要,它会导致添加内容而不是存储库。不幸的是,在当前的 Git 版本中,这似乎不再起作用。请注意,即使您尝试添加子目录,也无法成功——排除功能是硬编码的。(但您可以将其分支到父目录以保留本地副本。)
.git
git fetch