Merge branch 'main' into main-fix

This commit is contained in:
xintaofei
2026-04-01 13:01:25 +08:00
16 changed files with 153 additions and 14 deletions

View File

@@ -2055,6 +2055,45 @@ pub async fn git_delete_branch(
Ok(String::from_utf8_lossy(&output.stdout).trim().to_string()) Ok(String::from_utf8_lossy(&output.stdout).trim().to_string())
} }
pub(crate) async fn git_delete_remote_branch_core(
path: &str,
remote: &str,
branch: &str,
credentials: Option<&GitCredentials>,
db: &AppDatabase,
data_dir: &std::path::Path,
) -> Result<String, AppCommandError> {
let mut cmd = crate::process::tokio_command("git");
cmd.args(["push", remote, "--delete", branch])
.current_dir(path);
prepare_remote_git_cmd_with_remote(&mut cmd, path, Some(remote), credentials, db, data_dir)
.await;
let output = cmd.output().await.map_err(AppCommandError::io)?;
if !output.status.success() {
return Err(classify_remote_git_error("push --delete", &output.stderr));
}
Ok(String::from_utf8_lossy(&output.stderr).trim().to_string())
}
#[cfg(feature = "tauri-runtime")]
#[cfg_attr(feature = "tauri-runtime", tauri::command)]
pub async fn git_delete_remote_branch(
path: String,
remote: String,
branch: String,
credentials: Option<GitCredentials>,
db: tauri::State<'_, AppDatabase>,
app_handle: tauri::AppHandle,
) -> Result<String, AppCommandError> {
let data_dir = app_handle.path().app_data_dir().map_err(|e| {
AppCommandError::external_command("Failed to resolve app data dir", e.to_string())
})?;
git_delete_remote_branch_core(&path, &remote, &branch, credentials.as_ref(), &db, &data_dir)
.await
}
#[cfg_attr(feature = "tauri-runtime", tauri::command)] #[cfg_attr(feature = "tauri-runtime", tauri::command)]
pub async fn git_list_conflicts(path: String) -> Result<Vec<String>, AppCommandError> { pub async fn git_list_conflicts(path: String) -> Result<Vec<String>, AppCommandError> {
detect_conflicts(&path).await detect_conflicts(&path).await

View File

@@ -279,6 +279,7 @@ mod tauri_app {
folders::git_merge, folders::git_merge,
folders::git_rebase, folders::git_rebase,
folders::git_delete_branch, folders::git_delete_branch,
folders::git_delete_remote_branch,
folders::git_list_conflicts, folders::git_list_conflicts,
folders::git_conflict_file_versions, folders::git_conflict_file_versions,
folders::git_resolve_conflict, folders::git_resolve_conflict,

View File

@@ -451,6 +451,32 @@ pub async fn git_delete_branch(
Ok(Json(())) Ok(Json(()))
} }
#[derive(Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct GitDeleteRemoteBranchParams {
pub path: String,
pub remote: String,
pub branch: String,
pub credentials: Option<GitCredentials>,
}
pub async fn git_delete_remote_branch(
Extension(state): Extension<Arc<AppState>>,
Json(params): Json<GitDeleteRemoteBranchParams>,
) -> Result<Json<()>, AppCommandError> {
let db = &state.db;
folder_commands::git_delete_remote_branch_core(
&params.path,
&params.remote,
&params.branch,
params.credentials.as_ref(),
db,
&state.data_dir,
)
.await?;
Ok(Json(()))
}
pub async fn git_list_conflicts( pub async fn git_list_conflicts(
Json(params): Json<PathParams>, Json(params): Json<PathParams>,
) -> Result<Json<Vec<String>>, AppCommandError> { ) -> Result<Json<Vec<String>>, AppCommandError> {

View File

@@ -106,6 +106,7 @@ pub fn build_router(state: Arc<AppState>, token: String, static_dir: std::path::
.route("/git_fetch", post(handlers::git::git_fetch)) .route("/git_fetch", post(handlers::git::git_fetch))
.route("/git_commit", post(handlers::git::git_commit)) .route("/git_commit", post(handlers::git::git_commit))
.route("/git_fetch_remote", post(handlers::git::git_fetch_remote)) .route("/git_fetch_remote", post(handlers::git::git_fetch_remote))
.route("/git_delete_remote_branch", post(handlers::git::git_delete_remote_branch))
.route("/clone_repository", post(handlers::git::clone_repository)) .route("/clone_repository", post(handlers::git::clone_repository))
// ─── Files ─── // ─── Files ───
.route("/read_file_preview", post(handlers::files::read_file_preview)) .route("/read_file_preview", post(handlers::files::read_file_preview))

View File

@@ -81,6 +81,7 @@ import {
gitMerge, gitMerge,
gitRebase, gitRebase,
gitDeleteBranch, gitDeleteBranch,
gitDeleteRemoteBranch,
openFolderWindow, openFolderWindow,
openCommitWindow, openCommitWindow,
setFolderParentBranch, setFolderParentBranch,
@@ -105,7 +106,7 @@ interface BranchDropdownProps {
} }
type ConfirmAction = { type ConfirmAction = {
type: "merge" | "rebase" | "delete" | "forceDelete" type: "merge" | "rebase" | "delete" | "forceDelete" | "deleteRemote"
branchName: string branchName: string
} }
@@ -424,6 +425,18 @@ export function BranchDropdown({
gitDeleteBranch(folderPath, branchName, true) gitDeleteBranch(folderPath, branchName, true)
) )
break break
case "deleteRemote": {
const idx = branchName.indexOf("/")
const remote = branchName.substring(0, idx)
const rb = branchName.substring(idx + 1)
await runGitTask(t("tasks.deleteRemoteBranch", { branchName }), () =>
withCredentialRetry(
(creds) => gitDeleteRemoteBranch(folderPath, remote, rb, creds),
{ folderPath }
)
)
break
}
} }
} }
@@ -438,6 +451,8 @@ export function BranchDropdown({
return t("confirm.deleteTitle") return t("confirm.deleteTitle")
case "forceDelete": case "forceDelete":
return t("confirm.forceDeleteTitle") return t("confirm.forceDeleteTitle")
case "deleteRemote":
return t("confirm.deleteRemoteTitle")
} }
} }
@@ -462,6 +477,10 @@ export function BranchDropdown({
return t("confirm.forceDeleteDescription", { return t("confirm.forceDeleteDescription", {
branchName: confirmAction.branchName, branchName: confirmAction.branchName,
}) })
case "deleteRemote":
return t("confirm.deleteRemoteDescription", {
branchName: confirmAction.branchName,
})
} }
} }
@@ -472,6 +491,8 @@ export function BranchDropdown({
) { ) {
const label = displayName ?? b const label = displayName ?? b
const isCurrent = b === branch const isCurrent = b === branch
const isTrackingCurrent =
isRemote && !!branch && b.replace(/^[^/]+\//, "") === branch
const isWorktree = worktreeBranchSet.has( const isWorktree = worktreeBranchSet.has(
isRemote ? b.replace(/^[^/]+\//, "") : b isRemote ? b.replace(/^[^/]+\//, "") : b
) )
@@ -553,14 +574,17 @@ export function BranchDropdown({
branchName: b, branchName: b,
})} })}
</DropdownMenuItem> </DropdownMenuItem>
{!isRemote && ( {!isTrackingCurrent && (
<> <>
<DropdownMenuSeparator /> <DropdownMenuSeparator />
<DropdownMenuItem <DropdownMenuItem
variant="destructive" variant="destructive"
onSelect={() => { onSelect={() => {
setDropdownOpen(false) setDropdownOpen(false)
setConfirmAction({ type: "delete", branchName: b }) setConfirmAction({
type: isRemote ? "deleteRemote" : "delete",
branchName: b,
})
}} }}
> >
<Trash2 className="h-3.5 w-3.5" /> <Trash2 className="h-3.5 w-3.5" />
@@ -841,7 +865,11 @@ export function BranchDropdown({
<AlertDialogCancel>{tCommon("cancel")}</AlertDialogCancel> <AlertDialogCancel>{tCommon("cancel")}</AlertDialogCancel>
<AlertDialogAction <AlertDialogAction
variant={ variant={
confirmAction?.type === "delete" ? "destructive" : "default" confirmAction?.type === "delete" ||
confirmAction?.type === "forceDelete" ||
confirmAction?.type === "deleteRemote"
? "destructive"
: "default"
} }
onClick={handleConfirm} onClick={handleConfirm}
> >

View File

@@ -914,6 +914,7 @@
"mergeBranch": "دمج {branchName}", "mergeBranch": "دمج {branchName}",
"rebaseTo": "Rebase إلى {branchName}", "rebaseTo": "Rebase إلى {branchName}",
"deleteBranch": "حذف الفرع {branchName}", "deleteBranch": "حذف الفرع {branchName}",
"deleteRemoteBranch": "حذف الفرع البعيد {branchName}",
"initGitRepo": "تهيئة مستودع Git", "initGitRepo": "تهيئة مستودع Git",
"pullCode": "سحب الكود", "pullCode": "سحب الكود",
"fetchInfo": "جلب المعلومات", "fetchInfo": "جلب المعلومات",
@@ -929,7 +930,9 @@
"rebaseDescription": "إجراء rebase للفرع الحالي {currentBranch} على {branchName}؟", "rebaseDescription": "إجراء rebase للفرع الحالي {currentBranch} على {branchName}؟",
"deleteDescription": "حذف الفرع {branchName}؟ لا يمكن التراجع عن هذا الإجراء.", "deleteDescription": "حذف الفرع {branchName}؟ لا يمكن التراجع عن هذا الإجراء.",
"forceDeleteTitle": "حذف الفرع بالقوة", "forceDeleteTitle": "حذف الفرع بالقوة",
"forceDeleteDescription": "الفرع {branchName} لم يتم دمجه بالكامل. هل أنت متأكد من أنك تريد حذفه بالقوة؟ لا يمكن التراجع عن هذا الإجراء." "forceDeleteDescription": "الفرع {branchName} لم يتم دمجه بالكامل. هل أنت متأكد من أنك تريد حذفه بالقوة؟ لا يمكن التراجع عن هذا الإجراء.",
"deleteRemoteTitle": "حذف الفرع البعيد",
"deleteRemoteDescription": "هل تريد حذف الفرع البعيد {branchName}؟ سيؤدي ذلك إلى إزالته من المستودع البعيد ولا يمكن التراجع عن هذا الإجراء."
}, },
"current": "الحالي", "current": "الحالي",
"switchToBranch": "التبديل إلى هذا الفرع", "switchToBranch": "التبديل إلى هذا الفرع",

View File

@@ -914,6 +914,7 @@
"mergeBranch": "{branchName} mergen", "mergeBranch": "{branchName} mergen",
"rebaseTo": "Auf {branchName} rebasen", "rebaseTo": "Auf {branchName} rebasen",
"deleteBranch": "Branch {branchName} löschen", "deleteBranch": "Branch {branchName} löschen",
"deleteRemoteBranch": "Remote-Branch {branchName} löschen",
"initGitRepo": "Git-Repository initialisieren", "initGitRepo": "Git-Repository initialisieren",
"pullCode": "Code pullen", "pullCode": "Code pullen",
"fetchInfo": "Informationen fetchen", "fetchInfo": "Informationen fetchen",
@@ -929,7 +930,9 @@
"rebaseDescription": "Aktuellen Branch {currentBranch} auf {branchName} rebasen?", "rebaseDescription": "Aktuellen Branch {currentBranch} auf {branchName} rebasen?",
"deleteDescription": "Branch {branchName} löschen? Diese Aktion kann nicht rückgängig gemacht werden.", "deleteDescription": "Branch {branchName} löschen? Diese Aktion kann nicht rückgängig gemacht werden.",
"forceDeleteTitle": "Branch erzwungen löschen", "forceDeleteTitle": "Branch erzwungen löschen",
"forceDeleteDescription": "Der Branch {branchName} ist nicht vollständig gemergt. Möchten Sie ihn wirklich erzwungen löschen? Diese Aktion kann nicht rückgängig gemacht werden." "forceDeleteDescription": "Der Branch {branchName} ist nicht vollständig gemergt. Möchten Sie ihn wirklich erzwungen löschen? Diese Aktion kann nicht rückgängig gemacht werden.",
"deleteRemoteTitle": "Remote-Branch löschen",
"deleteRemoteDescription": "Remote-Branch {branchName} löschen? Dies entfernt ihn aus dem Remote-Repository und kann nicht rückgängig gemacht werden."
}, },
"current": "Aktuell", "current": "Aktuell",
"switchToBranch": "Zu diesem Branch wechseln", "switchToBranch": "Zu diesem Branch wechseln",

View File

@@ -914,6 +914,7 @@
"mergeBranch": "Merge {branchName}", "mergeBranch": "Merge {branchName}",
"rebaseTo": "Rebase to {branchName}", "rebaseTo": "Rebase to {branchName}",
"deleteBranch": "Delete branch {branchName}", "deleteBranch": "Delete branch {branchName}",
"deleteRemoteBranch": "Delete remote branch {branchName}",
"initGitRepo": "Initialize Git repository", "initGitRepo": "Initialize Git repository",
"pullCode": "Pull code", "pullCode": "Pull code",
"fetchInfo": "Fetch info", "fetchInfo": "Fetch info",
@@ -929,7 +930,9 @@
"rebaseDescription": "Rebase current branch {currentBranch} onto {branchName}?", "rebaseDescription": "Rebase current branch {currentBranch} onto {branchName}?",
"deleteDescription": "Delete branch {branchName}? This action cannot be undone.", "deleteDescription": "Delete branch {branchName}? This action cannot be undone.",
"forceDeleteTitle": "Force Delete Branch", "forceDeleteTitle": "Force Delete Branch",
"forceDeleteDescription": "Branch {branchName} is not fully merged. Are you sure you want to force delete it? This action cannot be undone." "forceDeleteDescription": "Branch {branchName} is not fully merged. Are you sure you want to force delete it? This action cannot be undone.",
"deleteRemoteTitle": "Delete Remote Branch",
"deleteRemoteDescription": "Delete remote branch {branchName}? This will remove it from the remote repository and cannot be undone."
}, },
"current": "Current", "current": "Current",
"switchToBranch": "Switch to this branch", "switchToBranch": "Switch to this branch",

