我们可以使用git ls-remote
命令获取给定git repo的提交列表,例如this discussion
对于具有大量提交/标记的repo,这个命令花了我们很长时间 - 我们正在为它寻找一个参数和/或任何其他命令来限制返回行的数量,例如只读取返回列表中的前3行。
我们怎么做到这一点?
P.S。
我的google search和our site search没什么用处。
答案 0 :(得分:6)
git ls-remote
由fetching the full list of refs from the remote and then filtering it locally投放:
int cmd_ls_remote(int argc, const char **argv, const char *prefix)
{
...
transport = transport_get(remote, NULL);
if (uploadpack != NULL)
transport_set_option(transport, TRANS_OPT_UPLOADPACK, uploadpack);
/* Get all refs from the remote */
ref = transport_get_remote_refs(transport);
if (transport_disconnect(transport))
return 1;
if (!dest && !quiet)
fprintf(stderr, "From %s\n", *remote->url);
/* Filter the list of all refs */
for ( ; ref; ref = ref->next) {
if (!check_ref_type(ref, flags))
continue;
if (!tail_match(pattern, ref->name))
continue;
if (show_symref_target && ref->symref)
printf("ref: %s\t%s\n", ref->symref, ref->name);
printf("%s\t%s\n", oid_to_hex(&ref->old_oid), ref->name);
status = 0; /* we found something */
}
return status;
}
<强>更新强>
根据this page, explaining git transfer protocols,如果遥控器支持哑协议,则可以直接获取远程refs/heads/branchname
文件(例如使用curl
)。
哑巴协议
如果您要设置一个通过HTTP以只读方式提供服务的存储库,则可能会使用哑协议。该协议称为“哑”,因为它在传输过程中不需要服务器端的Git特定代码; fetch进程是一系列HTTP GET请求,客户端可以在服务器上假设Git存储库的布局。
...
否则,当使用智能协议时,从远程发送的第一条数据始终是所有远程引用的列表,即通过智能协议连接到远程的任何git命令就像git ls-remote
一样在内部运行(从技术上讲,所有这些命令都调用transport_get_remote_refs()
函数)。在这种情况下,遗憾的是,没有办法加快查询速度,甚至没有解决方法。
智能协议
...
上传数据
要将数据上传到远程进程,Git使用
send-pack
和receive-pack
进程。send-pack
进程在客户端上运行,并连接到远程端的receive-pack
进程。...
git-receive-pack
命令立即响应一行 它目前的每个参考。...
正在下载数据
下载数据时,
fetch-pack
和upload-pack
进程 参与其中。客户端启动fetch-pack
进程 连接到远程端的upload-pack
进程进行协商 什么数据将被传输下来。...
fetch-pack
连接后,upload-pack
会发回类似的内容 这个:... 这与receive-pack
响应的非常相似,但是 能力是不同的(,即所有引用的列表+一些 其他数据)。...