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