Busca en la computadora toda la carpeta .git con cambios sin compromiso

Tengo varias carpetas de proyectos en mi máquina, todas incluyen un directory .git . Supongo que todos los progtwigdores han estado en una situación en la que olvidaron enviar algo al server. Entonces, ¿hay alguna forma de search en todos los subdirectorys los cambios no confirmados / no supervisados ​​y enumerarlos?

Aquí hay un ejemplo de mi situación:

 MainFolder | |-Project1 | |-.git # containing uncommitted changes | |-index.php | |-page_one.php | |-Project2 | |-.git # This git-status is clean | |-index.php | |-another_page.php | |-Project3 | |-.git # containing unstaged changes | |-index.php | |-some_page.php | |-Project4 |-.git # containing uncommited changes |-index.php |-some_page.php 

Me gustaría una list, por ejemplo:

 You need to check these .git-files: - MainFolder/Project1/.git - MainFolder/Project3/.git - MainFolder/Project4/.git 

¿ find hacer lo que quiere?

 find MainFolder -name .git -print -execdir git status \; 
  • -name <pattern> el patrón que está buscando
  • -print imprimir todos los hits
  • -execdir <command> en el subdirectory donde recibiste un command de ejecución de hit; el punto y coma final es obligatorio y debe escapingse para generar el command en el bucle de búsqueda

Se puede encontrar información más detallada en la página de manual .

Tengo un pequeño script bash que uso para hacer esto. No obtendrá el tree que busca, pero le informará el repository de git y si hay cambios no confirmados.

 function runCmd { echo `basename $dir` "repository:" eval $@ echo } for dir in `ls -d */` do pushd $dir >> /dev/null if [ -d ".git" ] then runCmd $@ fi popd >> /dev/null done 

Guarde esto en un file llamado allRepo. Luego puede ejecutar el command que desee desde el nivel superior de su tree de files:

 allRepo git fetch allRepo git status 

Este script es bueno porque no está limitado solo a los commands de git.

¿ mlocate locate (o sus variantes mlocate o slocate ) y has locate.db regularmente actualizado? Yo uso el siguiente script:

 locate -b \*.git | sed 's!/\.git$!!'| while read d; do test -d "$d"/.git || continue cd "$d" && test -n "`git status --short`" && echo "$d" done 

PD. locate puede devolver xxx.git desnudos ( xxx.git ) y no desnudos ( xxx/.git ), por lo que /.git / /.git y /.git solo los repos sin /.git .

 find /Mainfolder -name ".git" -type d | awk -F\/ '{ printf "cd ";for ( i=2;i<=NF-1;i++ ) { printf "%s/",$i } printf "; git status | grep -q \"new file\" && echo \"$(pwd) Needs checking\""}' | sh 

Utilizando find con awk en una línea, encontrará todos los directorys que están controlados por git, luego buildá el nombre del directory usando awk. Esto se imprime y se ejecuta git-status con el resultado grepped para "nuevo file". Este command construido se canaliza a través de sh para ejecutarlo.

El text "nuevo file" deberá modificarse en consecuencia.

Salida:

 /Mainfolder/Project1 Needs checking