转自: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
增加一行配置即可:
重启VS,然后就发现TortoiseGit菜单项出现了
点击Git Changes菜单项,Git Changes窗口就出现啦
如果想使用Git Extensions也是同理,自行配置就可以了。