libgit2使用教程(八)git remote

从这篇开始进入到有网络的 libgit2 世界,如何添加远端服务器,如何 fetch ,pull ,push 你的版本库等等,将会陆续往下写。这一篇主要介绍如何实现:
git remote
git remote add <…>
git remote delete <…>

首先我们必须要掌握如何知道我们的 remote 操作是否成功。使用文本编辑器打开一个 clone 下来的仓库的 config 文件[.git/config],可以看到这样一个条目:

[remote “origin”]
        url = git@github.com:XiaochenFTX/libgit2_samples.git
        fetch = +refs/heads/*:refs/remotes/origin/*

origin 是 remote 的名字,url 是它的远端地址。那么 fetch 后边那一串是什么呢?它表示的是在 fetch 操作的时候,数据从哪来,到哪里去。以冒号分开两个 refspec 前边表示从哪来[远端的refspec],后边表示到哪去[本地的refspec]。
关于 refspec 有一篇挺不错的文章,直接看下面这个链接:
http://docs.pythontab.com/github/gitbook/Git-Internals/The-Refspec.html
官方原文:
https://git-scm.com/book/en/v2/Git-Internals-The-Refspec

当然,在本地直接初始化的仓库是没有一个条目的。所以我们需要自己去添加一个:

git_remote *remote = nullptr;
git_remote_create(&remote, rep, "origin2",
    "git@github.com:XiaochenFTX/libgit2_samples.git");

这个代码我们执行之后再去看 config 文件,remote 这条就出现了。我现在用的这个版本貌似有个 bug,如果是第一次调用 git_remote_create 会出现两个 [remote “origin2″] 一个放 url 一个放 fetch ,但是如果删除之后,再调用 create 的话 url 和 fetch 就都在第一个 [remote “origin”] 下面了。
这个接口会填写默认的 fetch ,如果需要自己设置,使用下面的代码:

git_remote_lookup(&remote, rep, "origin2");
git_remote_add_fetch(rep, "origin2",
    "+refs/heads/*:refs/remotes/origin/*");

通过 git_remote_list 接口来列出所有的 remote :

git_strarray remote_list;
git_remote_list(&remote_list, rep);
std::cout << "list count: " << remote_list.count << std::endl;
for (int i = 0; i < remote_list.count; ++i)
{
    std::cout << remote_list.strings[i] << std::endl;
}

删除一个 remote :

git_remote_delete(rep, "origin2”);

接下来简单介绍一下如何使用 ssh 方式的 url 。用 git_remote_connect 来检验是否可以成功连接。
我们知道使用 ssh 方式连接,必须要有一个 ssh key 用于身份验证。这个 key 怎么传给接口呢?找了半天最后发现,这个奇葩的接口是通过回调的方式传个证书给回调参数。

git_remote_callbacks remote_conn_opt = GIT_REMOTE_CALLBACKS_INIT;
remote_conn_opt.credentials = cred_acquire_cb;
git_remote_connect(remote, GIT_DIRECTION_FETCH, &remote_conn_opt, nullptr, nullptr);

这个回调是这样的:

int cred_acquire_cb(git_cred **cred, const char *url, const char *username_from_url, unsigned int allowed_types,
                    void *payload)
{
    git_cred_ssh_key_new(cred, username_from_url, nullptr, "/Users/xiaochen/.ssh/id_rsa", nullptr);
    return 0;
}

通过 git_cred_ssh_key_new 来生成证书。如果是使用 github 这种在服务器填写公钥的方式,那么我们就将本地对应的私钥传入就可以了。
这里还有个 bug 要注意,如果不是使用这个接口正确的生成证书,可能会出现 connect 操作卡死的情况。
另外,如果使用 ssh 格式的 url [git@github.com:XiaochenFTX/libgit2_samples.git] 在 connect 的时候报了这个错:
Unsupported URL protocol
那么很有可能是没有找到 libssh2 这个库,请先确保这个库已经正常安装了。

示例代码:sample8

libgit2 版本升级到 0.24.1后发现 git_remote_connect 这个参数多了一个,已经在代码中做了更新。如果是用的老版本库的用户看到了这篇教程,请参考对应版本的函数声明。

《libgit2使用教程(八)git remote》有5个想法

  1. 这篇文章我看你是使用 SSH 协议访问 URL 的,那我如何使用 Http 协议,克隆时访问 Url?

    1. 我猜,直接传 http 地址就可以了,区别可能在身份验证的部分。需要用用户名密码创建 cred 的那个接口。抱歉今天才回复,而且没时间测试。希望可以帮到你

    1. 我的 mac 系统使用 brew 直接安装的。linux 相应的 apt 或者 yum 应该也可以直接安装。

  2. cred_acquire_cb()中的第二个参数 username_from_url,是不是可以理解为.git-credentials文件中的字符串,我们通过什么放式才能找到该字符串的位置?

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

RSS
Follow by Email
YouTube
YouTube
Pinterest
fb-share-icon
LinkedIn
Share
VK
Weibo
WeChat
WhatsApp
Reddit
FbMessenger
Copy link
URL has been copied successfully!