为什么'git ls-files'没有显示在选项卡完成上?

时间:2012-03-27 05:33:12

标签: git bash

最近我找到了命令

git ls-files

我发现它非常有用(请参阅-h选项)。如果我输入git然后按Tab

,为什么不显示

我的意思是 - git的“其他”命令列表在哪里?

4 个答案:

答案 0 :(得分:6)

查看您的~/.git-completion.sh__git_list_porcelain_commands()功能。那里列出了git支持但不会完成tab的命令。这些命令中的大多数都是所谓的“管道”命令,包括ls-files。您可以通过评论相应的行轻松地使它们完成制表。像这样:

#ls-files)         : plumbing;;
#ls-remote)        : plumbing;;
#ls-tree)          : plumbing;;

答案 1 :(得分:4)

git ls-files是一个管道命令,其中许多命令都是“隐藏的”,这是正确的。随着时间的推移,许多已被添加到bash完成,但许多仍然“隐藏”

答案 2 :(得分:0)

使用Git 2.18(2018年第二季度),命令行完成(在contrib/中)学会了更好地完成各种命令的路径名。
这包括git ls-files

请参阅commit 7d31407commit 8b4c2e0(2018年5月18日)和commit 7b00342commit 193757fcommit c1bc0a0commit 9703797,{{3} },commit 105c0efcommit a364e98commit f12785acommit 3dfe23bcommit 6bf0cedcommit 722e31c(2018年4月16日)commit 5bb534a。<登记/> (由SZEDER Gábor (szeder)合并于Junio C Hamano -- gitster --,2018年5月30日)

  

完成:改进“git ls-files输出

中处理引用路径”      

如果任何路径名包含反斜杠,双引号,制表符,换行符或任何   控制字符,'git ls-files'和'git diff-index'将包含在内   双引号中的路径名并转义那些特殊字符   使用C风格的单字符转义序列或\nnn八进制值。

     

这可以防止在git-aware路径中列出这些文件   完成后,因为引用它们永远不会匹配   当前的话要完成。

这会带来各种速度提升:

  

完成:在路径完成期间删除带有“dirnames”的重复awk

     

在git-aware路径完成期间,在所有尾随路径之后   组件已从'git ls-files'的输出中删除   'git diff-index',重复每个目录名称   它包含的列出路径数量的多少倍   这可能是很多重复,特别是在调用路径完成时   一个大工作树的根源。

     

列出顶部的所有跟踪文件(12)和目录(23)   linux.git中的worktree(超过62k文件),即所做的一切都很难   在'git ls-files'背后工作:

     

在这个补丁之前,最好的五个,在Linux上使用GNU awk:

real    0m0.069s
user    0m0.089s
sys     0m0.026s
     

后:

real    0m0.052s
user    0m0.072s
sys     0m0.014s

Difference: -24.6%
     

完成:让“ls-files”和“diff-index”过滤匹配路径

     

在git-aware路径完成期间,例如'git rm dir/fil<TAB>',两者都有   “git ls-files”和“git diff-index”会列出给定“dir/”中的所有路径   匹配某些标准(缓存,修改,未跟踪等)   适用于给定的git命令,甚至名称不适合的路径   以'fil'开头。
  当有问题的目录包含许多路径时,这会带来相当大的性能损失,但当前的单词可以唯一完成,或者当只有少数几个路径与当前单词匹配时。

     

减少此代码路径中的迭代次数   通过指定适当的路径到匹配路径的数量   仅限列出'git ls-files'和'git diff-index'的globbing模式   与当前单词匹配的路径。

     

当有很多时,这会大大加快路径完成   要过滤掉的不匹配路径   在linux.git(超过62k文件)的工作树顶部独特地完成跟踪文件名,即正在做'git ls-files Mak'背后的所有艰苦工作以完成'Makefile':

     

在此补丁之前,最好的五个,在Linux上:

$ time cur=Mak __git_complete_index_file

real    0m2.159s
user    0m1.299s
sys     0m1.089s
     

后:

real    0m0.033s
user    0m0.023s
sys     0m0.015s

Difference: -98.5%
Speedup:     65.4x
     

完成:在完成路径时直接填写COMPREPLY

     

当有许多路径匹配时,这会加速路径完成   当前要完成的词。
  在单个目录中包含100k文件的病理库中,列出所有这些文件:

     

在这个补丁之前,最好的五个,在Linux上使用GNU awk:

$ time cur=dir/ __git_complete_index_file

real    0m0.983s
user    0m1.004s
sys     0m0.033s
     

后:

real    0m0.313s
user    0m0.341s
sys     0m0.029s

Difference: -68.2%
Speedup:      3.1x

答案 3 :(得分:-1)

在默认安装中,标签完成仅列出/bin/usr/bin等中显示的命令名称。没有文件/usr/bin/git ls-files

ls-files是一个子命令,你必须教你的shell。假设您正在使用bash,则可以运行help complete以查看可以在.bashrc中添加的命令。

如果您的发行版提供bash-completion包,您可以安装它以节省大量时间:

apt-get install bash-completion  # on Debian/Ubuntu/etc.
yum install bash-completion      # on Fedora/Red Hat/etc.

但是正如manojlds指出的那样,这对于不常用的git命令(如ls-files)不起作用,因为bash-completion会隐藏你的命令。您必须编辑/etc/bash_completion.d/git才能更改。