Quick staging and other file operations in git
Having a modular and well-organized code is clearly great from an architectural standpoint, but it can make the actual filesystem layout and hierarchy of your project a little complex, now that text editors and IDEs also have good fuzzy finding capabilities you can largely not worry about this and still code efficiently. But when working with Git as your version control it does help to be intimate with the filesystem layout of your project, or at least have some tricks up your sleeve. In this post I’d like to share some tricks I use.
Staging files filtered matching some pattern
Most filenames in your project will be named after some convention, in Rails
projects most of the code associated with a user will fall under
controllers/users_controller.rb
, models/user.rb
, and
views/users/*.html.erb
. And similarly in an iOS project you may have
something like UsersViewController.{h,m}
, User.{h,m}
.
So let’s say we want to stage all the modified files associated with a user really quickly, here’s what I’d do:
git add `git ls-files --modified | grep -e "user.*"`
You can use ack instead of grep too, and I’d actually likely use ack myself.
git ls-files
has the benefit of being very fast and smart since it already knows what
files are under version control and which files are modified, so it be much
faster than something like find
which by default would search every file in
your project.
This technique can be used for a variety of things, let’s say you staged all modified files in your project when didn’t mean to stage your controllers you could do something like:
git reset `git ls-files | ack ".*_controller.rb"`
Staging whole directories
Another trick I’ve found that people often don’t know or take advantage of is being able to run Git operations on whole directories.
So in the previous example where we unstaged all controller files, which would
likely all be in the same directory, app/controllers
we could instead just
have done this:
git reset app/controllers
This technique works generally works with commands you’ve seen take a single file.
I also recommend checking out a post I made earlier on lots of tips for searching Git repos. Hopefully this post has made you a more efficient Gitter, and if you have any other tips please let me know.