0
0

git功能已完备

This commit is contained in:
xubing
2025-11-25 16:32:06 +08:00
parent 719fb43c33
commit 23024a8461
6 changed files with 233 additions and 130 deletions

View File

@@ -305,6 +305,10 @@ export class ConfigPanel {
case 'importGitFile':
await this.importGitFile(data.filePath);
break;
case 'openGitRepoInVSCode':
await this.openGitRepoInVSCode(data.repoId);
break;
}
} catch (error) {
console.error('处理 Webview 消息时出错:', error);
@@ -1412,99 +1416,107 @@ private async deleteGitRepo(repoId: string): Promise<void> {
// === Git 分支管理 ===
private async fetchBranches(url: string): Promise<void> {
try {
console.log('🌿 开始获取分支列表:', url);
await vscode.window.withProgress({
location: vscode.ProgressLocation.Notification,
title: '正在获取分支信息',
cancellable: false
}, async (progress) => {
progress.report({ increment: 0, message: '连接远程仓库...' });
try {
console.log('🌿 开始获取分支列表:', url);
await vscode.window.withProgress({
location: vscode.ProgressLocation.Notification,
title: '正在获取分支信息',
cancellable: false
}, async (progress) => {
progress.report({ increment: 0, message: '连接远程仓库...' });
try {
// 使用 isomorphic-git 的 listServerRefs
progress.report({ increment: 30, message: '获取远程引用...' });
try {
// 使用 isomorphic-git 的 listServerRefs
progress.report({ increment: 30, message: '获取远程引用...' });
console.log('🔍 使用 listServerRefs 获取分支信息...');
const refs = await git.listServerRefs({
http: http,
url: url
});
console.log('📋 获取到的引用:', refs);
// 过滤出分支引用 (refs/heads/ 和 refs/remotes/origin/)
const branchRefs = refs.filter(ref =>
ref.ref.startsWith('refs/heads/') || ref.ref.startsWith('refs/remotes/origin/')
);
console.log('🌿 过滤后的分支引用:', branchRefs);
// 构建分支数据 - 修复分支名称显示
const branches: GitBranch[] = branchRefs.map(ref => {
const isRemote = ref.ref.startsWith('refs/remotes/');
let branchName: string;
console.log('🔍 使用 listServerRefs 获取分支信息...');
const refs = await git.listServerRefs({
http: http,
url: url
});
console.log('📋 获取到的引用:', refs);
// 过滤出分支引用 (refs/heads/ 和 refs/remotes/origin/)
const branchRefs = refs.filter(ref =>
ref.ref.startsWith('refs/heads/') || ref.ref.startsWith('refs/remotes/origin/')
);
console.log('🌿 过滤后的分支引用:', branchRefs);
// 构建分支数据
const branches: GitBranch[] = branchRefs.map(ref => {
const isRemote = ref.ref.startsWith('refs/remotes/');
const branchName = isRemote
? ref.ref.replace('refs/remotes/origin/', '')
: ref.ref.replace('refs/heads/', '');
return {
name: branchName,
isCurrent: branchName === 'main' || branchName === 'master',
isRemote: isRemote,
selected: branchName === 'main' || branchName === 'master'
};
});
console.log('🎯 最终分支列表:', branches);
if (branches.length === 0) {
throw new Error('未找到任何分支');
}
progress.report({ increment: 80, message: '处理分支数据...' });
// 发送分支数据到前端
if (!this.isWebviewDisposed) {
this.panel.webview.postMessage({
type: 'branchesFetched',
branches: branches,
repoUrl: url
});
}
progress.report({ increment: 100, message: '完成' });
} catch (error) {
console.error('❌ 使用 listServerRefs 获取分支失败:', error);
// 如果方法失败,使用模拟数据
console.log('🔄 使用模拟分支数据');
const mockBranches = [
{ name: 'main', isCurrent: true, isRemote: false, selected: true },
{ name: 'master', isCurrent: false, isRemote: false, selected: false },
{ name: 'develop', isCurrent: false, isRemote: false, selected: false },
{ name: 'feature/new-feature', isCurrent: false, isRemote: false, selected: false }
];
if (!this.isWebviewDisposed) {
this.panel.webview.postMessage({
type: 'branchesFetched',
branches: mockBranches,
repoUrl: url
});
if (isRemote) {
// 远程分支:移除 refs/remotes/origin/ 前缀
branchName = ref.ref.replace('refs/remotes/origin/', '');
// 可以选择添加远程标识,或者不添加
// branchName = `origin/${branchName}`; // 如果需要显示远程标识
} else {
// 本地分支:移除 refs/heads/ 前缀
branchName = ref.ref.replace('refs/heads/', '');
}
vscode.window.showWarningMessage('使用模拟分支数据,实际分支可能不同');
return {
name: branchName,
isCurrent: branchName === 'main' || branchName === 'master',
isRemote: isRemote,
selected: false // 所有分支默认不选中
};
});
console.log('🎯 最终分支列表:', branches);
if (branches.length === 0) {
throw new Error('未找到任何分支');
}
});
} catch (error) {
console.error('❌ 获取分支失败:', error);
vscode.window.showErrorMessage(`获取分支失败: ${error}`);
}
progress.report({ increment: 80, message: '处理分支数据...' });
// 发送分支数据到前端
if (!this.isWebviewDisposed) {
this.panel.webview.postMessage({
type: 'branchesFetched',
branches: branches,
repoUrl: url
});
}
progress.report({ increment: 100, message: '完成' });
} catch (error) {
console.error('❌ 使用 listServerRefs 获取分支失败:', error);
// 如果方法失败,使用模拟数据
console.log('🔄 使用模拟分支数据');
const mockBranches = [
{ name: 'main', isCurrent: true, isRemote: false, selected: false },
{ name: 'master', isCurrent: false, isRemote: false, selected: false },
{ name: 'develop', isCurrent: false, isRemote: false, selected: false },
{ name: 'feature/new-feature', isCurrent: false, isRemote: false, selected: false }
];
if (!this.isWebviewDisposed) {
this.panel.webview.postMessage({
type: 'branchesFetched',
branches: mockBranches,
repoUrl: url
});
}
vscode.window.showWarningMessage('使用模拟分支数据,实际分支可能不同');
}
});
} catch (error) {
console.error('❌ 获取分支失败:', error);
vscode.window.showErrorMessage(`获取分支失败: ${error}`);
}
}
private async cloneBranches(url: string, branches: string[]): Promise<void> {
try {
@@ -1603,4 +1615,39 @@ private async deleteGitRepo(repoId: string): Promise<void> {
});
}
}
private async openGitRepoInVSCode(repoId: string): Promise<void> {
const repo = this.gitRepos.find(r => r.id === repoId);
if (!repo) {
vscode.window.showErrorMessage('未找到指定的 Git 仓库');
return;
}
try {
// 检查仓库目录是否存在
if (!fs.existsSync(repo.localPath)) {
vscode.window.showErrorMessage('Git 仓库目录不存在,请重新克隆');
return;
}
// 使用 VSCode 的文件选择器让用户选择要打开的文件
const fileUri = await vscode.window.showOpenDialog({
defaultUri: vscode.Uri.file(repo.localPath),
canSelectFiles: true,
canSelectFolders: false,
canSelectMany: false,
openLabel: '选择要打开的文件',
title: `${repo.name} 中选择文件`
});
if (fileUri && fileUri.length > 0) {
// 打开选中的文件
const document = await vscode.workspace.openTextDocument(fileUri[0]);
await vscode.window.showTextDocument(document);
vscode.window.showInformationMessage(`已打开文件: ${path.basename(fileUri[0].fsPath)}`);
}
} catch (error) {
vscode.window.showErrorMessage(`打开 Git 仓库文件失败: ${error}`);
}
}
}