Gitでは、複数のブランチにわたるパスでファイルまたはディレクトリを検索するにはどうすればよいですか?
ブランチで何かを書いたが、どれを覚えていない。今、私はそれを見つける必要があります。
明確化:ブランチの1つで作成したファイルを探しています。内容が何であるか覚えていないので、内容ではなくパスで見つけたいです。
git logはあなたのためにそれを見つけます:
% git log --all -- somefile
commit 55d2069a092e07c56a6b4d321509ba7620664c63
Author: Dustin Sallings <[email protected]>
Date: Tue Dec 16 14:16:22 2008 -0800
added somefile
% git branch -a --contains 55d2069
otherbranch
グロビングもサポートしています:
% git log --all -- '**/my_file.png'
(少なくともbashシェルを使用する場合)単一引用符が必要なので、シェルは(Unix find
のように)展開するのではなく、グロブパターンを変更せずにgitに渡します。
git ls-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
これの利点は、ファイル名を正規表現で検索できることです。
ididakの応答 はかなりクールで、Handyman5はそれを使用するスクリプトを提供しますが、そのアプローチの使用には少し制限があります。
時間が経つにつれて出現/消滅する可能性のあるものを検索する必要がある場合がありますが、すべてのコミットに対して検索しないのはなぜですか?それに加えて、冗長な応答が必要な場合もあれば、一致のみをコミットする場合もあります。これらのオプションの2つのバージョンがあります。これらのスクリプトをパスに追加します。
git-find-file
for branch in $(git rev-list --all)
do
if (git ls-tree -r --name-only $branch | grep --quiet "$1")
then
echo $branch
fi
done
git-find-file-verbose
for branch in $(git rev-list --all)
do
git ls-tree -r --name-only $branch | grep "$1" | sed 's/^/'$branch': /'
done
今、あなたはできる
$ git find-file <regex>
sha1
sha2
$ git find-file-verbose <regex>
sha1: path/to/<regex>/searched
sha1: path/to/another/<regex>/in/same/sha
sha2: path/to/other/<regex>/in/other/sha
getopt を使用すると、そのスクリプトを変更して、すべてのコミット、参照、参照/ヘッド、冗長な検索などを交互に検索できることがわかります。
$ git find-file <regex>
$ git find-file --verbose <regex>
$ git find-file --verbose --decorated --color <regex>
チェックアウト https://github.com/albfan/git-find-file 可能な実装について。
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
に global git alias として直接追加します。