diff --git a/README.md b/README.md index 43f592a..ffa7f60 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). -_1255 TILs and counting..._ +_1256 TILs and counting..._ --- @@ -262,6 +262,7 @@ _1255 TILs and counting..._ - [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) - [Excluding Files Locally](git/excluding-files-locally.md) +- [Find And Remove Files That Match A Name](git/find-and-remove-files-that-match-a-name.md) - [Find The Date That A File Was Added To The Repo](git/find-the-date-that-a-file-was-added-to-the-repo.md) - [Find The Initial Commit](git/find-the-initial-commit.md) - [Get The Name Of The Current Branch](git/get-the-name-of-the-current-branch.md) diff --git a/git/find-and-remove-files-that-match-a-name.md b/git/find-and-remove-files-that-match-a-name.md new file mode 100644 index 0000000..1c974f4 --- /dev/null +++ b/git/find-and-remove-files-that-match-a-name.md @@ -0,0 +1,37 @@ +# Find And Remove Files That Match A Name + +Let's say I have a bunch of `robots.txt` file scattered throughout my project. +I want to find all instances of that file checked into git. I then want to +remove that file from git. + +I can find all the instances of that file checked into git using the +[`git-ls-files`](https://git-scm.com/docs/git-ls-files) command. + +```bash +$ git ls-files '**/robots.txt' +project-a/public/robots.txt +project-b/public/robots.txt +apps/project-c/public/robots.txt +``` + +That results in a list of paths of those files regardless of how far down they +are nested (because of the `**` glob pattern). + +And because `git-ls-files` is a _git plumbing_ command, it pipes cleanly into +other unix commands. + +I can combine that first command with [`git +rm`](https://git-scm.com/docs/git-rm) using the +[`xargs`](https://man7.org/linux/man-pages/man1/xargs.1.html) command. + +```bash +$ git ls-files '**/robots.txt' | xargs git rm +rm 'project-a/public/robots.txt' +rm 'project-b/public/robots.txt' +rm 'apps/project-c/public/robots.txt' +``` + +That takes each path from the first part of the command and passes it to `git +rm` which stages it as a removed file. + +I can finalize my work by creating a commit from these staged changes.