【问题标题】:Git: Create repo as submoduleGit:创建 repo 作为子模块
【发布时间】:2013-02-10 17:47:18
【问题描述】:

我想创建一个新的存储库作为我项目的子模块。

通常,我创建一个 Github 存储库,然后使用命令将其添加为子模块 git submodule add url_to_repo.git

有没有办法直接创建一个新的 repo 作为子模块,而无需先在其他地方创建 repo(既不是本地也不是远程,例如在 Github 上)?

【问题讨论】:

    标签: git git-submodules


    【解决方案1】:

    简单!假设submodule_dir 是您希望子模块化的目录的名称(假设它尚未在 git 控制下)。

    cd submodule_dir
    git init
    git add .
    git commit
    # on github, create the new repo, then:
    git remote add origin git@github.com:your_username/your_repo_name.git
    git push -u origin master
    cd ..
    mv submodule_dir submodule_dir_delete_me
    git submodule add git@github.com:your_username/your_repo_name.git submodule_dir
    

    稍后(一旦你开心)

    rm -rf submodule_dir_delete_me
    

    【讨论】:

    • 当我想添加一个新文件夹作为新的子模块时,这对我来说非常有用。如果有人像我一样犯了错误,并且在 git submodule add 中输入了 submodule_dir 的错误路径,那么可以通过 git mv wrong_path correct_path 的命令修复,并且 git 也会自动修复子模块管道移动子模块。 (这个 mv 一个子模块需要 > git 版本 1.8.5)
    【解决方案2】:

    如果我理解正确的话,这就是我经常为 Eclipse 项目和工作区做的事情。让我们从这个结构开始:

    $ find .
    .
    ./projekt.txt
    ./sub1
    ./sub1/sub1.txt
    ./sub2
    ./sub2/sub2.txt
    

    首先初始化子模块和master:

    $ cd sub1
    $ git init
    $ git add *
    $ git commit -m "init sub1"
    $ cd ../sub2
    $ git init
    $ git add *
    $ git commit -m "init sub2"
    $ cd ..
    $ git init
    $ git status
    # On branch master
    #
    # Initial commit
    #
    # Untracked files:
    #   (use "git add <file>..." to include in what will be committed)
    #
    #   projekt.txt
    #   sub1/
    #   sub2/
    

    要将这些文件夹添加为子模块而不是常规文件夹,只需执行以下命令,并使用 ./sub 等相对路径,而不仅仅是 sub

    $ git submodule add ./sub1
    $ git submodule add ./sub2
    

    现在应该是这样的

    $ git status
    # On branch master
    #
    # Initial commit
    #
    # Changes to be committed:
    #   (use "git rm --cached <file>..." to unstage)
    #
    #   new file:   .gitmodules
    #   new file:   sub1
    #   new file:   sub2
    #
    # Untracked files:
    #   (use "git add <file>..." to include in what will be committed)
    #
    #   projekt.txt
    

    最后在父文件夹上执行git add *git commit -m "init parent" 就可以了!

    如果您现在更改其中一个子模块中的文件,则必须先提交子模块,然后再提交父存储库,以便在有人克隆您的父存储库时获得子模块的最新版本。

    【讨论】:

    • 如果子模块位于另一个文件夹中,例如./sub1/sub2,那么git submodule add ./sub1/sub2 会将sub2 克隆到.,这不是您想要的。要解决这个问题,请使用git submodule add ./sub1/sub2 ./sub1/sub2。第一个路径指定从哪里添加,第二个路径指定添加到哪里。
    • 嗯,我收到错误消息:cannot add to the index - missing --add option? 当我尝试提交 .gitmodules 和子模块文件时...
    • 已解决,我必须先提交 .gitmodules 文件,然后提交子文件夹
    【解决方案3】:

    我不明白你怎么能:一个子模块定义为来自另一个 repo 的 SHA1(即父 repo 必须存在另一个 repo 才能提取所说的 SHA1):你必须在.gitmodules file 中引用它的地址你保留在父仓库中。

    子模块由主存储库中所谓的gitlink tree entry 组成,它引用内部存储库中完全独立的特定提交对象。

    submodule.<name>.url
    

    定义可以从中克隆子模块存储库的 URL。这可能是一个准备好传递给 git-clone(1) 的绝对 URL,或者(如果它以 ./../ 开头)相对于超级项目的原始存储库的位置。

    因此您可以在本地创建子模块 repo,但无论如何您都必须创建它。

    【讨论】:

    • git init .; mkdir a; cd a; git init .; cd..; git submodule add ./a a 怎么样?还是个坏主意?
    • @manuels 这就是我刚刚在回答中添加的内容,但重点是:您必须创建一个存储库,以便能够在父存储库中将其作为子模块引用。但是,一旦您的父存储库被推送到 GitHub 并被另一个用户克隆,我看不到它会如何发挥作用。
    • 所以如果我在超级repo的目录中创建repo将此目录用作子模块就可以了吗?
    • @manuels 是的:您可以声明一个子模块,它是主存储库的嵌套存储库。问题是:任何克隆你的主仓库(你应该已经推送到 GitHub)的人都无法访问你的嵌套仓库(即使也推送到了 GitHub),因为./myNestedRepo url 将引用他们的空目录本地工作站
    • 如果你懒得登录 github(或离线)并且想现在创建子模块并稍后推送它,它就会发挥作用。
    猜你喜欢
    • 2020-07-08
    • 1970-01-01
    • 1970-01-01
    • 2015-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-12
    • 1970-01-01
    相关资源
    最近更新 更多