Как я могу искать в ветках Git файл или каталог? - PullRequest
286 голосов
/ 16 декабря 2008

В Git, как я могу найти файл или каталог по пути в нескольких ветвях?

Я написал что-то в ветке, но я не помню, какая именно. Теперь мне нужно его найти.

Уточнение : Я ищу файл, который я создал в одной из моих веток. Я хотел бы найти его по пути, а не по его содержимому, поскольку я не помню, что это за содержимое.

Ответы [ 6 ]

379 голосов
/ 17 декабря 2008

Журнал Git найдет его для вас:

% 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).

60 голосов
/ 16 декабря 2008

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

Преимущество этого заключается в том, что вы также можете искать с помощью регулярных выражений имя файла.

17 голосов
/ 01 июня 2013

Хотя ответ ididak довольно крутой, и Handyman5 предоставляет скрипт для его использования, я нашел его немного ограниченным в использовании этого подхода.

Иногда вам нужно искать что-то, что может появиться / исчезнуть со временем, так почему бы не выполнить поиск по всем коммитам? Кроме того, иногда вам нужен подробный ответ, а в других случаях фиксируйте только совпадения. Вот две версии этих опций. Поместите эти сценарии на свой путь:

ГИТ-найти-файл

for branch in $(git rev-list --all)
do
  if (git ls-tree -r --name-only $branch | grep --quiet "$1")
  then
     echo $branch
  fi
done

ГИТ-найти-файлы многословные

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 для возможной реализации.

9 голосов
/ 17 декабря 2008

Вы можете использовать gitk --all и искать коммиты "трогательные пути" и интересующий вас путь.

5 голосов
/ 13 мая 2016

Скопируйте и вставьте это для использования 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 как глобальный псевдоним git .

0 голосов
/ 14 июня 2016

Довольно приличная реализация команды find для Git-репозиториев может быть найдена здесь:

https://github.com/mirabilos/git-find

...