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

来源:互联网 发布:广州精点数据 编辑:程序博客网 时间:2024/05/21 21:47

背景

在实验室的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
0 0
原创粉丝点击