¿Cómo puedo buscar en las ramas de Git un archivo o directorio?

Resuelto Peeja asked hace 15 años • 7 respuestas

En Git, ¿cómo podría buscar un archivo o directorio por ruta en varias ramas?

He escrito algo en una rama, pero no recuerdo cuál. Ahora necesito encontrarlo.

Aclaración : estoy buscando un archivo que creé en una de mis sucursales. Me gustaría encontrarlo por ruta y no por su contenido, ya que no recuerdo cuál es el contenido.

Peeja avatar Dec 17 '08 03:12 Peeja
Aceptado

git log+ git branchlo encontrará por ti:

% 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

También admite globbing:

% git log --all -- '**/my_file.png'

Las comillas simples son necesarias (al menos si se usa el shell Bash) para que el shell pase el patrón global a git sin cambios, en lugar de expandirlo (como con Unix find).

Dustin avatar Dec 16 '2008 22:12 Dustin

git ls-tree podría ayudar. Para buscar en todas las sucursales existentes:

for branch in `git for-each-ref --format="%(refname)" refs/heads`; do
  echo $branch :; git ls-tree -r --name-only $branch | grep '<foo>'
done

La ventaja de esto es que también puedes buscar con expresiones regulares el nombre del archivo.

ididak avatar Dec 16 '2008 20:12 ididak

Aunque la respuesta de ididak es bastante buena y Handyman5 proporciona un script para usarla, encontré un poco restringido el uso de ese enfoque.

A veces es necesario buscar algo que pueda aparecer o desaparecer con el tiempo, entonces, ¿por qué no buscar en todas las confirmaciones? Además de eso, a veces necesitas una respuesta detallada y otras veces solo confirmas coincidencias. Aquí hay dos versiones de esas opciones. Pon estos scripts en tu camino:

git-buscar-archivo

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-buscar-archivo-detallado

for branch in $(git rev-list --all)
do
  git ls-tree -r --name-only $branch | grep "$1" | sed 's/^/'$branch': /'
done

Ahora puedes hacer

$ 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

Vea que usando getopt puede modificar ese script para alternar la búsqueda de todas las confirmaciones, referencias, referencias/cabezas, detalladas, etc.

$ git find-file <regex>
$ git find-file --verbose <regex>
$ git find-file --verbose --decorated --color <regex>

Consulte https://github.com/albfan/git-find-file para ver una posible implementación.

albfan avatar Jun 01 '2013 03:06 albfan

Copia y pega esto para usarlo.git find-file SEARCHPATTERN

Imprimir todas las sucursales buscadas:

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

Imprime solo ramas con resultados:

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

Estos comandos agregarán algunos scripts de shell mínimos directamente a su ~/.gitconfigalias global de git .

lumbric avatar May 13 '2016 14:05 lumbric