【问题标题】:Nested git repositories without submodules?没有子模块的嵌套 git 存储库?
【发布时间】:2010-02-23 11:27:37
【问题描述】:

似乎父 repo 中的 git repo 不包含在父 repo 的提交中,除非它被设置为子模块。是否可以覆盖此行为并将嵌套的 git 存储库视为任何其他目录?我不想通过子模块依赖外部依赖,而是想用git来管理项目内的这些依赖。

【问题讨论】:

  • 我不确定这是否是“管理依赖项”的正确方法,但我提出了两种实现您想要的方法,以及一些关于 Git 中子模块性质的精确度。
  • 听起来你真正想要的是子树合并。这将为您留下一个存储库和一个历史记录。
  • 您确定父仓库中的 git 仓库不包含在父仓库的提交中,除非它被设置为子模块?因为这就是我想要的,如果你是对的,那么 Git 就是开箱即用的。

标签: git


【解决方案1】:

1/ 您可以通过以下方式覆盖它:

  • git config 设置:设置环境变量$GIT_DIR
    您将嵌套 Git 工作树的 .git 目录定义为 external .git(嵌套 repo 和主 repo 的外部)
  • 或者通过将嵌套的 repo 'N' outside 设置为主 repo,但检查 repo 'N' inside 主 repo:
core.worktree

将路径设置为工作树的根目录。这可以被GIT_WORK_TREE 环境变量和--work-tree 命令行选项覆盖

在这两种情况下,想法都是有一个嵌套的工作树,其中没有任何.git 子目录。

2/ 对于子模块,嵌套的 git repo 并没有真正包含在父 repo 中。
在父树中创建一个special entry,用于记录外部Git SHA1。

new file mode 160000
index 0000000..4c4c5a2

另见“nature of Git submodules”(答案的第三部分)


九年后,this discussion 已经很清楚了:

我不想使用子模块或拐杖 例如重命名子目录中的所有.git/
我只是希望 Git 将我的 .git/ 子目录视为具有任何其他名称的普通目录。

布赖恩米。卡尔森 (bk2204) 回答:

这是不可能的。
如果不使用子模块,则无法将非裸存储库添加为父存储库的一部分。
Git 使用.git 目录来查找工作树,出于安全原因,不允许签入名为该目录的文件或目录。
允许用户签入.git 目录将允许将配置和挂钩存储为存储库的一部分,如果有人克隆它然后更改为 子存储库。

【讨论】:

  • 您的方法 1a 和 1b 非常适合我,谢谢。我确定这不是推荐的方法,但我真的需要这种灵活性。感谢您的全面回答!
  • 所以没有选项让 git 将嵌套的 .git 目录视为普通目录?
  • @Mr_and_Mrs_D 我不知道
【解决方案2】:

我找到了另一种似乎对我有用的方法

如果你 git add somefolder/ / 在最后,然后它将添加所有文件而不是将其视为子模块。

这里提到更多:http://debuggable.com/posts/git-fake-submodules:4b563ee4-f3cc-4061-967e-0e48cbdd56cb

【讨论】:

  • 这是我一直在寻找的,但如果我尝试添加嵌套的 .git 本身,我会收到一条错误消息:error: Invalid path 'test/data/fixtures/clean/.git/COMMIT_EDITMSG' error: unable to add test/data/fixtures/clean/.git/COMMIT_EDITMSG to index fatal: adding files failed 它似乎确实适用于实际文件,谢谢,它是一个开始
  • 我看到人们将嵌套的 .git 文件夹重命名为 .checkout_git blog.gopheracademy.com/advent-2015/go-in-a-monorepo 并根据需要重命名
  • 这似乎不再起作用,git 警告说要添加一个嵌套的 git 存储库,并试图像我的子模块一样添加它。
  • 这似乎对我仍然有效(2021 年 1 月)
【解决方案3】:

另见Are git submodules the only safe way to have working copies within working copies?

实际上,当我遇到当前的讨论时,我关心的问题与这里解决的问题不同:使用 git 作为一种归档工具,可以归档已经有一些 git 工作目录的文件系统树......也许另一个问题更接近我的问题。

【讨论】:

  • 这是一个针对我的问题的工具:webcache.googleusercontent.com/…。可能还有其他类似的工具。
  • 哎呀 - 评论中的链接损坏(您可能应该删除并添加到您的答案中)
【解决方案4】:

这不是最优雅的解决方案,但值得一提。

如果您压缩包含存储库的文件夹,您可以将其签入外部存储库。

这会很有帮助,因为您将拥有包括 git reflog 在内的完整状态。

【讨论】:

    【解决方案5】:

    您可以做的最简单(也是最肮脏)的事情之一就是重命名.git 文件夹

    我有这个文件夹结构:

    |- .git
    |- folders
    |- second-repo
         |- .git
         |- folders
    

    我只是从根文件夹中使用了这个 bash 命令:

    mv /.git /.not_git
    

    现在您可以进入 second-repo 并使用它自己的 git 执行命令,这样您就可以来回使用两个 git repos。

    PS:Git subomodules 是处理这个问题的正确方法,但在我的情况下,我 不能去找他们

    【讨论】:

      猜你喜欢
      • 2015-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-24
      • 2021-04-30
      • 2010-12-04
      • 2012-02-22
      相关资源
      最近更新 更多