web-dev-qa-db-ja.com

Gitブランチでファイルまたはディレクトリを検索するにはどうすればよいですか?

Gitでは、複数のブランチにわたるパスでファイルまたはディレクトリを検索するにはどうすればよいですか?

ブランチで何かを書いたが、どれを覚えていない。今、私はそれを見つける必要があります。

明確化:ブランチの1つで作成したファイルを探しています。内容が何であるか覚えていないので、内容ではなくパスで見つけたいです。

287
Peeja

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に渡します。

379
Dustin

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

これの利点は、ファイル名を正規表現で検索できることです。

60
ididak

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 可能な実装について。

17
albfan

gitk --allを使用して、「パスに触れる」コミットと目的のパス名を検索できます。

9
Greg Hewgill

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; :'

これらのコマンドは、いくつかの最小シェルスクリプトを~/.gitconfigglobal git alias として直接追加します。

5
lumbric