Git diff 在 vscode Git 扩展中如何工作?
How does Git diff work in the vscode Git extension?
我正在尝试在 vscode 中创建版本控制扩展。我试图查看 vscode 中的 Git 实现。令人困惑的部分是文件差异。在 git 扩展源代码中,为了查看文件更改,使用了 vscode.diff
。要获取原始文件的uri
,通过更改修改文件的uri
的scheme
生成新的uri
。这是如何工作的?
例如,在https://github.com/Microsoft/vscode/blob/master/extensions/git/src/commands.ts、getRightResource
方法中,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 中创建版本控制扩展。我试图查看 vscode 中的 Git 实现。令人困惑的部分是文件差异。在 git 扩展源代码中,为了查看文件更改,使用了 vscode.diff
。要获取原始文件的uri
,通过更改修改文件的uri
的scheme
生成新的uri
。这是如何工作的?
例如,在https://github.com/Microsoft/vscode/blob/master/extensions/git/src/commands.ts、getRightResource
方法中,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 中的代码(逐一跟踪链接):