visualstudio.com 认为最新的 libgit2 是旧的

visualstudio.com thinks latest libgit2 is old

从 visualstudio.com 克隆或获取时,我收到一条边带消息 "you're using an older version of Git"。

从 1 月 10 日起,libgit2 提交 f1323d9 就会发生这种情况。

我能做些什么吗?这是我应该担心的事情吗?

它可以用类似的东西复制

#include <stdio.h>
#include <git2.h>

static int cred_acquire_cb(git_cred **cred, const char *url, 
                           const char *username_from_url,
                           unsigned int allowed_types, void *payload) {
  return git_cred_userpass_plaintext_new(cred, "email@address.com", "token");
}

static int sideband_progress_cb(const char *str, int len, void *payload) {
   printf("%s", str);
   return 0;
}

int main() {
   git_libgit2_init();

   git_clone_options clone_options = GIT_CLONE_OPTIONS_INIT;
   clone_options.fetch_opts.callbacks.credentials = cred_acquire_cb;
   clone_options.fetch_opts.callbacks.sideband_progress = sideband_progress_cb;

   git_repository *repo = NULL;
   const char *url = "https://account.visualstudio.com/project/_git/repo";
   const char *path = "repo";
   int error = git_clone(&repo, url, path, &clone_options);
   if(error < 0) {
      fprintf(stderr, "error = %d, %s\n", error, giterr_last()->message);       
   }

   return 0;
}

不 - 这里没有什么可担心的。 VSTS 试图通过查看您 运行 的 Git 版本来提供帮助,并建议您在 运行 过时的情况下升级。

libgit2 has to send a Git version string as part of its user agent,伪装成 Git 本身,因为一些托管服务提供商[1] "over enthusiastic" 正在查看用户代理[2],如果他们不这样做在开头看到 git/ 前缀,将假定您是网络浏览器并将您重定向到他们的主页。

这与每个图形网络浏览器声称的方式大致相同 Mozilla

不过,在这种情况下,VSTS 需要足够智能,以识别基于 libgit2 的客户端不应遵循与 Git 本身相同的匹配规则。

您无法更改客户端的这种行为。您 可以 更改与您的请求一起发送的用户代理字符串,但 libgit2 将始终在其前面加上 git/2.0 前缀(以使您免受上述托管服务提供商的影响。)例如,如果你:

git_libgit2_opts(GIT_OPT_SET_USER_AGENT, "MyAwesomeGitClient/32.14");

那么实际的用户代理将被发送为:

git/2.0 MyAwesomeGitClient/32.14

但我不推荐这样做,因为不需要进行任何更改。很明显这里VSTS不对,我会请VSTS Git服务器团队调查。


[1] 不是 Visual Studio 团队服务。

[2] 我说这个托管服务提供商是"over enthusiastic",但这是相当客气的。 Git 在获取和推送时会命中特定的端点,它们不需要由用户代理匹配来保护。这种行为让我们无休止地黑客攻击,就像所有 libgit2 客户端假装 git/2.0 和 Safari 假装 Mozilla.

我们应该做得更好。