View File

@@ -914,6 +914,7 @@
"mergeBranch": "Fusionar {branchName}", "mergeBranch": "Fusionar {branchName}",
"rebaseTo": "Rebase a {branchName}", "rebaseTo": "Rebase a {branchName}",
"deleteBranch": "Eliminar rama {branchName}", "deleteBranch": "Eliminar rama {branchName}",
"deleteRemoteBranch": "Eliminar rama remota {branchName}",
"initGitRepo": "Inicializar repositorio Git", "initGitRepo": "Inicializar repositorio Git",
"pullCode": "Hacer pull del código", "pullCode": "Hacer pull del código",
"fetchInfo": "Obtener información", "fetchInfo": "Obtener información",
@@ -929,7 +930,9 @@
"rebaseDescription": "¿Hacer rebase de la rama actual {currentBranch} sobre {branchName}?", "rebaseDescription": "¿Hacer rebase de la rama actual {currentBranch} sobre {branchName}?",
"deleteDescription": "¿Eliminar la rama {branchName}? Esta acción no se puede deshacer.", "deleteDescription": "¿Eliminar la rama {branchName}? Esta acción no se puede deshacer.",
"forceDeleteTitle": "Forzar eliminación de rama", "forceDeleteTitle": "Forzar eliminación de rama",
"forceDeleteDescription": "La rama {branchName} no está completamente fusionada. ¿Estás seguro de que quieres forzar su eliminación? Esta acción no se puede deshacer." "forceDeleteDescription": "La rama {branchName} no está completamente fusionada. ¿Estás seguro de que quieres forzar su eliminación? Esta acción no se puede deshacer.",
"deleteRemoteTitle": "Eliminar rama remota",
"deleteRemoteDescription": "¿Eliminar la rama remota {branchName}? Esto la eliminará del repositorio remoto y no se puede deshacer."
}, },
"current": "Actual", "current": "Actual",
"switchToBranch": "Cambiar a esta rama", "switchToBranch": "Cambiar a esta rama",

