Como posso visualizar todos os repositórios git na minha máquina?

121

Existe uma maneira em que eu possa ver todos os repositórios git que existem na minha máquina? Algum comando para isso?

n1kh1lp
fonte
2
Veja o resumo do git . É um script bash que lista todos os repositórios e gera suas informações de status. Isenção de responsabilidade, eu sou um dos desenvolvedores.
precisa
@ cagliari2005: E os repositórios vazios? stackoverflow.com/questions/60064170/…
Luciano

Respostas:

102

Se você estiver no Linux find / -name ".git", caso contrário não há como, eles são diretórios padrão; basta usar o programa de localização de arquivos / pastas do SO para encontrar .gitpastas nomeadas.

Arkaitz Jimenez
fonte
1
No Windows (e tenho certeza que o Mac também), você poderia fazer algo semelhante ... apenas uma pesquisa por diretórios denominados .git - que é o que o git usa para armazenar suas meta informações.
precisa saber é o seguinte
3
Nos Macs, o comando acima também funciona. (A menos que você estiver executando OS9 ou mais cedo!)
Alex Feinman
1
Algum bom shell scripts ou pequenos aplicativos utilitários que implementam essa funcionalidade simples de busca de arquivos e adicionam informações de status do repositório à lista? Não deve ser um problema escrever um script de shell para fazer isso, mas sim usar scripts bem adotados do que meus próprios hacks não otimizados.
jmlane
6
@jmlanefor d in `find / -name ".git"`; do cd $d/..; echo `pwd`:; git status; echo; done
LJ VanKuiken
a página de manual find tem solução. Semelhante à resposta aceita, mas usando -prune para retornar mais rapidamente sem entrar nos diretórios .git. Sem o ameixa, o achado entraria na pasta .git e, dependendo do conteúdo, passaria o tempo pesquisando desnecessariamente. A solução da página de manual segue "find repo / (-exec test -d '{}' /. Svn \; -ou \ -exec test -d {} /. Git \; -ou -exec test -d {} / CVS \ ;) \ -print -prune Confira: edite svn e cvs, se não for necessário #
quiet_penguin
38

RESPOSTA ORIGINAL : Isso funciona muito bem no Windows Powershell:

Get-ChildItem . -Attributes Directory+Hidden -ErrorAction SilentlyContinue -Include ".git" -Recurse

EDIT # 1 : -Filter é duas vezes mais rápido que -Include. Aqui está essa solução:

Get-ChildItem . -Attributes Directory+Hidden -ErrorAction SilentlyContinue -Filter ".git" -Recurse

Edição 2 : Keith E. Truesdell mencionou o envio da saída para um arquivo. Veja o comentário dele para essa solução. Eu prefiro a saída do console. Mas o comentário dele me fez pensar que eu prefiro apenas o caminho completo, não toda a bagunça que é retornada por padrão. Se você deseja que apenas o caminho completo, use o seguinte:

Get-ChildItem . -Attributes Directory+Hidden -ErrorAction SilentlyContinue -Filter ".git" -Recurse | % { Write-Host $_.FullName }

NOTA FINAL : As soluções acima retornam apenas repositórios Git no diretório atual . Se você deseja TODOS os repositórios em uma unidade, execute o comando uma vez a partir da raiz de cada unidade.

bopapa_1979
fonte
1
muito útil para usuários do Windows! :)
Felix Feliciant
2
Get-ChildItem: Não foi possível encontrar um parâmetro que corresponda ao nome do parâmetro 'Atributos'. Na linha: 1 caractere: 28
Dewald Swanepoel 30/01
@DewaldSwanepoel - Eu não tenho nenhuma idéia de por que você veria esse erro sobre o parâmetro Attributes. Está claramente na documentação e tentei agora em várias combinações de versões do Windows / PowerShell. O Windows 7, 8 e 10 funcionam com várias versões do PowerShell para mim. Se você descobrir por que o erro está ocorrendo, compartilhe-o aqui para que possamos aprender:>)
bopapa_1979
2
@DewaldSwanepoel - É possível atualizar DEFINITIVAMENTE sua versão do PowerShell. Fazemos com chocolate. Atualmente, estou executando o PowerShell versão 5.0 no Windows 7 no trabalho.
bopapa_1979
1
@ KeithE.Truesdell - Tenho certeza de que os atributos "Diretório + Oculto" são inclusivos e só pesquisarão diretórios. A adição de -Directory pode ser mais rápida nas versões mais recentes do PowerShell. Eu vou passar o tempo. EDIT - A adição do "-Directory" não faz diferença material, como indica a documentação. No entanto, adicionar o atributo de diretório conforme sugerido o torna mais lento. Agora tenho uma ideia do porquê, mas testei nos dois sentidos com o Measure-Command e os três com o atributo Directory adicional foram mais lentos que os três sem.
bopapa_1979 5/06/19
18

No * nix, este também encontrará quaisquer --barerepositórios.

find / -name "*.git" -type d
gahooa
fonte
3
Os repositórios vazios não precisam ser nomeados, name.gité apenas uma convenção que eu, por exemplo, não sigo.
Arkaitz Jimenez
3
Dado que os repositórios vazios não precisam seguir essa convenção de nomenclatura, existe um caminho universal para findesses repositórios ?
jmlane
11

Repositórios Git todos têm HEAD, refse objectsentradas.

