Улучшено "ls" с информацией о статусе git?
Есть ли существующая команда или какой-то трюк или script, который позволяет мне показывать статус файлов, показанных в "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, доступной в списке каталогов.
Ответы
Ответ 1
Используя краткую информацию о статусе Git, здесь Bash-скрипт, который использует Awk и команду 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 status-ls
в любом репозитории Git. Или вы можете создать псевдоним Git для этого. Вы также можете реализовать это, используя Perl, Python, C или любой другой язык, который вам наиболее удобен.
Вот пример вывода:
B renamed in index
A untracked
dont_delete_git_pre-commit_hook untracked
Только что понял, вкладки отображаются в виде пробелов. В скрипте Awk print f " " stat;
и в команде column -t -s " "
есть двойная кавычка (не пробелы). Вы можете использовать разделитель, кроме табуляции.
Заметил проблему с обработкой флагов состояния в вышеприведенном скрипте и исправил ее.
Ответ 2
К
Списки каталогов для zsh с функциями git
https://github.com/supercrabtree/k
![enter image description here]()
Ответ 3
Я хотел что-то вроде этого - что-то, что просто аннотировало бы обычный вывод ls
со статусом из git. Мне очень понравилась команда k
которая упоминалась в другом ответе, но она была специфичной для zsh. Поэтому я написал скрипт bash, который может просто находиться в моей библиотеке и запускаться из любой оболочки, которую я использую, и который изменяет вывод ls
добавляя дополнительную информацию из git.
https://github.com/gerph/ls-with-git-status/
Так как он изменяет вывод ls
, вы можете запустить его с любым [1] из переключателей ls
и он изменит вывод, включив информацию git. Он не использует описания, которые были запрошены в этом вопросе, но описывает измененное состояние файлов, а также репозиториев и подмодулей.
Пример:
[email protected] ~/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
- это хранилище: - который в настоящее время 4 коммитит за главой ветки
replace-bash-junit-xml-processor
(имя ветки replace-bash-junit-xml-processor
голубым, число изменений - синим) - что на 19 изменений опережает точку, в которой оно было совершено в последний раз (
19 forward
- желтым, для модифицированных) - который содержит 1 измененный файл (
1 modified
желтым цветом, для измененного)
Раскраска считывается из вашей конфигурации git, используемой в git status
.
[1] Некоторые из переключателей не имеют смысла - они запускаются по одной строке на файл и не поддерживают режим Dired или некоторые другие форматы.
Ответ 4
Это должно помочь вам:
$ ( git ls-files -o|sed -e 's/$/ untracked/'; \
git ls-files -m|sed -e 's/$/contents modified/') |
sort
См. git help ls-files
для других флагов, которые вы можете использовать.
Возможно, вы захотите использовать встроенную оболочку 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