grep多个git存储库中的东西

jde*_*uce 5 git gitosis

所以我从其他一些开发人员那里继承了一个相当大的代码库,代码存储在各种git存储库中.

有时候,很难知道特定代码片段可能位于哪个项目中,或者这段代码是否存在于git中.

我想要做的是为一些特定的文本grep所有项目.

我正在使用gitosis,因此所有git存储库都存储在/ home/git/repositories中,结构如下:

/home/git/repositories
  |- project1
    |- HEAD
    |- branches
    |- config
    |- description
    |- hooks
    |- info
    |- objects
    |- refs
  |- project2
    |- ...
Run Code Online (Sandbox Code Playgroud)

我已经尝试过对象目录中的东西做一个递归grep,如下所示:

grep -Hr "text" /home/git/repositories/*/objects
Run Code Online (Sandbox Code Playgroud)

这当然无法正常工作,因为对象存储在git的自定义格式中.

做什么?

Wil*_*ell 5

使用git grep带有ref或--no-index:

cd /home/git/repositories
for i in *; do ( cd $i; git grep text HEAD ); done
Run Code Online (Sandbox Code Playgroud)


Rau*_*ria 5

我知道它的老问题,但如果您使用命令行,您可以将其添加到bash_profilebashrc

ggrep() {
    find . -type d -name .git | while read line; do
        (
        cd $line/..
        cwd=$(pwd)
        echo "$(tput setaf 2)$cwd$(tput sgr0)"
        git grep -n "$@"
        )
    done
}
Run Code Online (Sandbox Code Playgroud)

上述函数的基本要点是搜索包含.git并首先输出该目录的所有目录,然后文件以及该标记出现的行号

然后转到/home/git/repositories并使用搜索

ggrep "InvalidToken"

它会像这样输出

/home/git/org/repo1
/home/git/org/repo2
/home/git/org/repo3
/home/git/org/repo3
lib/v3/Utility.pm:59:         code              => 'InvalidToken',
lib/v3/Utility.pm:142:        code              => "InvalidToken",
Run Code Online (Sandbox Code Playgroud)

您还可以传递类似的标志ggrep -i "search"(用于不区分大小写的搜索)