View File

@@ -914,6 +914,7 @@
"mergeBranch": "Fusionner {branchName}", "mergeBranch": "Fusionner {branchName}",
"rebaseTo": "Rebase vers {branchName}", "rebaseTo": "Rebase vers {branchName}",
"deleteBranch": "Supprimer la branche {branchName}", "deleteBranch": "Supprimer la branche {branchName}",
"deleteRemoteBranch": "Supprimer la branche distante {branchName}",
"initGitRepo": "Initialiser le dépôt Git", "initGitRepo": "Initialiser le dépôt Git",
"pullCode": "Pull du code", "pullCode": "Pull du code",
"fetchInfo": "Récupérer les infos", "fetchInfo": "Récupérer les infos",
@@ -929,7 +930,9 @@
"rebaseDescription": "Rebaser la branche actuelle {currentBranch} sur {branchName} ?", "rebaseDescription": "Rebaser la branche actuelle {currentBranch} sur {branchName} ?",
"deleteDescription": "Supprimer la branche {branchName} ? Cette action est irréversible.", "deleteDescription": "Supprimer la branche {branchName} ? Cette action est irréversible.",
"forceDeleteTitle": "Forcer la suppression de la branche", "forceDeleteTitle": "Forcer la suppression de la branche",
"forceDeleteDescription": "La branche {branchName} n'est pas entièrement fusionnée. Êtes-vous sûr de vouloir la supprimer de force ? Cette action est irréversible." "forceDeleteDescription": "La branche {branchName} n'est pas entièrement fusionnée. Êtes-vous sûr de vouloir la supprimer de force ? Cette action est irréversible.",
"deleteRemoteTitle": "Supprimer la branche distante",
"deleteRemoteDescription": "Supprimer la branche distante {branchName} ? Cette action la supprimera du dépôt distant et ne pourra pas être annulée."
}, },
"current": "Actuelle", "current": "Actuelle",
"switchToBranch": "Basculer vers cette branche", "switchToBranch": "Basculer vers cette branche",

