diff --git a/README.md b/README.md index a140147..4ce1a97 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ pairing with smart people at Hashrocket. For a steady stream of TILs, [sign up for my newsletter](https://crafty-builder-6996.ck.page/e169c61186). -_1637 TILs and counting..._ +_1638 TILs and counting..._ See some of the other learning resources I work on: - [Ruby Operator Lookup](https://www.visualmode.dev/ruby-operators) @@ -333,6 +333,7 @@ If you've learned something here, support my efforts writing daily TILs by - [Dropping Commits With Git Rebase](git/dropping-commits-with-git-rebase.md) - [Dry Runs in Git](git/dry-runs-in-git.md) - [Exclude A File From A Diff Output](git/exclude-a-file-from-a-diff-output.md) +- [Exclude A Directory During A Command](git/exclude-a-directory-during-a-command.md) - [Excluding Files Locally](git/excluding-files-locally.md) - [Extend Git With Custom Commands](git/extend-git-with-custom-commands.md) - [Files With Local Changes Cannot Be Removed](git/files-with-local-changes-cannot-be-removed.md) diff --git a/git/exclude-a-directory-during-a-command.md b/git/exclude-a-directory-during-a-command.md new file mode 100644 index 0000000..48e758e --- /dev/null +++ b/git/exclude-a-directory-during-a-command.md @@ -0,0 +1,32 @@ +# Exclude A Directory During A Command + +Many of the git commands we use, such as `git add`, `git restore`, etc., target +files and paths relative to the current directory. This is typically exactly +what we want, to stage and unstage and so forth the files and directories in +front of us. + +I recently ran into a situation where I needed to restore a small subset of +changes. At the same time, I had a massive number of auto-generated files +recording HTTP interactions (hundreds of files, modified on the working tree). +I wanted to run a `git restore`, but wading through all those HTTP recording +files was not feasible. + +I needed to exclude those files. They all belonged to a `spec/cassettes` +directory. I could exclude them with a _pathspec_ magic signature pattern which +is used to alter and limit the paths in a git command. + +A _pathspec_ magic signature is a special pattern made up of a `:` followed by +some signature declaring what the pattern means. + +The `(exclude)`, `!`, and `^` magic signatures all mean the same thing — +exclude. So, we can exclude a directory from a `git restore` command like so: + +```bash +$ git restore --patch -- . ':!spec/cassettes' +``` + +We've employed two pathspec patterns here. The first, `.`, scopes everything to +the current directory. The second, `':!spec/cassettes'` excludes everything in +the `spec/cassettes` directory. + +See `man gitglossary` for more on _pathspecs_.