目标

实现快捷键触发Tortoise Git的常用操作,如show log,commit等。

快捷键分配:

快捷键

操作

Alt + Q

Show log

Alt + W

Commit

Alt + E

Pull

实现

打开自定义窗口,新建窗口快捷键。

填写信息、分配快捷键,脚本类型选择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);
}