View File

@@ -914,6 +914,7 @@
"mergeBranch": "{branchName} をマージ", "mergeBranch": "{branchName} をマージ",
"rebaseTo": "{branchName} にリベース", "rebaseTo": "{branchName} にリベース",
"deleteBranch": "ブランチ {branchName} を削除", "deleteBranch": "ブランチ {branchName} を削除",
"deleteRemoteBranch": "リモートブランチ {branchName} を削除",
"initGitRepo": "Git リポジトリを初期化", "initGitRepo": "Git リポジトリを初期化",
"pullCode": "コードをプル", "pullCode": "コードをプル",
"fetchInfo": "情報をフェッチ", "fetchInfo": "情報をフェッチ",
@@ -929,7 +930,9 @@
"rebaseDescription": "現在のブランチ {currentBranch} を {branchName} にリベースしますか?", "rebaseDescription": "現在のブランチ {currentBranch} を {branchName} にリベースしますか?",
"deleteDescription": "ブランチ {branchName} を削除しますか?この操作は元に戻せません。", "deleteDescription": "ブランチ {branchName} を削除しますか?この操作は元に戻せません。",
"forceDeleteTitle": "ブランチを強制削除", "forceDeleteTitle": "ブランチを強制削除",
"forceDeleteDescription": "ブランチ {branchName} はまだ完全にマージされていません。強制削除してもよろしいですか?この操作は元に戻せません。" "forceDeleteDescription": "ブランチ {branchName} はまだ完全にマージされていません。強制削除してもよろしいですか?この操作は元に戻せません。",
"deleteRemoteTitle": "リモートブランチの削除",
"deleteRemoteDescription": "リモートブランチ {branchName} を削除しますか?この操作はリモートリポジトリからブランチを削除し、元に戻せません。"
}, },
"current": "現在", "current": "現在",
"switchToBranch": "このブランチに切り替え", "switchToBranch": "このブランチに切り替え",

