Git Bash – Affiche les dossiers repo

Si j'ai un dossier, devises, alors je

pwd > /c/Tools 

dans les outils j'ai trois dossiers (dossiers de solution pour Visual Studio mais pas important).

Je veux une command comme ci-dessous

 1234@Computer mINGW64 ~/Tools $ ls --show-repositories 

now Tools n'est PAS un dossier de référentiel. mais / c / Tools / MyProject et / c / Tools / MyApp sont tous les deux. Donc oublier tous les autres formatting pour ls (que je peux gérer tout seul)
la sortie que je veux est:

 drwxr-xr-x 1 0018121 Domain Users 0 Dec 14 14:33 MyProject/ (develop) drwxr-xr-x 1 0018121 Domain Users 0 Dec 14 14:17 Data/ drwxr-xr-x 1 0018121 Domain Users 0 Dec 14 12:08 MyApp/ (master) -rw-r--r-- 1 0018121 Domain Users 399K Aug 4 10:41 readme.txt -rw-r--r-- 1 0018121 Domain Users 136K Aug 4 10:20 image.jpg 

donc à partir du dossier parent, je peux dire si un dossier enfant est un repository git valide en cours (et quelle twig est actuellement extraite)

Merci Jaeden "Sifo Dyas" al'Raec Ruiner

Rester simple; searchz le directory .git et exécutez vos commands à partir de son directory contenant. -print un -print pour voir dans quel -print il tourne:

 find . -type d -name .git -print -execdir git symbolic-ref --short HEAD \; 

(Ok, en fait, -print montre le -print qu'il a trouvé./path/to/repo/.git , pas le ./path/to/repo/ lui-même, mais c'est un inconvénient mineur.)


EDIT: Vous pouvez produire la sortie EXACT demandée dans votre OP par ce qui suit:

 paste <(ls -ld *) <(for i in *; do if [ -d "$i"/.git ] ; then echo "($(git --git-dir="$i"/.git symbolic-ref --short HEAD))"; else echo; fi; done) 

Cela n'a pas de réel inconvénient que je peux voir.

Par définition, il ne trouve que des repositorys git de niveau supérieur, c'est-à-dire si votre directory "Data" (dans votre exemple de sortie) contient des sous-directorys qui ne sont pas listés, alors qu'avec la command find j'ai donnée plus tôt. Mais comme je le dis c'est à dessein.

Cela ne préserve pas les colors dans la sortie de ls . Vous pouvez le faire en ajoutant un --color=always à la command ls embeddede:

 paste <(ls -ld --color=always *) <(for i in *; do if [ -d "$i"/.git ] ; then echo "($(git --git-dir="$i"/.git symbolic-ref --short HEAD))"; else echo; fi; done) 

Bien que, pour une raison quelconque, cela produit une nouvelle ligne supplémentaire à la fin de toute la sortie. Tant pis; pas un gros problème IMO.


Pour Mac OS, ls n'a pas d'indicateur --color , alors utilisez la command suivante pour forcer la sortie couleur:

 paste <(CLICOLOR_FORCE=true ls -ld *) <(for i in *; do if [ -d "$i"/.git ] ; then echo "($(git --git-dir="$i"/.git symbolic-ref --short HEAD))"; else echo; fi; done) 

Peut être quelque chose comme ça:

 find YOUR_DIR -maxdepth 1 -type d -exec echo -n "{} " \; -exec git --git-dir={}/.git symbolic-ref -q --short HEAD \; 

Exemple de sortie:

 . fatal: Not a git repository: './.git' ./zabbix2 master ./dnsmasq fatal: Not a git repository: './dnsmasq/.git' ./puppet-network master ./resolv_conf fatal: Not a git repository: './resolv_conf/.git' ./old fatal: Not a git repository: './old/.git' ./php_ini fatal: Not a git repository: './php_ini/.git' ./stdlib fatal: Not a git repository: './stdlib/.git' ./mcollective master ./netlogon master ./debian master ./apt fatal: Not a git repository: './apt/.git' 

Vous pouvez jouer avec la première command 'exec' pour changer le format de sortie de dossier requirejs.

Bien,

Je dirai que l'option "–git-dir" était nouvelle pour moi et que c'était l'affaire. Maintenant pour la partie amusante. Voici ma réponse complète , qui est une combinaison d'autres requêtes ici. Si quelqu'un sait comment accélérer le process, ce serait excellent.

 alias ls='ls -FHlAt --color --show-control-chars --group-directories-first' alias lsdif='ls | xargs --delimiter="\n" ~/.config/lsdif_colors.sh' ################# # lsdif_colors.sh ################# for fileLine in "$@" do if [[ $fileLine == total* ]]; then echo $fileLine; else cols=($fileLine); cw=(-10 -1 -7 -6 -5 4 -3 2 -5 0); for ((i=0 ; i < 9; i++)) do printf "%${cw[i]}s " ${cols[i]} done name=${cols[@]:9} if [[ -d .git ]]; then difType=$(git diff --name-status ./$name) if [[ ${difType:0:1} = "M" ]]; then printf "%1s \e[34m%s\e[0m\n" ${difType:0:1} "$name" elif [[ ${difType:0:1} = "D" ]]; then printf "%1s \e[31m%s\e[0m\n" ${difType:0:1} "$name" elif [[ ${difType:0:1} = "A" ]]; then printf "%1s \e[32m%s\e[0m\n" ${difType:0:1} "$name" else printf " %s\n" "$name" fi; elif [[ $fileLine == d* ]]; then d=$(echo ${name:0:((${#name}-1))} | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g") branch="" if [[ -d $d/.git ]]; then branch="("$(git --git-dir="$d"/.git symbolic-ref -q --short HEAD>&1)")" fi; printf " %s \e[36m%s\e[0m\n" "$name" "$branch" else printf " %s\n" "$name" fi; fi; done 

cela me permet de voir une vue générale d'un directory avec une seule command, mais ça va un peu lentement. Je ne m'attends pas à la même vitesse que ls, mais lsdif est agitée. si ça peut être accéléré, super. sinon, hausser les épaules .

Merci Jaeden "Sifo Dyas" al'Raec Ruiner