web-dev-qa-db-ja.com

Git Bash-ls show gitrepoフォルダー

/ c/Toolsという3つのフォルダーがあるフォルダーがあります。

以下のようなコマンドが欲しい

$ ls --show-repositories

Toolsはgitリポジトリではありませんが、Tools/MyProjectとTools/MyAppはどちらもgitリポジトリです。私が欲しい出力は次のとおりです。

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

そのため、親フォルダーから、子フォルダーが現在有効なgitリポジトリであるかどうか(および現在チェックアウトされているブランチ)を確認できます。

ありがとう

4
JaedenRuiner

複雑にしないでおく;ディレクトリ.gitを探し、含まれているディレクトリ内からコマンドを実行します。また、-printをスローして、実行されているディレクトリを確認します。

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

(実際、-printは、found./path/to/repo/.gitであり、./path/to/repo/自体ではありません。しかし、それはちょっとした不便。)


編集:次の方法でOPで要求された正確な出力を生成できます:

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)

これには、私が見ることができる実際の欠点はありません。

設計上、最上位のgitリポジトリのみが検出されます。つまり、「Data」ディレクトリ(この例ではls出力)にgitリポジトリであるサブディレクトリがある場合、それらはリストされませんが、find私が以前に与えたコマンドはそうなるでしょう。しかし、私が言うように、それは仕様によるものです。

これは、lsの出力の色を保持しません。これを行うには、埋め込まれたlsコマンドに--color=alwaysを追加します。

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)

ただし、何らかの理由で、これによりすべての出力の最後に余分な改行が生成されます。しかたがない;大したIMOではありません。


Mac OSの場合、lsには--colorフラグがないため、以下を使用してカラー出力を強制します。

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)
4
Wildcard

そのようなものかもしれません:

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

出力例:

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

最初の「exec」コマンドで遊んで、必要なフォルダー出力形式を変更できます。

0
strangeman

上手、

「--git-dir」オプションは私にとって新しいものであり、それでうまくいきました。さて、楽しい部分です。これが私のcompleteの答えです。これは、他のクエリを組み合わせたものです。誰かがこれをスピードアップする方法を知っているなら、それは素晴らしいでしょう。

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 

これにより、1つのコマンドでディレクトリの一般的なビューを表示できますが、少し遅くなります。 lsと同じ速度は期待していませんが、lsdifが途切れます。スピードアップできれば素晴らしいです。そうでない場合は、肩をすくめるまあ。

Jaeden "Sifo Dyas" al'RaecRuinerに感謝します

0
JaedenRuiner