Existe uma maneira em que eu possa ver todos os repositórios git que existem na minha máquina? Algum comando para isso?
Existe uma maneira em que eu possa ver todos os repositórios git que existem na minha máquina? Algum comando para isso?
Respostas:
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 .git
pastas nomeadas.
for d in `find / -name ".git"`; do cd $d/..; echo `pwd`:; git status; echo; done
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.
No * nix, este também encontrará quaisquer --bare
repositórios.
find / -name "*.git" -type d
name.git
é apenas uma convenção que eu, por exemplo, não sigo.
find
esses repositórios ?
Repositórios Git todos têm HEAD
, refs
e objects
entradas.
no GNU / qualquer coisa,
find -name HEAD -execdir test -e refs -a -e objects \; -printf %h\\n
Apenas a verificação .git
perderá 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/config
arquivo 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
)
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
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 find
usado (desde há operadores estão presentes aqui, -and
está 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
é true
se o nome corresponder (geralmente, mas não aqui, com caracteres curinga)-exec
executa um comando terminado por ;
(que é escapado por \
para evitar a interpretação pelo shell) e é true
se o status de retorno é 0
(ou seja, OK). O nó atual está disponível como {}
(que não precisa ser escapado)-prune
é sempre true
e faz com que todos os nós filhos sejam ignorados-type d
é true
para diretórios-print
é necessário aqui, porque se -exec
estiver presente, não é implicitamente anexadoNo 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 ...
find
tudo sair e depois filtrar grep
. Eu preferiria usar--name "*.git"
/
á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.
Uma versão simples do PowerShell:
Get-ChildItem . -Recurse -Hidden .git
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
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