【问题标题】:Is it possible to have a git repo inside another git repo是否可以在另一个 git repo 中有一个 git repo
【发布时间】:2011-11-01 07:12:50
【问题描述】:

我有一个用 git 管理的 django 项目。我正在将它推送给我的主机。现在,我希望能够将其中一个目录(包括所有子目录)推送到另一个 git repo。如果可能的话,怎么可能?

编辑:所以我希望那个目录本身就是一个 git repo。

【问题讨论】:

    标签: git git-submodules


    【解决方案1】:

    您可以查看 git 对 submodules 的支持。您可以将第二个存储库作为子模块添加到您的主项目中,例如使用如下命令:

    git submodule add git://wherever/blah.git library-code
    git commit -m "Added a new submodule called 'library-code'"
    

    当您更改为 library-code 子目录时,就好像父存储库不存在 - 您可以更改 origin 以使用您可以推送然后推送的传输,就好像它完全独立一样。

    要指定您希望子模块处于特定版本,您应该更改为子模块并使用git checkout 切换到正确的版本。然后,您更改回主存储库并暂存并提交新的子模块版本:

    git add library-code
    git commit -m 'Change the submodule version'
    

    主仓库的树只存储子模块应该在的版本,所以当你推送主仓库时,它不会推送子模块中的任何文件。

    为了拆分此子目录,同时保留历史记录,您需要克隆原始存储库和用户 git filter-branch 以重写历史记录,如此答案中所述:

    然后您可以将其推送到新创建的存储库 GitHub 存储库,返回到您的原始项目,删除子目录,并将其替换为如上所述的子模块。

    如果您对 git 概念不是很熟悉,那么这对您来说可能会很困难 - 我建议您事先阅读 git 子模块。

    【讨论】:

    • 我的子目录中已经有代码,所以我想将它们转换为 git repo,并将它们推送到新的远程 repo(例如 github)。你能举个例子吗?我很抱歉我在这些事情上这么新手:)
    • 是否要保留子目录中所有内容的历史记录?
    • 当我将更大的仓库推送到其他远程仓库时,子模块呢?这是否包括子模块的文件?
    • 在子模块中保留历史并不重要,只要更大的回购中的历史没有搞砸。
    • 我希望我已经在我对答案的编辑中添加了这些问题。如果您不关心子目录的历史记录,则无需担心git filter-branch 步骤 - 您只需将子目录的内容复制到新创建的 git 存储库中,然后将其推送到 GitHub。跨度>
    【解决方案2】:

    当您对特定目录进行更改、暂存这些更改并提交和推送时,您实际上只是在“推送”该目录。

    如果另一个 Git 存储库只有您要推送的目录,这就是您希望将其作为存储库本身的原因,您可以查看 Git Submodules

    【讨论】:

      【解决方案3】:

      你研究过 git 子模块吗?它允许 git 存储库干净地嵌套,但保持完全独立。

      这意味着您可以拥有一个子目录,其中包含用于推/拉的不同远程 url 和不同的提交树+日志,而不会弄乱主项目。

      https://git.wiki.kernel.org/index.php/GitSubmoduleTutorial

      【讨论】:

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