I've been a fairly consistent user of GNU Emacs for... let's call it "a while." For most of that time, I've relied on some variation of etags and some laser-focused uses of grep to help me navigate larger projects. That includes Emacs etags, Exuberant Ctags, GNU GLOBAL, bits of CEDET, grep, Cscope, and so on.
I was feeling a bit irritated with keeping my TAGS file up to date earlier today and started thinking about how to structure a bunch of git aliases to trigger an update when appropriate, but the right way to do that is to remember that every working copy in git is a full repository that can have its own distinct hooks for different steps- which led me to a 4-year-old blog post that did a great job of laying out a good generalized solution.
Still, I felt like I could improve on some of the details, to account for both his taste in Vim, my own taste in Emacs, and the difficulty in declaring one particular tags program 'best' (for example, Exuberant Ctags does not handle Objective-C, which is relevant to my current employment, but handles quite a few languages that Emacs' etags does not...).
If it sounds useful to you, or fun to poke at, it's on GitHub.