Git 将嵌套的 git repos 视为常规文件/文件夹

arc*_*rty 10 git

我有一个像这样组织的顶级 git repo:

  • .git/
  • 回购协议/
    • .git/
    • 文件
    • 文件 2
    • 文件夹/
    • ...
  • 文件
  • 文件 2
  • 文件夹/
  • ...

我怎样才能将 gitaddcommit repoA(和repoA/.git)当作常规文件/文件夹一样?

具体来说,我想绕过将此类文件夹作为子模块的处理,但我想保留嵌套 repo 的分支/历史记录(因此.git需要该文件夹)。

我不想改变嵌套存储库的状态(通过提交或合并历史记录),也不想将它推送到远程的单独存储库。

预期的结果与我稍后tar repoA取消的结果相同tar。也就是说,所有文件都是完整的,没有被 git 修改或特殊处理。

Leo*_*eon 5

这不是直接可能的。该.git目录对于git. 当您从 git 工作树内部(不一定是从顶层)运行 git 操作而没有显式指定存储库的路径(通过选项--git-dirGIT_DIR环境变量)时,会通过查找第一个祖先目录来自动发现后者包含一个.git子目录。.git旨在被视为常规内容的目录会干扰该过程。

但是,我可以建议以下解决方法:

  1. 在您的子存储库中,将.git目录重命名为其他名称(例如.git.subrepo.pseudogit等):
mv repoA/.git repoA/.pseudogit
Run Code Online (Sandbox Code Playgroud)
  1. 添加并提交子存储库目录:
git add repoA
git commit -m "Added repoA as regular sub-directory"
Run Code Online (Sandbox Code Playgroud)

此后,子存储库树内部的 git 操作将默认使用主存储库进行工作。当您需要研究子存储库的历史记录时,您将不得不使用以下--git-dir选项:

cd repoA
git --git-dir .pseudogit log
Run Code Online (Sandbox Code Playgroud)