最近我找到了命令
git ls-files
我发现它非常有用(请参阅-h
选项)。如果我输入git
然后按Tab
?
我的意思是 - git
的“其他”命令列表在哪里?
答案 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 7d31407,commit 8b4c2e0(2018年5月18日)和commit 7b00342,commit 193757f,commit c1bc0a0,commit 9703797,{{3} },commit 105c0ef,commit a364e98,commit f12785a,commit 3dfe23b,commit 6bf0ced,commit 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
才能更改。