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.
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.
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:
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:
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.
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.
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
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'
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
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.
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.fonte
for d in `find / -name ".git"`; do cd $d/..; echo `pwd`:; git status; echo; done
RESPOSTA ORIGINAL : Isso funciona muito bem no Windows Powershell:
EDIT # 1 : -Filter é duas vezes mais rápido que -Include. Aqui está essa solução:
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:
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.
fonte
No * nix, este também encontrará quaisquer
--bare
repositórios.fonte
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
eobjects
entradas.no GNU / qualquer coisa,
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,
(edit: eu pensei que o
.git/config
arquivo era necessário, acontece que não é, então o mínimo absolutogit init newrepo
é)
fonte
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
fonte
No Linux e OS X, o seguinte comando é possivelmente o mais rápido (ignorando repositórios sem
.git
) quando o diretório raiz defind
é/
:Mas para as raízes que possuem principalmente repositórios abaixo, o seguinte é provavelmente o mais rápido (você pode substituir
/
por.
outra raiz):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 afalse
):-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
é sempretrue
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 anexadofonte
No Linux, tente este comando com permissão root:
isso apenas pesquisa todos os arquivos que terminam com .git ... você pode fazer isso com ferramentas de pesquisa no Windows, Linux etc ...
fonte
find
tudo sair e depois filtrargrep
. 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:
fonte
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
Para Linux:
fonte
Pequena variação da resposta de Eric Burcham. Essa resposta adiciona \ .git ao final, essa não.
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.
fonte