如何使用GitHub Rest Api在GitHub中创建子模块

时间:2016-03-03 07:12:37

标签: github-api

我发现GitHub有Create TreeCreate File API,但我仍然不确定如何为Create Tree Api创建子模块项,如何为Create File Api指定Sha,看来我们不能设置项目类型。顺便说一句,我是否需要先创建.gitmodules文件?

2 个答案:

答案 0 :(得分:7)

我今天早些时候试图这样做。

这是我的工作流程:

  1. Create a tree
  2. Create a commit
  3. Update the reference
  4. 让我举一个例子来说明一点。

    假设要添加子模块的仓库的$BASE_SHA分支上的最新提交是.gitmodules

    <强> 1。创建一个树

    假设您的repo上还没有任何子模块,您需要先创建一个名为POST /repos/:owner/:repo/git/trees { "base_tree": $BASE_SHA, "tree": [ // create submodule config { "path": ".gitmodules", "mode": "100644", "type": "blob", "content": "[submodule \"rails\"]\n\tpath = rails\n\turl = https://github.com/rails/rails" }, // link to submodule { "path": "rails", "mode": "160000", "type": "commit", "sha": "39e087cbf5628ecc351fc86a3a1e320be193bf29" } ] } 的文件。然后你可以创建它的引用。

    {
      "sha": $TREE_SHA,
      "url": "...",
      "tree": [...]
    }
    

    然后,API服务器会向您发送回复

    sha


    <强> 2。创建提交

    然后我们使用新创建的树的$BASE_SHA来创建一个提交(以POST /repos/:owner/:repo/git/commits { "message": "commit message", "tree": $TREE_SHA, "parents": [$BASE_SHA] } 作为其父级)。

    {
        "sha": $COMMIT_SHA,
        "url": "...",
        // other content omitted here ..
    }
    

    服务器将返回

    master

    第3。更新参考

    然后我们需要更新PATCH /repos/:owner/:repo/git/refs/heads/master { "sha": $COMMIT_SHA, "force": true }

    const char** convert(vector< string > &v)
    {
        int kk;
    
        const char** ppChar = new const char *[v.size()];
    
        for (kk = 0; kk < v.size(); kk++)
        {
            ppChar[kk] = const_cast< char* >(v[kk].c_str());
        }
    
        return ppChar;
     }
    

    如果没有返回任何错误,我们就会全部设置。

    刷新您的GitHub仓库页面,您将发现已添加子模块。

答案 1 :(得分:0)

注意:自11.5(2018年11月)起,现在也可以在GitLab中实现

gitlab-org/gitlab-ce issue 41213中引用了该堆栈溢出问题。

  

Update Git submodules via API

     

Git子模块允许您将Git存储库包含在另一个Git存储库中。

     

GitLab现在支持通过API更新子模块引用。
  这对于自动化特别有用,它允许您使用API​​使项目保持最新的最新依赖关系。

请参见documentation