【问题标题】:Maintain git repo inside another git repo在另一个 git repo 中维护 git repo
【发布时间】:2011-06-07 06:28:28
【问题描述】:

这是我想要的:

REPO-A
  /.git
  /otherFiles
  /REPO-B
    /.git
    /moreFiles

我希望能够将 REPO-A 的所有内容推送到 REMOTE-A,将 REPO-B 推送到 REMOTE-B。

可能吗?

【问题讨论】:

  • 下面简单流行的想法之一,只需 git ignore REPO_B:cd REPO-A && touch .gitignore && echo "./REPO-B" >> .gitignore.

标签: git version-control github


【解决方案1】:

听起来你想使用 Git submodules

Git 使用子模块解决了这个问题。子模块允许您将 Git 存储库作为另一个 Git 存储库的子目录。这使您可以将另一个存储库克隆到您的项目中并保持您的提交分开。

【讨论】:

  • 不完全是:它不会推送 repoA 的 all 内容:只有 A 加上对 B 的引用。但我不批评你的答案,当我重新阅读 OP 的问题时,我急于写几乎相同的东西;)
  • 这几乎是子模块的用例。 REPO-A 和 REPO-B 本身就被视为 git repos,具有自己的提交、来源、历史记录等。
  • 所以如果我没看错,我可以独立地检查一个完全在我找到它的之外的 submodule-d 存储库吗?我将如何获取已经存在的 repo 并将其作为另一个项目中的子模块引用?
  • 我并没有寻找与 OP 完全相同的解决方案,我认为平均而言,这可能是对类似问题的更多搜索答案:“是否将 git REPO-B 放入 git REPO-嵌入参考或 git REPO-B 的完整副本?”。
【解决方案2】:

我一直使用符号链接来维护两个独立且不同的存储库。

【讨论】:

  • 对于 git submodules 和 git sub-tree 看起来多么令人困惑,这是一个有效的答案。
  • 这对于从多个远程存储库组装一个应用程序也非常有用
  • 为了维护两个独立且不同的 repos,将 repo B 保留在 repo A 中并仅将 repo B 添加到 repo A 的.gitignore 不是可以吗?
  • 我正在考虑按照 Fabien 的建议进行操作,这样做有问题吗?
  • 我将 git 存储库分开,并将对 REPO-B 所做的更改复制到嵌套在 REPO-A 中的 REPO-B(不带 .git)的副本中。我用 rsync 做到这一点。在对 REPO-B 进行任何更改后,我运行 rsync -avh --delete --exclude='.git' REPO-B/ REPO-A/REPO-B-copy/
【解决方案3】:

是的,您可以使用您绘制的文件层次结构完全按照您的要求进行操作。 Repo-B 将是独立的,并且不知道 Repo-A。 Repo-A 将跟踪它自己的文件和 Repo-B 的文件中的所有更改。

但是,我不建议这样做。每次更改文件并在 Repo-B 中提交时,您都必须在 Repo-A 中提交。 Repo-B 中的分支会与 Repo-A 混淆,并且 Repo-A 中的分支会很不稳定(删除文件夹等问题)。子模块绝对是要走的路。

【讨论】:

  • 你不能简单地将 REPO-B 添加到 /REPO-A/.gitignore 中吗?
  • @mikkelbreum 我也有同样的想法。我们目前在我们的主要项目中使用 subverion,并在其中一个子文件夹中使用 git repo。使用 SVN,我只是将带有 git repo 的文件夹添加到 svn:ignore 属性中,我问自己是否可以使用 git 做同样的事情。
  • 好吧,我不明白为什么将嵌套的 git repo 添加到父 repo 的忽略列表中不应该工作。但同时我有一种感觉必须有一些我没有'没想到,因为这种方法很少被推荐,而且很多人不鼓励嵌套 git repos。
  • 我刚刚实现了这个确切的场景。我在一个子文件夹中有一些未压缩的 CSS 文件,我不想将它们推送到远程仓库,所以它在我的 .gitignore 中。但我确实想在本地跟踪这些文件的更改。我在包含未压缩文件的文件夹中设置了一个存储库,并将所有文件添加到该存储库中。父仓库仍然忽略它,但我可以跟踪子仓库内的更改。无论是否推荐,此解决方案对于此类特定情况至关重要。
  • 我知道,每当您在一个存储库中切换分支时,另一个存储库会看到一大堆更改,但为什么“在 Repo-A 中进行分支会很不稳定(删除文件夹等问题)。” ?谢谢!
【解决方案4】:

您可以在父 A 存储库中使用 .gitignore 文件(忽略 B),但首先要确保当前未跟踪 B 存储库:在添加父库之前提交 .gitignore第二个B 存储库。

【讨论】:

    【解决方案5】:

    您可以使用“git-subrepo”来实现您想要的(REPO-A 存储库包含所有文件,包括文件夹 REPO-B 中的文件,而不仅仅是参考):

    https://github.com/ingydotnet/git-subrepo

    如果您的某些贡献者没有安装 subrepo 命令,它仍然有效;他们将看到完整的文件夹结构,但无法提交对子存储库的更改。

    【讨论】:

      【解决方案6】:

      很多选择,最好的取决于您的目的:

      • 如果想将父级保持为不同应用程序的容器,其中一些最终可能成为repos,只需使用裸Git将它们视为不同的repos(没有子模块没有子仓库)。无需学习更多 git 功能。

      • 如果您希望将父级保留为不同 repos 的“项目”,并且在管理不同协作者的访问时感到安全,则为不同的 repo 文件夹使用符号链接的解决方案是一个不错的选择。同样,无需学习更多 git 功能。

      解释:

      如果其中一个应用程序变成了一个 repo,只需 git init 那里,添加远程 repo 并忘记 git 教程并将时间花在应用程序上。它只是工作,并且在父 repo 中,其他应用程序的提交仍然是原子的,有时会有额外的提交,是的,但是您 不需要 需要为每次提交提交 parentA回购B。您可以在两个 repos 上应用不同的权限(尽管父级可以拥有 repoB 代码,除非您使用 .gitignore 忽略 repoB)。

      【讨论】:

        【解决方案7】:

        就我而言,我不想将 repo A 与 repo B 合并,因此 repo 中的 repo 工作得很好。只需为repos 仔细更新.gitignore。 并确保在使用 git 命令时留在相应的目录中。

        一些快速说明:

        1. repos 将独立运行,因此无法合并。
        2. 父 repo 将包含子文件夹和文件中的所有更改 除非添加到其.gitignore
        3. 子存储库将包含所有 除非添加到其子文件夹和文件中 .gitignore
        4. 父母和孩子的.gitignore文件将起作用 彼此独立。 因此,例如,如果您想忽略子存储库中的文件,但又想 要将其推送到父仓库中,只需将文件添加到子仓库的.gitignore
        5. 如果两个repos需要合并,上述指南将被视为无效。因此,应适当研究整体案例以在回购策略中使用回购。

        感谢您提供上述所有有用的答案。如果需要,请随时更新我的​​答案。

        【讨论】:

          猜你喜欢
          • 2011-11-01
          • 1970-01-01
          • 2012-01-06
          • 2017-06-03
          • 1970-01-01
          • 1970-01-01
          • 2014-02-16
          • 1970-01-01
          • 2014-09-20
          相关资源
          最近更新 更多