目标
实现快捷键触发Tortoise Git的常用操作,如show log,commit等。
快捷键分配:
实现
打开自定义窗口,新建窗口快捷键。
填写信息、分配快捷键,脚本类型选择JScript。
脚本内容:
function OnClick(clickData) {
var selectedItems = clickData.func.sourcetab.selected;
if (!selectedItems.count) {
DOpus.Output("No items selected, use current path.");
}
// 获取选择的路径
var selectedPath = selectedItems.count === 1 ? selectedItems(0).realpath : clickData.func.sourcetab.path;
DOpus.Output("Selected item path: " + selectedPath);
// 执行命令
executeGitCommand(0, selectedPath);
DOpus.Output("Command executed!");
}
//0:log 1:commit 2:pull
function executeGitCommand(commandIndex, path) {
var shell = new ActiveXObject("WScript.Shell");
var pathStr = "\"" + path + "\"";
var commandStr;
// 根据序号选择命令
switch (commandIndex) {
case 0:
commandStr = "log";
break;
case 1:
commandStr = "commit";
break;
case 2:
commandStr = "pull";
break;
default:
DOpus.Output("Invalid command index.");
return;
}
shell.Run("TortoiseGitProc /command:" + commandStr + " /path:" + pathStr, 0, false);
}
这样就实现了showlog功能,稍稍改动executeGitCommand(0, selectedPath);
一行即可实现comit/pull功能:
executeGitCommand(1, selectedPath); //commit
executeGitCommand(2, selectedPath); //pull
修改executeGitCommand函数还可扩展更多需要的命令。
扩展1:SVN快捷操作
Tortoise SVN 同样支持这样操作,脚本也只需稍稍改动executeGitCommand
函数即可。
SVN操作完整脚本:
function OnClick(clickData) {
var selectedItems = clickData.func.sourcetab.selected;
if (!selectedItems.count) {
DOpus.Output("No items selected, use current path.");
}
// 获取选择的路径
var selectedPath = selectedItems.count === 1 ? selectedItems(0).realpath : clickData.func.sourcetab.path;
DOpus.Output("Selected item path: " + selectedPath);
// 执行命令
executeGitCommand(0, selectedPath);
DOpus.Output("Command executed!");
}
//0:log 1:commit 2:pull
function executeGitCommand(commandIndex, path) {
var shell = new ActiveXObject("WScript.Shell");
var pathStr = "\"" + path + "\"";
var commandStr;
// 根据序号选择命令
switch (commandIndex) {
case 0:
commandStr = "log";
break;
case 1:
commandStr = "commit";
break;
case 2:
commandStr = "update";
break;
default:
DOpus.Output("Invalid command index.");
return;
}
shell.Run("TortoiseProc /command:" + commandStr + " /path:" + pathStr, 0, false);
}
扩展2:同一快捷键自适应操作Git及SVN
部分小伙伴可能会有同时使用Git及SVN的需求,用两套快捷键操作起来就比较麻烦,也不易记忆。
其实用一套快捷键即可实现,思路也比较简单,让脚本先检测当前目录是不是git仓库,如果是则用git命令操作,否则用SVN命令操作。
完整脚本:
function OnClick(clickData) {
var selectedItems = clickData.func.sourcetab.selected;
if (!selectedItems.count) {
DOpus.Output("No items selected, use current path.");
}
// 获取选择的路径
var selectedPath = selectedItems.count === 1 ? selectedItems(0).realpath : clickData.func.sourcetab.path;
DOpus.Output("Selected item path: " + selectedPath);
// 检查是否为 Git 目录
var isGitFolder = false;
var driveRoot = selectedPath.split(":")[0]; // 驱动器根目录
var tmpPath = selectedPath;
while (tmpPath != driveRoot) {
if (DOpus.FSUtil.Exists(tmpPath + "\\.git")) {
isGitFolder = true;
DOpus.Output("Current item is a Git repository!");
break;
}
tmpPath = DOpus.FSUtil.Resolve(tmpPath.pathpart);
DOpus.Output("Current item path: " + tmpPath);
}
// 执行命令
executeGitCommand(0, selectedPath, isGitFolder);
DOpus.Output("Command executed!");
}
//0:log 1:commit 2:update/pull
function executeGitCommand(commandIndex, path, isGitFolder) {
var shell = new ActiveXObject("WScript.Shell");
var pathStr = "\"" + path + "\"";
var procCommand = isGitFolder ? "TortoiseGitProc" : "TortoiseProc";
var commandStr;
// 根据序号选择命令
switch (commandIndex) {
case 0:
commandStr = "log";
break;
case 1:
commandStr = "commit";
break;
case 2:
commandStr = isGitFolder ? "pull" : "update";
break;
default:
DOpus.Output("Invalid command index.");
return;
}
shell.Run(procCommand + " /command:" + commandStr + " /path:" + pathStr, 0, false);
}