VS2017使用Git Tools插件进行源码管理

转自:https://blog.csdn.net/shujudeliu/article/details/83309678

可以在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也是同理,自行配置就可以了。

猜你喜欢

转载自blog.csdn.net/nodeman/article/details/89468530