no GNU / qualquer coisa,

find -name HEAD -execdir test -e refs -a -e objects \; -printf %h\\n

Apenas a verificação .gitperderá muitos repositórios e submodulos vazios.

Para ficar totalmente paranóico na verificação, você pode pedir ao git para fazer todas as suas próprias verificações antes de imprimir,

find -name HEAD -execdir test -e refs -a -e objects \; \
      -execdir sh -ec 'GIT_DIR=$PWD git rev-parse --absolute-git-dir 2>&-' \;

(edit: eu pensei que o .git/configarquivo era necessário, acontece que não é, então o mínimo absoluto git init newrepoé

mkdir -p newrepo/.git/{objects,refs}
echo ref: refs/heads/master >newrepo/.git/HEAD

)

jthill
fonte
4

No Linux, uma maneira mais rápida seria:

locate -r "\.git$"

supondo que você mantenha o banco de dados do localizador atualizado com sudo updatedb

Ernesto
fonte
Definitivamente, a localização é mais rápida, use-a com precauções, veja aqui: unix.stackexchange.com/questions/60205/…
AjayKumarBasuthkar
3

No Linux e OS X, o seguinte comando é possivelmente o mais rápido (ignorando repositórios sem .git) quando o diretório raiz de findé /:

find / -name .git -exec dirname {} \; -prune

Mas para as raízes que possuem principalmente repositórios abaixo, o seguinte é provavelmente o mais rápido (você pode substituir /por .outra raiz):

find / -type d -exec test -d {}/.git \; -prune -print

Explicação rápida das primárias de findusado (desde há operadores estão presentes aqui, -andestá implícito, ou seja, para cada visitados nó primárias são processados da esquerda para a direita até que um deles avalia a false):

  • -nameé truese o nome corresponder (geralmente, mas não aqui, com caracteres curinga)
  • -execexecuta um comando terminado por ;(que é escapado por \para evitar a interpretação pelo shell) e é truese o status de retorno é 0(ou seja, OK). O nó atual está disponível como {}(que não precisa ser escapado)
  • -pruneé sempre truee faz com que todos os nós filhos sejam ignorados
  • -type dé truepara diretórios
  • -printé necessário aqui, porque se -execestiver presente, não é implicitamente anexado
Walter Tross
fonte
2

No Linux, tente este comando com permissão root:

find / | grep \\.git$

isso apenas pesquisa todos os arquivos que terminam com .git ... você pode fazer isso com ferramentas de pesquisa no Windows, Linux etc ...

Michel Gokan
fonte
7
Não faz sentido deixar findtudo sair e depois filtrar grep. Eu preferiria usar--name "*.git"
Gregory Pakosz
2
@ Gregory Pakosz: Qual a diferença?
Michel Gokan
11
@ Michel, você inicia 2 processos e faz o primeiro transmitir através de um tubo a /árvore inteira para o segundo grep, quando o primeiro pode fazer tudo e evitar o enorme uso inútil de IO. Não é uma diferença real para o usuário normalmente, mas para grandes sistemas de arquivos pode fazer a diferença.
Arkaitz Jimenez
2
de qualquer forma, se você quiser usar o comando JUST find, é melhor usar -regex em vez de -name ... nesse caso, use este comando: sudo find / -regex '. * \. git'
Michel Gokan
4
@MichelKogan melhor por quê?
Mark Amery
2

Uma versão simples do PowerShell:

Get-ChildItem . -Recurse -Hidden .git
Julien Brdy
fonte
1
Isso funcionou para mim! Obrigado! Eu recebi alguns erros em alguns locais em que ele tentou acessar a execução como um usuário normal ao qual o script do PowerShell não tinha acesso, mas, após uma análise mais aprofundada, esses eram lugares com os quais eu não deveria me preocupar de qualquer maneira (ou seja C:\users\<username>\PrintHood , eu também achei que seria útil para adicionar uma saída para um arquivo e desde que eu só se preocupava com o caminho (como este script recebe um monte de informações) para também filtrar apenas pela informação caminho / diretório. Get-ChildItem . -Recurse -Hidden .git | Out-file -FilePath C:\Dev\GitRepoList.txt
Keith E. Truesdell
1

Para Linux:

dir="/home/${USER}"
dir_not="${dir}/miniconda3"
find /home/aeug -type d -iname ".git" -o -path "${dir_not}" -prune | xargs -0 echo 
Em lei
fonte
1

Pequena variação da resposta de Eric Burcham. Essa resposta adiciona \ .git ao final, essa não.

Get-ChildItem . -Attributes Directory+Hidden -ErrorAction SilentlyContinue -Filter ".git" -Recurse | % { Write-Host $_.Parent.FullName }

Eu uso esse comando no início do dia. Ele simplesmente adiciona alguns comandos git ao acima. Por alguma razão, nosso repositório git funciona melhor se alguém executa uma busca e depois puxa, não sabe o porquê. E nós temos muitos submódulos por algum motivo. Enfim, coloque o que você precisa entre os {} 's.

push-location; Get-ChildItem . -Attributes Directory+Hidden -ErrorAction SilentlyContinue -Filter ".git" -Recurse | % { cd $_.parent.fullname; write-host '*************'; $(get-location).path; git fetch; git pull; git checkout .; git clean -f; git submodule update; git status; write-host '*************'; write-host ' '; }; pop-location
Nome em Exibição
fonte