可以在VS中使用的git插件也不少,比如vs集成的git扩展插件、TGit等等。本文主要讲下Git Tools的使用,因为之前一直在使用SVN,AnkhSVN插件里的Pending Change窗口很好用,在换用git之后就想找一个有类似功能的插件,遗憾的是TGit只有菜单没有Pending Change窗口。

Git Tools的前身就是Git Source Control Provider,所以不要纳闷为什么Git Source Control Provider不支持VS2013之后的版本了,因为插件作者把这玩意直接改名了。

Git Tools安装方式比较简单,工具→扩展和更新→联机搜索“Git Tools”,点击下载,插件下载完毕以后关闭VS开始进行安装。

安装完成以后重新启动VS,即可看到菜单栏里多了一个GitTools菜单

发现和GitTools使用说明https://github.com/yysun/git-tools上介绍的不一样:

缺了Git Extensions和TortoiseGit,因为GitTools本身只有commit功能,没有pull、push等相关功能,所以需要借助Git Extensions和TortoiseGit进行,而电脑上只安装了TortoiseGit,没有安装Git Extensions,所以菜单里应该有TortoiseGit才对的。之前在VS2013中使用Git Source Control Provider时是可以配置TortoiseGit程序路径的,但是VS2017中插件改名升级到GitTools之后“工具→选项”菜单中并没有找到相关配置的地方,度娘和google了都没有找人有人解决过相关的问题,不过随后想到插件既然是开源的,那就去看源码吧,源码中必然有读取TortoiseGit程序路径的代码的,果然找到了相关代码:

https://github.com/yysun/git-tools/blob/master/GitApi/GitSccOptions.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Xml.Serialization;

namespace GitScc
{
    [Serializable]
    public class GitSccOptions
    {
        private static string configFileName = Path.Combine(
            Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments),
            "gitscc.config");

        public string GitBashPath { get; set; }
        public string GitExtensionPath { get; set; }
        public string DifftoolPath { get; set; }
        public string TortoiseGitPath { get; set; }
        public bool NotExpandTortoiseGit { get; set; }
        public bool NotExpandGitExtensions { get; set; }
        public bool UseTGitIconSet { get; set; }
        public bool DisableAutoRefresh { get; set; }
        public bool DisableAutoLoad { get; set; }
        public bool NotUseUTF8FileNames { get; set; }
        public bool UseVsDiff { get; set; }

        private static GitSccOptions gitSccOptions;

        public static GitSccOptions Current
        {
            get
            {
                if (gitSccOptions == null)
                {
                    gitSccOptions = LoadFromConfig();
                }
                return gitSccOptions;
            }
        }

        private GitSccOptions()
        {

        }

        public static GitSccOptions LoadFromConfig()
        {
            GitSccOptions options = null;


            if (File.Exists(configFileName))
            {
                try
                {
                    XmlSerializer serializer = new XmlSerializer(typeof(GitSccOptions));
                    using (TextReader tr = new StreamReader(configFileName))
                    {
                        options = (GitSccOptions)serializer.Deserialize(tr);
                    }
                }
                catch
                {
                }
            }

            if (options == null) options = new GitSccOptions();

            options.Init();

            return options;
        }

        private void Init()
        {
            if (string.IsNullOrEmpty(GitBashPath))
            {
                GitBashPath = TryFindFile(new string[]{
                    @"C:\Program Files\Git\bin\git.exe",
                    @"C:\Program Files (x86)\Git\bin\git.exe",
                });
            }
            if (string.IsNullOrEmpty(GitExtensionPath))
            {
                GitExtensionPath = TryFindFile(new string[]{
                    @"C:\Program Files\GitExtensions\GitExtensions.exe",
                    @"C:\Program Files (x86)\GitExtensions\GitExtensions.exe",
                });
            }
            if (string.IsNullOrEmpty(TortoiseGitPath))
            {
                TortoiseGitPath = TryFindFile(new string[]{
                    @"C:\Program Files\TortoiseGit\bin\TortoiseGitProc.exe",
                    @"C:\Program Files (x86)\TortoiseGit\bin\TortoiseGitProc.exe",
                });
            }

            if (string.IsNullOrEmpty(DifftoolPath)) DifftoolPath = "diffmerge.exe";

            //bool diffServiceAvailable = Package.GetGlobalService(typeof(SVsDifferenceService)) != null;
            //if (!diffServiceAvailable)
            //    UseVsDiff = false;

            UseVsDiff = true;
        }

        public void SaveConfig()
        {
            try
            {
                XmlSerializer x = new XmlSerializer(typeof(GitSccOptions));
                using (TextWriter tw = new StreamWriter(configFileName))
                {
                    x.Serialize(tw, this);
                }
            }
            catch { }
        }

        private string TryFindFile(string[] paths)
        {
            foreach (var path in paths)
            {
                if (File.Exists(path)) return path;
            }
            return null;
        }
    }
}

 

我们可以看到TortoiseGitPath在配置文件中没有配置的情况下默认读路径是“C:\Program Files\TortoiseGit\bin\TortoiseGitProc.exe ”或者“C:\Program Files (x86)\TortoiseGit\bin\TortoiseGitProc.exe”,但是我安装TortoiseGit时把路径安装到了D盘,因此插件没有读取到。解决办法就是去改配置文件指向我们的TortoiseGit安装路径了,通过这行代码:

        private static string configFileName = Path.Combine(
            Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments),
            "gitscc.config");

我们可以知道配置文件的默认目录是在“我的文档”下的,打开C:\Users\admin\Documents,果然找到了gitscc.config

增加一行配置即可:

  <TortoiseGitPath>D:\Program Files\TortoiseGit\bin\TortoiseGitProc.exe</TortoiseGitPath>

重启VS,然后就发现TortoiseGit菜单项出现了

点击Git Changes菜单项,Git Changes窗口就出现啦

如果想使用Git Extensions也是同理,自行配置就可以了。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