View File

@@ -914,6 +914,7 @@
"mergeBranch": "{branchName} 병합", "mergeBranch": "{branchName} 병합",
"rebaseTo": "{branchName}로 리베이스", "rebaseTo": "{branchName}로 리베이스",
"deleteBranch": "브랜치 {branchName} 삭제", "deleteBranch": "브랜치 {branchName} 삭제",
"deleteRemoteBranch": "원격 브랜치 {branchName} 삭제",
"initGitRepo": "Git 저장소 초기화", "initGitRepo": "Git 저장소 초기화",
"pullCode": "코드 pull", "pullCode": "코드 pull",
"fetchInfo": "정보 fetch", "fetchInfo": "정보 fetch",
@@ -929,7 +930,9 @@
"rebaseDescription": "현재 브랜치 {currentBranch}를 {branchName} 위로 리베이스할까요?", "rebaseDescription": "현재 브랜치 {currentBranch}를 {branchName} 위로 리베이스할까요?",
"deleteDescription": "브랜치 {branchName}을(를) 삭제할까요? 이 작업은 되돌릴 수 없습니다.", "deleteDescription": "브랜치 {branchName}을(를) 삭제할까요? 이 작업은 되돌릴 수 없습니다.",
"forceDeleteTitle": "브랜치 강제 삭제", "forceDeleteTitle": "브랜치 강제 삭제",
"forceDeleteDescription": "브랜치 {branchName}가 완전히 병합되지 않았습니다. 강제 삭제하시겠습니까? 이 작업은 되돌릴 수 없습니다." "forceDeleteDescription": "브랜치 {branchName}가 완전히 병합되지 않았습니다. 강제 삭제하시겠습니까? 이 작업은 되돌릴 수 없습니다.",
"deleteRemoteTitle": "원격 브랜치 삭제",
"deleteRemoteDescription": "원격 브랜치 {branchName}을(를) 삭제하시겠습니까? 이 작업은 원격 저장소에서 브랜치를 제거하며 되돌릴 수 없습니다."
}, },
"current": "현재", "current": "현재",
"switchToBranch": "이 브랜치로 전환", "switchToBranch": "이 브랜치로 전환",

