在`ls -l`命令中显示git分支。

是否可以配置ls命令,以便在使用ls -l时,在目录名后面添加git分支名称(如果该目录是git仓库)?

这样我就可以快速找到当前目录下的git仓库以及它们的工作状态。

类似于这样:

-rw-rw-r--  1 michael michael    8 Aug 26 02:07 a-file
drwxrwxr-x  3 michael michael 4096 Aug 26 02:07 a-repo/ (master)
drwxrwxr-x  2 michael michael 4096 Aug 26 02:07 not-a-repo/

注意:我不是想要显示当前目录的git分支,也不是作为shell提示符的一部分,这一点我已经知道了。

3我认为你需要自己编写代码片段来实现这个功能,因为我猜测如果有人已经写了这样的代码,那个人可能不会看到这条信息,并且很可能没有公开发布它。 - David
2个回答

我写了一个小的Bash函数,主要使用awk来处理ls命令的输出,并将git分支名称附加到目录中,如果它们是仓库的一部分。
安装方法: 要安装这个函数,只需复制下面的行并将其追加到您的~/.bashrc文件的末尾。之后您需要执行source .bashrc或重新启动shell会话以使更改生效。
lg (){ ls -alF "$@"|awk '{match($0,/^(\S+\s+){8}(.+)$/,f);b="";c="git -C \""f[2]"\" branch 2>/dev/null";while((c|getline g)>0){if(match(g,/^\* (.+)$/,a)){b="("a[1]")"}};close(c);print$0,b}';}

之后,您将拥有一个名为lg的新命令,其行为类似于默认的ll别名(实际上是ls -alF),但附加了当前的git分支。

示例用法:

这里是一些示例输出,注意在git1/git2/后面的分支名称:

$ lg
total 48 
drwxrwxr-x 12 bytecommander bytecommander 4096 Aug 26 14:48 ./ 
drwxr-xr-x 74 bytecommander bytecommander 4096 Aug 26 15:30 ../ 
drwxrwxr-x  6 bytecommander bytecommander 4096 Aug 26 14:43 git1/ (master)
drwxrwxr-x  7 bytecommander bytecommander 4096 Aug 26 14:42 git2/ (develop)
drwxrwxr-x  4 bytecommander bytecommander 4096 Aug 26 14:45 no-git/ 
-rw-rw-r--  1 bytecommander bytecommander    0 Aug 26 14:42 regular-file 
lg命令仍然接受各种参数,就像ls一样。例如,您可以运行lg -hlg ~/projectslg ..等。

更新:

  • 修复了文件名包含空格或以#开头的问题。

已知的错误和缺点:

  • 输出不会像默认的ls输出那样有颜色(例如,目录是蓝色的,可执行文件是绿色的,符号链接是青色的等)。
  • 它无法处理文件名中包含换行符的情况。它们将被显示,但不会显示分支信息。
  • ls输出始终正确,并显示您指定为参数的路径的信息(如果有的话,默认情况下为当前目录)。然而,./../条目的分支信息始终相对于当前工作目录,而不是指定的目录。
  • 如果在存储库内运行此命令,每个子目录也将附加分支信息。该函数不区分存储库根目录和任何存储库子目录。
如果你遇到更多问题或者恰好知道其中一个列出的问题的解决方案,欢迎留下评论。

文件名中包含换行符,从技术上讲是有效的,但我认为应该被视为“无效”。它们往往会导致很多问题 :P - Thomas Ward
非常感谢你的回答。然而,由于没有内置的方法来完成这个任务,我正在考虑自己编写一个Python程序,因为它比awk更灵活。 - Michael Kim

好的...看到没有内置的方法来做这件事,我就自己写了一个Python程序。你可以使用pip来获取它:
pip3 install mklibpy-bin

目前只支持Python3。 GitHub链接