Git で、多数のブランチにまたがるパスでファイルまたはディレクトリを検索するにはどうすればよいですか?
ブランチに何か書いたことがありますが、どのブランチか覚えていません。今、私はそれを見つける必要があります。
明確化: ブランチの 1 つで作成したファイルを探しています。内容を覚えていないので、内容ではなくパスで検索したいと思います。
git log
+git branch
はあなたのためにそれを見つけます:
% git log --all -- somefile
commit 55d2069a092e07c56a6b4d321509ba7620664c63
Author: Dustin Sallings <dustin@spy.net>
Date: Tue Dec 16 14:16:22 2008 -0800
added somefile
% git branch -a --contains 55d2069
otherbranch
グロビングもサポートします:
% git log --all -- '**/my_file.png'
一重引用符が必要なため (少なくとも Bash シェルを使用している場合)、シェルは glob パターンを展開するのではなく、変更せずに git に渡します (Unix の場合と同様find
)。
gitls-treeが役立つかもしれません。既存のすべてのブランチを検索するには:
for branch in `git for-each-ref --format="%(refname)" refs/heads`; do
echo $branch :; git ls-tree -r --name-only $branch | grep '<foo>'
done
これの利点は、ファイル名を正規表現で検索できることです。
gitk --all
「パスに触れる」コミットと興味のあるパス名を使用して検索できます。
これをコピペして使うgit find-file SEARCHPATTERN
検索されたすべてのブランチの印刷:
git config --global alias.find-file '!for branch in `git for-each-ref --format="%(refname)" refs/heads`; do echo "${branch}:"; git ls-tree -r --name-only $branch | nl -bn -w3 | grep "$1"; done; :'
結果のあるブランチのみを出力します。
git config --global alias.find-file '!for branch in $(git for-each-ref --format="%(refname)" refs/heads); do if git ls-tree -r --name-only $branch | grep "$1" > /dev/null; then echo "${branch}:"; git ls-tree -r --name-only $branch | nl -bn -w3 | grep "$1"; fi; done; :'
~/.gitconfig
これらのコマンドは、いくつかの最小限のシェル スクリプトをas global git aliasに直接追加します。
Git リポジトリのコマンドの適切な実装は、find
次の場所にあります。