View File

@@ -914,6 +914,7 @@
"mergeBranch": "Mesclar {branchName}", "mergeBranch": "Mesclar {branchName}",
"rebaseTo": "Rebase para {branchName}", "rebaseTo": "Rebase para {branchName}",
"deleteBranch": "Excluir branch {branchName}", "deleteBranch": "Excluir branch {branchName}",
"deleteRemoteBranch": "Excluir branch remoto {branchName}",
"initGitRepo": "Inicializar repositório Git", "initGitRepo": "Inicializar repositório Git",
"pullCode": "Fazer pull do código", "pullCode": "Fazer pull do código",
"fetchInfo": "Buscar informações", "fetchInfo": "Buscar informações",
@@ -929,7 +930,9 @@
"rebaseDescription": "Fazer rebase da branch atual {currentBranch} sobre {branchName}?", "rebaseDescription": "Fazer rebase da branch atual {currentBranch} sobre {branchName}?",
"deleteDescription": "Excluir a branch {branchName}? Esta ação não pode ser desfeita.", "deleteDescription": "Excluir a branch {branchName}? Esta ação não pode ser desfeita.",
"forceDeleteTitle": "Forçar exclusão do branch", "forceDeleteTitle": "Forçar exclusão do branch",
"forceDeleteDescription": "O branch {branchName} não está totalmente mesclado. Tem certeza de que deseja forçar a exclusão? Esta ação não pode ser desfeita." "forceDeleteDescription": "O branch {branchName} não está totalmente mesclado. Tem certeza de que deseja forçar a exclusão? Esta ação não pode ser desfeita.",
"deleteRemoteTitle": "Excluir branch remoto",
"deleteRemoteDescription": "Excluir o branch remoto {branchName}? Isso o removerá do repositório remoto e não poderá ser desfeito."
}, },
"current": "Atual", "current": "Atual",
"switchToBranch": "Mudar para esta branch", "switchToBranch": "Mudar para esta branch",

View File

