¿Cómo puedo buscar en las ramas de Git un archivo o directorio?
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.
git log
+ git branch
lo 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
).
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.
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.
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 ~/.gitconfig
alias global de git .