Git Bash - ls 显示 git repo 文件夹

Jae*_*ner 6 bash git

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

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

$ ls --show-repositories
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

所以从父文件夹我可以判断子文件夹是否是当前有效的 git 存储库(以及当前签出的分支)

谢谢

Wil*_*ard 5

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

find . -type d -name .git -print -execdir git symbolic-ref --short HEAD \;
Run Code Online (Sandbox Code Playgroud)

(好吧,实际上-print显示目录它找到- ./path/to/repo/.git,而不是它./path/to/repo/本身。但这是一个小小的不便。)


编辑:您可以通过以下方式生成您的 OP 中要求的 EXACT 输出:

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)
Run Code Online (Sandbox Code Playgroud)

这没有我能看到的任何真正的缺点。

按照设计,它只能找到顶级 git repos,即如果您的“数据”目录(在您的示例中) ls输出中)具有 git 存储库的子目录,它们将不会被列出,而使用find我之前给出的命令,它们会被列出。但正如我所说,这是设计使然。

这不会在ls. 您可以通过将 a 添加--color=always到嵌入式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)
Run Code Online (Sandbox Code Playgroud)

但是,出于某种原因,这会在所有输出的末尾产生一个额外的换行符。那好吧; 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)
Run Code Online (Sandbox Code Playgroud)


小智 0

可能是这样的:

find YOUR_DIR -maxdepth 1 -type d -exec echo -n "{}  " \; -exec git --git-dir={}/.git symbolic-ref -q --short HEAD \;
Run Code Online (Sandbox Code Playgroud)

输出示例:

.  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'
Run Code Online (Sandbox Code Playgroud)

您可以使用第一个“exec”命令来更改所需的文件夹输出格式。