我发现GitHub有Create Tree和Create File API,但我仍然不确定如何为Create Tree Api创建子模块项,如何为Create File Api指定Sha,看来我们不能设置项目类型。顺便说一句,我是否需要先创建.gitmodules文件?
答案 0 :(得分:7)
我今天早些时候试图这样做。
这是我的工作流程:
让我举一个例子来说明一点。
假设要添加子模块的仓库的$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。