在 `ls -l` 中显示 git 分支

在 `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/

注意:我并不想显示当前目录或作为 shell 提示符的一部分的 git 分支,我已经知道如何

答案1

我编写了一个小型 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 -h、等。lg ~/projectslg ..

更新:

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

已知的错误和缺点:

  • 与默认输出不同,输出不会着色ls(例如,目录为蓝色,可执行文件为绿色,符号链接为青色,...)。
  • 它无法处理包含换行符的文件名。它们将被显示,但不显示分支信息。
  • 输出ls将始终正确,并显示有关您指定为参数的路径的信息(如果有,否则默认为当前目录)。但是,./../条目的分支信息始终与当前工作目录相关,而不是与指定目录相关。
  • 如果在存储库内运行此函数,每个子目录也会附加分支。该函数不区分存储库根目录和任何存储库子目录。

如果您遇到更多问题或恰好知道列出的问题之一的解决方案,请随时发表评论。

答案2

好的... 看到没有内置方法可以做到这一点,我继续编写自己的 Python 程序。您可以使用 pip 获取它:

pip3 install mklibpy-bin

目前仅支持Python3。

GitHub 链接

答案3

我扩展了脚本形式字节指挥官

我的版本显示你的分支比远程领先或落后多少次提交。

它也首先获取更改。

lg() {
  ls -alF "$@"|awk '{
    match($0,/^(\S+\s+){8}(.+)$/,f);
    b="";
    d="";
    git -C "f[2]" fetch;
    c="git -C \""f[2]"\" branch -v 2>/dev/null";
    while((c|getline g)>0){
      if(match(g,/^\* (\S+)/,a)){
        b="("a[1]")";
      };
      if(match(g,/^\*(.*)\[(.*)ahead ([0-9]+)(.*)\]/,u)){
        e="+"u[2]" ";
        d=d e
      }
      if(match(g,/^\*(.*)\[(.*)behind ([0-9]+)(.*)\]/,v)){
        e="-"v[2]"";
        d=d e
      }
      if(d == "") {
        d="="
      }
    };
    close(c);
    print$0,b,d
  }';
}

编辑:修复正则表达式。

相关内容