@@ -914,6 +914,7 @@
"mergeBranch": "合并 {branchName}", "mergeBranch": "合并 {branchName}",
"rebaseTo": "变基到 {branchName}", "rebaseTo": "变基到 {branchName}",
"deleteBranch": "删除分支 {branchName}", "deleteBranch": "删除分支 {branchName}",
"deleteRemoteBranch": "删除远程分支 {branchName}",
"initGitRepo": "初始化 Git 仓库", "initGitRepo": "初始化 Git 仓库",
"pullCode": "更新代码", "pullCode": "更新代码",
"fetchInfo": "获取信息", "fetchInfo": "获取信息",
@@ -929,7 +930,9 @@
"rebaseDescription": "确定将当前分支 {currentBranch} 变基到 {branchName} 吗?", "rebaseDescription": "确定将当前分支 {currentBranch} 变基到 {branchName} 吗?",
"deleteDescription": "确定删除分支 {branchName} 吗?此操作不可恢复。", "deleteDescription": "确定删除分支 {branchName} 吗?此操作不可恢复。",
"forceDeleteTitle": "强制删除分支", "forceDeleteTitle": "强制删除分支",
"forceDeleteDescription": "分支 {branchName} 尚未完全合并,确定要强制删除吗?此操作不可恢复。" "forceDeleteDescription": "分支 {branchName} 尚未完全合并,确定要强制删除吗?此操作不可恢复。",
"deleteRemoteTitle": "删除远程分支",
"deleteRemoteDescription": "确定删除远程分支 {branchName} 吗?此操作将从远程仓库中移除该分支,且不可恢复。"
}, },
"current": "当前", "current": "当前",
"switchToBranch": "切换到此分支", "switchToBranch": "切换到此分支",

View File

@@ -914,6 +914,7 @@
"mergeBranch": "合併 {branchName}", "mergeBranch": "合併 {branchName}",
"rebaseTo": "變基到 {branchName}", "rebaseTo": "變基到 {branchName}",
"deleteBranch": "刪除分支 {branchName}", "deleteBranch": "刪除分支 {branchName}",
"deleteRemoteBranch": "刪除遠端分支 {branchName}",
"initGitRepo": "初始化 Git 倉庫", "initGitRepo": "初始化 Git 倉庫",
"pullCode": "更新程式碼", "pullCode": "更新程式碼",
"fetchInfo": "獲取資訊", "fetchInfo": "獲取資訊",
@@ -929,7 +930,9 @@
"rebaseDescription": "確定將目前分支 {currentBranch} 變基到 {branchName} 嗎?", "rebaseDescription": "確定將目前分支 {currentBranch} 變基到 {branchName} 嗎?",
"deleteDescription": "確定刪除分支 {branchName} 嗎?此操作無法復原。", "deleteDescription": "確定刪除分支 {branchName} 嗎?此操作無法復原。",
"forceDeleteTitle": "強制刪除分支", "forceDeleteTitle": "強制刪除分支",
"forceDeleteDescription": "分支 {branchName} 尚未完全合併,確定要強制刪除嗎?此操作不可恢復。" "forceDeleteDescription": "分支 {branchName} 尚未完全合併,確定要強制刪除嗎?此操作不可恢復。",
"deleteRemoteTitle": "刪除遠端分支",
"deleteRemoteDescription": "確定刪除遠端分支 {branchName} 嗎?此操作將從遠端倉庫中移除該分支,且不可恢復。"
}, },
"current": "目前", "current": "目前",
"switchToBranch": "切換到此分支", "switchToBranch": "切換到此分支",

View File

@@ -644,6 +644,20 @@ export async function gitDeleteBranch(
return getTransport().call("git_delete_branch", { path, branchName, force }) return getTransport().call("git_delete_branch", { path, branchName, force })
} }
export async function gitDeleteRemoteBranch(
path: string,
remote: string,
branch: string,
credentials?: GitCredentials | null
): Promise<void> {
return getTransport().call("git_delete_remote_branch", {
path,
remote,
branch,
credentials: credentials ?? null,
})
}
export async function gitListConflicts(path: string): Promise<string[]> { export async function gitListConflicts(path: string): Promise<string[]> {
return getTransport().call("git_list_conflicts", { path }) return getTransport().call("git_list_conflicts", { path })
} }