Visual Studio 2015 Git无法使用SSH协议的解决方法

背景

在实验室的CentOS服务器上按资料配置好了SSH协议的远程Git仓库,本想着用VS的git插件同步项目岂不是美滋滋,但实际操作后发现VS 2015并不支持SSH协议。

原因

Visual Studio里的libgit2本来是支持SSH协议的。但可能VS项目组担心OpenSSH协议的安全性而放弃了。具体的答案可以参考这个

解决方法

重编译并替换原有的libgit2,根据几篇资料整理出如下的步骤。


准备工作

下载如下工具

  • Python (可能)
  • libssh2源码
  • CMake
  • libgit2源码
    libgit2的源码可以在VS2015的插件目录,如C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\Extensions 搜索libgit2-src,会找到一个或几个名为libgit2-src.zip的压缩包即是源码。

安装好Python和CMake,将libssh2和libgit2的文件夹解压到同一目录,假设为D:\tmp\libssh2和D:\tmp\libgit2。

编译libssh2

  1. 在libssh2的目录内新建文件夹build用于放置vs解决方案。
  2. 在build文件夹内Shift+右键打开命令窗口。
  3. 执行指令cmake -DCRYPTO_BACKEND=WinCNG -DBUILD_SHARED_LIBS=OFF
    -DBUILD_TESTING=OFF -DBUILD_EXAMPLES=OFF ..
    创建解决方案 。
  4. 创建完成后,打开libssh2.sln,将生成方案设为“Release”。
  5. 选中libssh2项目,在VS的项目->属性->C/C++->高级->调用约定设为_stdcall(/Gz)。
  6. 重新生成解决方案。

编译libgit2

  1. 进入libgit2目录,同样创建build文件夹。
  2. 进入build文件夹打开命令窗口。
  3. 执行命令cmake -DCMAKE_BUILD_TYPE=Release -DSTDCALL=ON -DSTATIC_CRT=OFF -DUSE_SSH=OFF -DLIBSSH2_FOUND=TRUE -DLIBSSH2_INCLUDE_DIRS=D:/tmp/libssh2/include -DLIBSSH2_LIBRARIES=D:/tmp/libssh2/build/src/Release/libssh2.lib .. 其中,DLIBSSH2_INCLUDE_DIRS代表你的libssh2的头文件位置,DLIBSSH2_LIBRARIES代表libssh2生成好的库文件位置。
  4. 打开libgit2.sln。
  5. 将生成方案设为“Release”。
  6. 重新生成解决方案。

(可选)修改libgit2使其可以通过公钥登录Git。
在编译前打开解决方案中的git2项目,选择src/transports/ssh.c,找到这一段代码,大概在421行。

if (!t->owner->cred_acquire_cb) {
    no_callback = 1;
} else {

修改为

if (!t->owner->cred_acquire_cb) {
    if (user) {
        const char *val = NULL;
        val = getenv("USERPROFILE");
        if (val)
        {
            char *szprivfilename = malloc(strlen(val) + 128);
            char *szpubfilename = malloc(strlen(val) + 128);

            strcpy(szprivfilename, val);
            strcat(szprivfilename, "/.ssh/id_rsa");
            strcpy(szpubfilename, val);
            strcat(szpubfilename, "/.ssh/id_rsa.pub");

            git_cred_ssh_key_new(&cred, user, szpubfilename, szprivfilename, "");

            free(szprivfilename);
            free(szpubfilename);
        }
        if (!cred) {
            giterr_set(GITERR_SSH, "git_cred_ssh_key_new failed to initialize SSH credentials");
            return -1;
        }
    }
    else
    {
        no_callback = 1;
    }
} else {

再进行编译。

替换原有的DLL文件

  1. 关闭所有Visual Studio 2015的程序。
  2. 在libgit2的build->Release文件夹内找到git2.dll并重命名为git2-msvstfs.dll。
  3. 找到Visual Studio 2015的插件目录(参考前文),搜索git2-msvstfs.dll,将搜索到的文件重命名为git2-msvstfs.bak,并将我们编译好的dll文件复制到对应的文件夹内。
  4. 打开VS,大功告成!

注意事项

在上述的操作后,可能仍无法直接在Visual Studio 2015输入ssh协议地址。解决方法是打开需要设置的Git项目,在团队资源管理器->设置->存储库设置->远程中添加ssh协议的Git地址。如 ssh://你的账户名@远程仓库地址:仓库目录

参考资料

  • Git (SSH) in Visual Studio 2015
  • adding ssh support to visual studio

你可能感兴趣的:(软件配置)