我有一个文件夹 /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