git log --pretty=format:%aN | sort | uniq -c | sort -n
git log --pretty=format:%aN
выводит только имя автора для каждого коммита.sort
собирает все повторяющиеся имена вместе, затемuniq -c
превращает каждую серию одинаковых строк в количество повторений и значение передsort
числовым значением. Вы можете взять последнюю строку (tail -n 1
), чтобы найти наиболее продуктивную, отменить сортировку(sort -nr
)по убыванию или сделать любую другую обработку, которая вам нравится.
Общий подход
if command; then
# Every went OK
else
# Something failed
fi
и работает дляgit
:
if git clone...; then
# The repo was cloned correctly
else
# Something failed
fi
Первая ветвь выполняется только в том случае, если команда git clone
завершается со статусом 0, что указывает на успех; любой другой статус выхода считается ошибкой и приводит к выбору второй ветки.
С не -существующим файлом a
и cat
вместо этого, если git
это составляет что-то вроде:
]# e=$(cat a 2>&1 1>/dev/null)
]# echo ret=$? out=\"$e\"
ret=1 out="cat: a: No such file or directory"
Теперь у меня есть вывод команды , который представляет собой стандартный вывод cat, замененный на stderr, в качестве «результирующего» значения. Код возврата предоставляется бесплатно как $?
.
Для сравнения успешныйcat
:
]# e=$(cat atext 2>&1 1>/dev/null)
]# echo ret=$? out=\"$e\"
ret=0 out=""
-> Успешное перенаправление на null, пустое сообщение об ошибке.
]# e=$(cat atext)
]# echo ret=$? out=\"$e\"
ret=0 out="First line of a"
-> Успешно, поэтому "$e" содержит данные.
]# e=$(cat xxx 2>&1 1>/dev/null)
]# echo ret=$? out=\"$e\"
ret=1 out="cat: xxx: Is a directory"
-> Сообщение детализировано, но код выхода остается равным единице.
xxx
:git clone.git xxx
, только что сделанная для меня, когда я пытался спровоцировать определенную ошибку. (Поэтому я переключился наcat
)
]# e=$(cat -M 2>&1 1>/dev/null)
]# echo ret=$? out=\"$e\"
ret=1 out="cat: invalid option -- 'M' Try 'cat --help' for more information."
]#
По-прежнему ret=1.
Ссылка в комментарии показывает некоторые жалобы на отсутствие конкретных кодов ошибок для git. Я думаю, что это двойное недоразумение, потому что команды (фарфора )git созданы для интерактивного использования, а оболочка (bash )имеет свою собственную концепцию в -и выводе.
В моем примере я не должен жаловаться на единый код ошибки cat "1" или пытаться поймать и проанализировать сообщение в сложном сценарии (, который противоположен простой программе ). Я должен заранее проверить, все ли готово, и при необходимости сообщить пользователю (об ошибке или предупреждении ).
Интересно, какие коды ошибок вы получаете от git clone
. Справочные страницы git очень мало говорят о кодах возврата. Так же, как vi, например. Очень непохоже на mount
, чьи «коды можно объединить по ИЛИ».
Учитывая "небезопасную" команду git clone $d
я могу добавить код ошибки в сообщение вместе с источником. Это интерактивный вкладыш -:
]# d='xxx'; git clone $d || echo "g. cl. failed with $?"
fatal: destination path 'xxx' already exists and is not an empty directory.
g. cl. failed with 128
Для сценария это не так очевидно; Я бы сделал так:
]#. gc.sh
fatal: destination path 'xxx' already exists and is not an empty directory.
g. cl. failed with 128
Сcat gc.sh
:
d='xxx'
git clone $d; ret=$?
if (( $ret > 0 ))
then echo "g. cl. failed with $ret"
fi
В противном случае $?
не остается достаточно свежим. И тест на true/false тоже явный.