Git Bash - ls mostra pastas reit git

4

Eu tenho uma pasta, / c / Tools, com três pastas.

Eu quero um comando como abaixo

$ ls --show-repositories

As ferramentas NÃO são um repositório git, mas também são Tools / MyProject e Tools / MyApp. A saída que quero é:

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

então, a partir da pasta pai, posso dizer se uma pasta filha é um repositório git válido atual (e qual ramificação está com check-out no momento)

Obrigado

    
por JaedenRuiner 14.12.2015 / 21:40

3 respostas

4

Mantenha a simplicidade; procure o diretório .git e execute seus comandos a partir de seu diretório contido. Também lance um -print para ver em que diretório está sendo executado:

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

(Ok, na verdade -print mostra o diretório encontrado - ./path/to/repo/.git , não o ./path/to/repo/ em si. Mas isso é um pequeno inconveniente.)

EDIT: Você pode produzir a saída EXACT solicitada no seu OP da seguinte forma:

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)

Isso não tem nenhuma desvantagem real que eu possa ver.

Por padrão, ele só encontra reit git de nível superior, ou seja, se o diretório "Data" (no seu exemplo ls output) tiver subdiretórios que são git repos, eles não serão listados, enquanto com o comando find I deu anteriormente eles seriam. Mas como eu digo, é por design.

Isso não preserva as cores na saída de ls . Você pode fazer isso adicionando um --color=always ao comando ls incorporado:

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)

Embora, por algum motivo, isso produza uma nova linha extra no final de toda a saída. Ah bem; não é um grande negócio IMO.

Para o Mac OS, ls não tem um sinal --color , portanto, use o seguinte para forçar a saída de cores:

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)
    
por 15.12.2015 / 02:36
0

Pode ser algo assim:

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

Exemplo de saída:

.  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'

Você pode jogar com o primeiro comando 'exec' para alterar o formato de saída da pasta necessário.

    
por 15.12.2015 / 02:06
0

Bem,

Eu diria que a opção "--git-dir" era nova para mim e que resolveu o problema. Agora a parte divertida. Aqui está minha resposta completa , que é uma combinação de outras consultas aqui. Se alguém souber uma maneira de acelerar isso, isso seria excelente.

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 

isso me permite ver uma visão geral de um diretório com um comando, no entanto, ele fica um pouco lento. Eu não estou esperando a mesma velocidade que o ls, mas o lsdif está instável. se pode ser acelerado, ótimo. se não, encolher de ombros oh bem.

Obrigado Jaeden "Sifo Dyas" al'Raec Ruiner

    
por 15.12.2015 / 16:10

Tags