Gitコントロールソースプロジェクトのすべてのブランチ内でgit grep
を実行できますか?または、実行する別のコマンドがありますか?
質問 " git履歴でコミットされたコードをgrep(検索)する方法? "の推奨事項:
git grep <regexp> $(git rev-list --all)
これは、すべてのブランチを含む必要があるすべてのコミットを検索します。
別の形式は次のとおりです。
git rev-list --all | (
while read revision; do
git grep -F 'yourWord' $revision
done
)
この記事 でさらに多くの例を見つけることができます:
私はgitが引数のサイズについて文句を言うのに十分な大きさの1つのプロジェクトで上記を試したので、この問題に遭遇した場合、次のようなことをしてください:
git rev-list --all | (while read rev; do git grep -e <regexp> $rev; done)
(以下のこの回答の最後のセクションにある代替案をご覧ください)
必要に応じて、これらの設定を忘れないでください。
# Allow Extended Regular Expressions
git config --global grep.extendRegexp true
# Always Include Line Numbers
git config --global grep.lineNumber true
このエイリアスも役立ちます:
git config --global alias.g "grep --break --heading --line-number"
注: chernjie推奨git rev-list --all
はやり過ぎです。
より洗練されたコマンドは次のとおりです。
git branch -a | tr -d \* | xargs git grep <regexp>
ブランチのみを検索できます(リモートブランチを含む)
Bash/zshエイリアスを作成することもできます:
alias grep_all="git branch -a | tr -d \* | xargs git grep"
grep_all <regexp>
2016年8月更新: R.M。 推奨事項
fatal: bad flag '->' used after filename
バージョンを試すと、「git branch
」が表示されました。エラーは、HEAD
エイリアス表記に関連付けられていました。
tr
コマンドとxargs
コマンドの間に、パイプにsed '/->/d'
を追加して解決しました。
git branch -a | tr -d \* | sed '/->/d' | xargs git grep <regexp>
あれは:
alias grep_all="git branch -a | tr -d \* | sed '/->/d' | xargs git grep"
grep_all <regexp>
git log
は、特に多くの一致があり、最初に最新の(関連する)変更を確認する場合に、すべてのブランチでテキストを検索するより効果的な方法です。
git log -p --all -S 'search string'
git log -p --all -G 'match regular expression'
これらのログコマンドは、指定された検索文字列/正規表現を追加または削除するコミットを一覧表示します。 -p
オプションにより、パターンが追加または削除された場所に関連するdiffが表示されるため、コンテキストで確認できます。
探しているテキストを追加する関連コミット(例:8beeff00d)を見つけたら、コミットを含むブランチを見つけます。
git branch -a --contains 8beeff00d
私はこれが最も便利だと感じました:
git grep -i foo `git for-each-ref --format='%(refname)' refs/`
リモートとローカルのブランチのみを見るかどうかに応じて、最後の引数を調整する必要があります。
git grep -i foo $(git for-each-ref --format='%(refname)' refs/remotes)
git grep -i foo $(git for-each-ref --format='%(refname)' refs/heads)
作成したエイリアスは次のようになります。
grep-refs = !sh -c 'git grep "$0" "$@" "$(git for-each-ref --format=\"%(refname)\"" refs/)'
2つの一般的な方法でそれを行うことができます:BashまたはGitエイリアス
以下に3つのコマンドを示します。
git grep-branch
-ローカルおよびリモートのすべてのブランチで検索git grep-branch-local
-ローカルブランチのみで検索git grep-branch-remote
-リモートブランチのみ使用法は git grep
と同じです
git grep-branch "find my text"
git grep-branch --some-grep-options "find my text"
~/.gitconfig
は、追加した複雑なコードを評価して混乱させるため、手動でgit config --global alias
ファイルに追加する必要があります。
[alias]
grep-branch = "!f(){ git branch -a | sed -e 's/[ \\*]*//' | grep -v -e '\\->' | xargs git grep $@; };f "
grep-branch-remote = "!f(){ git branch -a | sed -e 's/[ \\*]*//' | grep -v -e '\\->' | grep '^remotes' | xargs git grep $@; };f"
grep-branch-local = "!f(){ git branch -a | sed -e 's/[ \\*]*//' | grep -v -e '\\->' -e '^remotes' | xargs git grep $@; };f "
注:エイリアスを追加しても実行に失敗する場合は、バックスラッシュ\
を確認してくださいbashコマンドと比較して、追加のエスケープ\\
が必要になる場合があります。
git branch -a
-すべてのブランチを表示します。sed -e 's/[ \\*]*//'
-トリムspaces(branch -a
から)および*(アクティブなブランチ名にある);grep -v -e '\\->'
-remotes/Origin/HEAD -> Origin/master
のような複雑な名前を無視します。grep '^remotes'
-すべてのリモートブランチを取得します。grep -v -e '^remotes'
-ブランチを取得exceptリモートブランチ;git grep-branch-local -n getTastyCookies
-n
一致する行の先頭に行番号を付けます。
[user@pc project]$ git grep-branch-local -n getTastyCookies
dev:53:modules/factory/getters.php:function getTastyCookies($user);
master:50:modules/factory/getters.php:function getTastyCookies($user)
現在の構造は次のとおりです。
:
-セパレーター
dev
53
modules/factory/getters.php
function getTastyCookies($user)
ご存じのとおり:Bashコマンドは.sh
スクリプトに保存するか、シェルで実行する必要があります。
git branch -a | sed -e 's/[ \*]*//' | grep -v -e '\->' -e '^remotes' | xargs git grep "TEXT"
git branch -a | sed -e 's/[ \*]*//' | grep -v -e '\->' | grep '^remotes' | xargs git grep "TEXT"
git branch -a | sed -e 's/[ \*]*//' | grep -v -e '\->' | xargs git grep "TEXT"
以下にその方法を示します。
git for-each-ref --format='%(*refname)' | xargs git grep SEARCHTERM
コミットSHA1をgit grep
に与えると、作業コピーではなく、それらを検索します。
すべてのブランチを検索するには、allのツリーをgit rev-list --all
で取得できます。全部入れて
git grep "regexp" $(git rev-list --all)
...そして忍耐があります