## Summary Introduces a “ghost commit” workflow that snapshots the tree without touching refs. 1. git commit-tree writes an unreferenced commit object from the current index, optionally pointing to the current HEAD as its parent. 2. We then stash that commit id and use git restore --source <ghost> to roll the worktree (and index) back to the recorded snapshot later on. ## Details - Ghost commits live only as loose objects—we never update branches or tags—so the repo history stays untouched while still giving us a full tree snapshot. - Force-included paths let us stage otherwise ignored files before capturing the tree. - Restoration rehydrates both tracked and force-included files while leaving untracked/ignored files alone.
36 lines
1.1 KiB
Rust
36 lines
1.1 KiB
Rust
use std::path::PathBuf;
|
|
use std::process::ExitStatus;
|
|
use std::string::FromUtf8Error;
|
|
|
|
use thiserror::Error;
|
|
use walkdir::Error as WalkdirError;
|
|
|
|
/// Errors returned while managing git worktree snapshots.
|
|
#[derive(Debug, Error)]
|
|
pub enum GitToolingError {
|
|
#[error("git command `{command}` failed with status {status}: {stderr}")]
|
|
GitCommand {
|
|
command: String,
|
|
status: ExitStatus,
|
|
stderr: String,
|
|
},
|
|
#[error("git command `{command}` produced non-UTF-8 output")]
|
|
GitOutputUtf8 {
|
|
command: String,
|
|
#[source]
|
|
source: FromUtf8Error,
|
|
},
|
|
#[error("{path:?} is not a git repository")]
|
|
NotAGitRepository { path: PathBuf },
|
|
#[error("path {path:?} must be relative to the repository root")]
|
|
NonRelativePath { path: PathBuf },
|
|
#[error("path {path:?} escapes the repository root")]
|
|
PathEscapesRepository { path: PathBuf },
|
|
#[error("failed to process path inside worktree")]
|
|
PathPrefix(#[from] std::path::StripPrefixError),
|
|
#[error(transparent)]
|
|
Walkdir(#[from] WalkdirError),
|
|
#[error(transparent)]
|
|
Io(#[from] std::io::Error),
|
|
}
|