Git Bash - ls 显示 git repo 文件夹

Git Bash - ls 显示 git repo 文件夹

我有一个文件夹 /c/Tools,其中包含三个文件夹。

我想要一个像下面这样的命令

$ ls --show-repositories

Tools 不是 git 存储库,但 Tools/MyProject 和 Tools/MyApp 都是。我想要的输出是:

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 存储库(以及当前签出的分支)

谢谢

答案1

把事情简单化;查找该目录.git并从其包含的目录中运行命令。还可以输入 a-print来查看它在哪个目录中运行:

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

(好吧,实际上-print显示了目录成立./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 存储库,即,如果您的“数据”目录(在示例ls输出中)具有 git 存储库的子目录,它们将不会被列出,而使用find我之前给出的命令,它们将被列出。但正如我所说,这是设计使然。

这不会保留 的输出中的颜色ls。您可以通过--color=always向嵌入命令添加 a 来完成此操作ls

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)

不过,由于某种原因,这会在所有输出的末尾产生一个额外的换行符。那好吧;海事组织没什么大不了的。


对于 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)

答案2

可能是这样的:

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”命令来更改所需的文件夹输出格式。

答案3

出色地,

我会说“--git-dir”选项对我来说是新的,并且成功了。现在是有趣的部分。这是我的完全的答案,这是这里其他查询的组合。如果有人知道加快速度的方法,那就太好了。

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 

这允许我用一个命令查看目录的一般视图,但是,它确实有点慢。我不期望与 ls 相同的速度,但 lsdif 不稳定。如果可以加快速度,那就太好了。如果不,耸肩那好吧。

感谢 Jaeden“Sifo Dyas”al'Raec Ruiner

相关内容