Há muitos casos específicos em sua solicitação.
- Arquivos realmente fora de um diretório gerenciado pelo git.
- Seu
TheFile
se encaixa neste caso.
- Arquivos dentro de um diretório gerenciado pelo Git, com algum marcador
.git
.
.git
nem sempre é um diretório. Pode ser um arquivo também, com um caminho para o GIT_DIR real. Podemos quebrar ainda mais esses arquivos da seguinte forma:
- Arquivos conhecidos, aqueles presentes no índice do Git.
- Arquivos ignorados, aqueles arquivos que correspondem a um padrão por
gitignore(5)
:
-
.gitignore
-
$HOME/.config/git/ignore
-
$GIT_DIR/info/exclude
- Arquivos sob um diretório
$GIT_DIR
real, mas NÃO parte do repositório.
-
.git/hooks
são os mais prováveis
- Também pode ser malware
Assim, o caso mais confiável, será gerar duas listas, relativas ao seu diretório de base $D
, e compará-las (não se esqueça de classificá-las e remover duplicatas de antemão).
Eu não consigo pensar em uma maneira confiável de gerar a sub-lista para 2.3 acima, então deixo isso como um problema em aberto (eu adoraria saber disso, porque eu perdi ganchos antes). / p>
Script de shell para listar arquivos conhecidos por 2.1 acima:
for g in $(find $D -name .git) ; do
echo $g
p=${g%/.git} g2='readlink -f $g' ;
( cd $p && GIT_DIR=$g2 \
git ls-files --exclude-standard --full-name ) \
| sed "s,^,${p}/,g" ;
done > list-2.1
Script de shell para listar arquivos ignorados por 2.2 acima:
for g in $(find $D -name .git) ; do
p=${g%/.git} g2='readlink -f $g' ;
( cd $p && GIT_DIR=$g2 \
git ls-files \
--others -i --exclude-standard ) \
| sed "s,^,${p}/,g" ;
done > list-2.2
Script de shell para listar arquivos por 2.3 acima:
TODO > list-2.3
Script de shell para processar as listas e encontrar o que não está no lado B:
comm -23 <(find $D ! -type d |sort) <(sort 2.1 2.2 2.3 | uniq)