是否有现有命令,或某些技巧或脚本允许我显示“ls”中显示的文件的状态?
如下所示:
$ git ls status #Command could be anything `lsg` is fine too, whatever.
app contents modified
autotest up-to-date
config up-to-date
config.ru staged
db contents modified
doc contents modified
Gemfile modified
Gemfile.lock modified
lib up-to-date
log up-to-date
public up-to-date
Rakefile up-to-date
README up-to-date
script up-to-date
spec up-to-date
tmp up-to-date
vendor contents modidified
test.tmp removed
以任何方式:在目录列表中提供git状态信息。
答案 0 :(得分:11)
使用Git状态short format信息,这是一个使用Awk的Bash脚本和column
命令为您提供自定义状态输出。
#!/bin/bash
git status --porcelain | \
awk 'BEGIN {FS=" "}
{
xstat = substr($0, 1, 1);
ystat = substr($0, 2, 1);
f = substr($0, 4);
ri = index(f, " -> ");
if (ri > 0) f = substr(f, 1, ri);
if (xstat == " " && ystat ~ "M|D") stat = "not updated";
else if (xstat == "M" && ystat ~ " |M|D") stat = "updated in index";
else if (xstat == "A" && ystat ~ " |M|D") stat = "added to index";
else if (xstat == "D" && ystat ~ " |M") stat = "deleted from index";
else if (xstat == "R" && ystat ~ " |M|D") stat = "renamed in index";
else if (xstat == "C" && ystat ~ " |M|D") stat = "copied in index";
else if (xstat ~ "M|A|R|C" && ystat == " ") stat = "index and work tree matches";
else if (xstat ~ " |M|A|R|C" && ystat == "M") stat = "work tree changed since index";
else if (xstat ~ " |M|A|R|C" && ystat == "D") stat = "deleted in work tree";
else if (xstat == "D" && ystat == "D") stat = "unmerged, both deleted";
else if (xstat == "A" && ystat == "U") stat = "unmerged, added by us";
else if (xstat == "U" && ystat == "D") stat = "unmerged, deleted by them";
else if (xstat == "U" && ystat == "A") stat = "unmerged, added by them";
else if (xstat == "D" && ystat == "U") stat = "unmerged, deleted by us";
else if (xstat == "A" && ystat == "A") stat = "unmerged, both added";
else if (xstat == "U" && ystat == "U") stat = "unmerged, both modified";
else if (xstat == "?" && ystat == "?") stat = "untracked";
else if (xstat == "!" && ystat == "!") stat = "ignored";
else stat = "unknown status";
print f " " stat;
}' | \
column -t -s " "
如果您在git-status-ls
的目录中创建可执行文件PATH
($HOME/bin
应该是一个好地方),您可以在任何Git仓库中键入git status-ls
。或者你可以为此创建一个Git别名单行。您也可以使用Perl,Python,C或您最熟悉的任何语言来实现它。
以下是示例输出:
B renamed in index
A untracked
dont_delete_git_pre-commit_hook untracked
刚刚意识到,标签显示为空格。在Awk脚本print f " " stat;
和column -t -s " "
命令中,双引号之间有一个制表符(不是空格)。您可以使用tab以外的分隔符。
注意到上述脚本中状态标志处理的问题并进行了更正。
答案 1 :(得分:5)
答案 2 :(得分:2)
我想要这样的东西-只是用git的状态注释常规ls
输出。我非常喜欢在另一个答案中提到的k
命令,但这是zsh特有的。因此,我写了一个bash脚本,它可以放在我的库中,并且可以从我使用的任何shell中运行,并且可以修改ls
的输出以添加git中的额外信息。
https://github.com/gerph/ls-with-git-status/
由于它修改了ls
的输出,因此可以使用ls
开关中的任何[1]来运行它,并且它将修改输出以包含git信息。它没有完全使用问题中要求的描述,但确实描述了文件,存储库和子模块的更改状态。
一个例子:
charles@laputa ~/projects/prm (add-ci-build-support)> lsg
Makefile {ignored}
artifacts {ignored}
build-to-junitxml.yaml {untracked}
catalog
ci (replace-bash-junit-xml-processor↓4 19 forward) {1 modified}
ci-logs {ignored}
do-build.sh
index-makefile-ro.xsl
index-makefile.xsl
index.xml
index.xsl {modified locally, 3 lines}
logs {ignored}
old-header {untracked}
output {ignored}
project.config
src
test-results.xml {untracked}
tmp {ignored}
在上面:
{ignored}
以灰色显示){untracked}
显示为红色){modified locally, 3 lines}
以黄色显示,用于修改){}
注释是关于文件或目录的。()
的评论是关于存储库的。ci
是一个存储库:
replace-bash-junit-xml-processor
的头后面(分支名称为青色,后面的更改数量为蓝色)19 forward
呈黄色,表示修改)1 modified
为黄色,表示已修改)从git status
中使用的git配置中读取颜色。
[1]一些开关没有意义-强制每个文件1行,并且不支持Dired模式或其他某些格式。
答案 3 :(得分:-1)
这应该让你开始:
$ ( git ls-files -o|sed -e 's/$/ untracked/'; \
git ls-files -m|sed -e 's/$/contents modified/') |
sort
有关您可以使用的其他标志,请参阅git help ls-files
。
您可能希望使用shell内置printf
来按照示例中的方式对齐输出:
$ (git ls-files -o|sed -e 's/$/ untracked/'; \
git ls-files -m|sed -e 's/$/ contents modified/') |
sort |
while read file stat
do
printf "%-30s%-20s\n" $file $stat
done