Подтвердить что ты не робот

Улучшено "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, доступной в списке каталогов.

4b9b3361

Ответ 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 " " есть двойная кавычка (не пробелы). Вы можете использовать разделитель, кроме табуляции.


Заметил проблему с обработкой флагов состояния в вышеприведенном скрипте и исправил ее.

Ответ 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