Encontre todos os git repos que não contenham nenhum .gitignore e .gitattributes

2

Eu basicamente quero encontrar todos os repositórios git que não possuem nem um arquivo .gitattributes nem um .gitignore na raiz.

Eu usei find . -type d '!' -exec test -e "{}/.gitignore" ';' -print para encontrá-lo, mas ele lista todos os diretórios em vez de apenas os diretórios git de nível superior.

Minha árvore de diretórios é assim:

GitHub
├─ _Clones
|  ├─ repo1 (has .gitignore)
|  └─ repo2
├─ _Forks
|  ├─ repo1 (has .gitattributes)
|  └─ _For-Later
|      ├─ repo2
|      └─ repo3
├─ myrepo1 (has both)
├─ myrepo2 (has both)
...
└─ myrepo10

Nesse layout, eu gostaria que a saída fosse _Clones\repo2 , _Forks\_For-Later\repo2 , _Forks\_For-Later\repo3 e myrepo10 .

Eu tentei usar o parâmetro depth para encontrar, mas isso é uma variável para cada diretório!

    
por Ashhar Hasan 12.01.2016 / 08:04

1 resposta

3

Para listar os diretórios raiz dos repositórios git, eu uso o seguinte:

find . -name .git -print0 | xargs -0 dirname

Uma variante encontra todas as pastas contendo .gitignore :

find . -name .gitignore -print0 | xargs -0 dirname

Determinar repositórios git cuja raiz não contenha .gitignore é simplesmente uma operação definida nos dois conjuntos de pastas:

comm -23 <(find . -name .git -print0 | xargs -0 dirname | sort) <(find . -name .gitignore -print0 | xargs -0 dirname | sort)

Isso compara os dois conjuntos de pastas (que devem ser classificados) e lista os que aparecem apenas no primeiro conjunto. A operação <() é substituição de processo e permite que a saída de qualquer comando seja usada como entrada para outro comando em vez de um arquivo.

Substitua .gitignore por .gitattributes acima para encontrar os repositórios git que não contêm .gitattributes em seu diretório raiz ...

Para obter o resultado final, combine os dois:

comm -23 <(comm -23 <(find . -name .git -print0 | xargs -0 dirname | sort) <(find . -name .gitignore -print0 | xargs -0 dirname | sort)) <(find . -name .gitattributes -print0 | xargs -0 dirname | sort)
    
por 12.01.2016 / 09:10