Git diff 在 vscode Git 扩展中如何工作?

How does Git diff work in the vscode Git extension?

我正在尝试在 vscode 中创建版本控制扩展。我试图查看 vscode 中的 Git 实现。令人困惑的部分是文件差异。在 git 扩展源代码中,为了查看文件更改,使用了 vscode.diff。要获取原始文件的uri,通过更改修改文件的urischeme 生成新的uri。这是如何工作的?

例如,在https://github.com/Microsoft/vscode/blob/master/extensions/git/src/commands.tsgetRightResource方法中,toGitUri是用文件的uri调用的。 toGitUri实现如下,

export function toGitUri(uri: Uri, ref: string, replaceFileExtension = false): Uri {
    return uri.with({
        scheme: 'git',
        path: replaceFileExtension ? `${uri.path}.git` : uri.path,
        query: JSON.stringify({
            path: uri.fsPath,
            ref
        })
    });
}

这里,toGitUri只是通过查询将文件的方案从file更改为git。然后将此 uri 与文件的原始 uri 一起提供给 vscode.diff,以显示 git 差异。 toGitUri 在这里如何工作?

我认为差异不会发生在这里。我还认为您已经正确理解此函数的作用:它获取磁盘上文件的文件 URI,并为 git 存储库找到相应的 URI。然后它有 2 个资源可以比较。

然后将这 2 个资源传递给内置差异功能。

让我们跟踪 1.12.1 中的代码(逐一跟踪链接):

  • vscode.diff 已注册 here

  • delegates_workbench.diff

  • 那一个被注册here and delegates到编辑器的内置 diff ...

  • ...像这样:editorService.openEditor({ leftResource, rightResource, ...)...

  • ... 其中 leftResource 是磁盘上的文件,rightResource 是 git 存储库中文件的 URI。