+ {/* Remotes list */}
+
+ {remotes.map(remote => (
+
+
+
+ {remote.name}
+
+
+ {formatUrl(remote.url)}
+
+
+ ))}
+
+
+ {/* Remote branches */}
+ {sortedRemoteBranches.length > 0 && (
+
+
+
+ {t('git.remoteBranches')}
+
+
+ {sortedRemoteBranches.map(branch => (
+
+ {branch.name}
+
+ ))}
+
+
+ )}
+
+ {/* Fetch button */}
+
+
+
+
+ );
+}
+
+function formatUrl(url: string): string {
+ // Strip credentials from URLs for display
+ // git@github.com:user/repo.git -> github.com/user/repo
+ // https://user:pass@github.com/user/repo.git -> github.com/user/repo
+ try {
+ // SSH format: git@github.com:user/repo.git
+ const sshMatch = url.match(/^git@([^:]+):(.+?)(\.git)?$/);
+ if (sshMatch) {
+ return `${sshMatch[1]}/${sshMatch[2]}`;
+ }
+
+ // HTTPS format
+ const parsed = new URL(url);
+ return `${parsed.hostname}${parsed.pathname.replace(/\.git$/, '')}`;
+ } catch {
+ return url;
+ }
+}
diff --git a/src/i18n/en.ts b/src/i18n/en.ts
index 479d50f5..b10c9094 100644
--- a/src/i18n/en.ts
+++ b/src/i18n/en.ts
@@ -1027,6 +1027,12 @@ const en = {
'git.branchSection': 'Branches',
'git.historySection': 'History',
'git.worktreeSection': 'Worktrees',
+ 'git.remoteSection': 'Remotes',
+ 'git.remoteBranches': 'Remote Branches',
+ 'git.noRemotes': 'No remotes configured',
+ 'git.fetch': 'Fetch',
+ 'git.fetching': 'Fetching...',
+ 'git.fetchSuccess': 'Fetched successfully',
'git.commitSection': 'Commit',
'git.staged': 'Staged',
'git.unstaged': 'Unstaged',
diff --git a/src/i18n/zh.ts b/src/i18n/zh.ts
index c239873d..548aa968 100644
--- a/src/i18n/zh.ts
+++ b/src/i18n/zh.ts
@@ -1024,6 +1024,12 @@ const zh: Record