优化提交代码的处理逻辑,避免一些情况无法提交代码

This commit is contained in:
xintaofei
2026-04-01 11:16:41 +08:00
parent f33f658a85
commit 245151dda2
3 changed files with 47 additions and 20 deletions

View File

@@ -1566,19 +1566,44 @@ pub(crate) async fn git_commit_core(
message: &str, message: &str,
files: &[String], files: &[String],
) -> Result<GitCommitResult, AppCommandError> { ) -> Result<GitCommitResult, AppCommandError> {
// Stage selected files // Find files already staged for deletion — git add would fail on these
let mut add_args = vec!["add".to_string(), "--".to_string()]; // because they no longer exist in either the working tree or the index.
add_args.extend(files.iter().map(|file| to_git_literal_pathspec(file))); let staged_deletions: std::collections::HashSet<String> =
crate::process::tokio_command("git")
.args(["diff", "--cached", "--name-only", "--diff-filter=D", "-z"])
.current_dir(path)
.output()
.await
.ok()
.map(|o| {
String::from_utf8_lossy(&o.stdout)
.split('\0')
.filter(|s| !s.is_empty())
.map(|s| s.to_string())
.collect()
})
.unwrap_or_default();
let add_output = crate::process::tokio_command("git") // Stage only files that aren't already staged deletions
.args(&add_args) let files_to_add: Vec<_> = files
.current_dir(path) .iter()
.output() .filter(|f| !staged_deletions.contains(f.as_str()))
.await .collect();
.map_err(AppCommandError::io)?;
if !add_output.status.success() { if !files_to_add.is_empty() {
return Err(git_command_error("add", &add_output.stderr)); let mut add_args = vec!["add".to_string(), "--".to_string()];
add_args.extend(files_to_add.iter().map(|file| to_git_literal_pathspec(file)));
let add_output = crate::process::tokio_command("git")
.args(&add_args)
.current_dir(path)
.output()
.await
.map_err(AppCommandError::io)?;
if !add_output.status.success() {
return Err(git_command_error("add", &add_output.stderr));
}
} }
// Resolve commit author from matching account (e.g. GitHub username) // Resolve commit author from matching account (e.g. GitHub username)

View File

@@ -12,6 +12,7 @@ import { CommitWorkspace } from "@/components/layout/commit-dialog"
import { AppTitleBar } from "@/components/layout/app-title-bar" import { AppTitleBar } from "@/components/layout/app-title-bar"
import { AppToaster } from "@/components/ui/app-toaster" import { AppToaster } from "@/components/ui/app-toaster"
import { getFolder } from "@/lib/api" import { getFolder } from "@/lib/api"
import { toErrorMessage } from "@/lib/app-error"
import type { FolderDetail } from "@/lib/types" import type { FolderDetail } from "@/lib/types"
const TOAST_DURATION_MS = 6000 const TOAST_DURATION_MS = 6000
@@ -67,7 +68,7 @@ function CommitPageInner() {
setState({ setState({
loadedId: normalizedFolderId, loadedId: normalizedFolderId,
folder: null, folder: null,
error: String(err), error: toErrorMessage(err),
}) })
} }
}) })

View File

@@ -47,6 +47,7 @@ import { cn } from "@/lib/utils"
import { toast } from "sonner" import { toast } from "sonner"
import { DiffViewer } from "@/components/diff/diff-viewer" import { DiffViewer } from "@/components/diff/diff-viewer"
import { languageFromPath } from "@/lib/language-detect" import { languageFromPath } from "@/lib/language-detect"
import { toErrorMessage } from "@/lib/app-error"
interface CommitWorkspaceProps { interface CommitWorkspaceProps {
folderPath: string folderPath: string
@@ -342,7 +343,7 @@ export function CommitWorkspace({
await loadDiff(firstFile, result) await loadDiff(firstFile, result)
} }
} catch (err) { } catch (err) {
setError(String(err)) setError(toErrorMessage(err))
setEntries([]) setEntries([])
setExpandedTrackedDirs(new Set()) setExpandedTrackedDirs(new Set())
setExpandedUntrackedDirs(new Set()) setExpandedUntrackedDirs(new Set())
@@ -432,7 +433,7 @@ export function CommitWorkspace({
}) })
onCommitted?.() onCommitted?.()
} catch (err) { } catch (err) {
setError(String(err)) setError(toErrorMessage(err))
} finally { } finally {
setCommitting(false) setCommitting(false)
} }
@@ -448,7 +449,7 @@ export function CommitWorkspace({
toast.success(t("toasts.addedToVcs"), { description: file }) toast.success(t("toasts.addedToVcs"), { description: file })
void loadStatus() void loadStatus()
} catch (err) { } catch (err) {
toast.error(t("toasts.addToVcsFailed"), { description: String(err) }) toast.error(t("toasts.addToVcsFailed"), { description: toErrorMessage(err) })
} }
}, },
[folderPath, loadStatus, t] [folderPath, loadStatus, t]
@@ -482,7 +483,7 @@ export function CommitWorkspace({
void loadStatus() void loadStatus()
} catch (err) { } catch (err) {
toast.error(t("toasts.deleteFailed"), { toast.error(t("toasts.deleteFailed"), {
description: String(err), description: toErrorMessage(err),
}) })
} }
})() })()
@@ -519,7 +520,7 @@ export function CommitWorkspace({
void loadStatus() void loadStatus()
} catch (err) { } catch (err) {
toast.error(t("toasts.rollbackFailed"), { toast.error(t("toasts.rollbackFailed"), {
description: String(err), description: toErrorMessage(err),
}) })
} }
})() })()
@@ -558,7 +559,7 @@ export function CommitWorkspace({
void loadStatus() void loadStatus()
} catch (err) { } catch (err) {
toast.error(t("toasts.rollbackFailed"), { toast.error(t("toasts.rollbackFailed"), {
description: String(err), description: toErrorMessage(err),
}) })
} }
})() })()
@@ -597,7 +598,7 @@ export function CommitWorkspace({
void loadStatus() void loadStatus()
} catch (err) { } catch (err) {
toast.error(t("toasts.deleteFailed"), { toast.error(t("toasts.deleteFailed"), {
description: String(err), description: toErrorMessage(err),
}) })
} }
})() })()
@@ -616,7 +617,7 @@ export function CommitWorkspace({
toast.success(t("toasts.addedToVcs"), { description: label }) toast.success(t("toasts.addedToVcs"), { description: label })
void loadStatus() void loadStatus()
} catch (err) { } catch (err) {
toast.error(t("toasts.addToVcsFailed"), { description: String(err) }) toast.error(t("toasts.addToVcsFailed"), { description: toErrorMessage(err) })
} }
}, },
[folderPath, loadStatus, t] [folderPath, loadStatus, t]