Я сделал два варианта, основываясь на ответе VonC.
Мой первый вариант:
for k in `git branch -a | sed -e s/^..// -e 's/(detached from .*)/HEAD/'`; do echo -e `git log -1 --pretty=format:"%Cgreen%ci |%Cblue%cr |%Creset$k |%s" $k --`;done | sort | column -t -s "|"
Это обрабатывает локальные и удаленные ветви (-a), обрабатывает состояние отсоединенной головки (более длинная команда sed, хотя решение довольно грубое - она просто заменяет информацию об отделенной ветви на ключевое слово HEAD), добавляет в передайте субъект (% s) и поместите вещи в столбцы с помощью буквенных символов канала в строке формата и передайте конечный результат в column -t -s "|"
. (Вы можете использовать что угодно в качестве разделителя, если это не то, что вы ожидаете в остальной части вывода.)
Мой второй вариант довольно хакерский, но я действительно хотел что-то, что все еще имеет индикатор «это ветвь, в которой вы сейчас находитесь», как это делает команда ветвления.
CURRENT_BRANCH=0
for k in `git branch -a | sed -e 's/\*/CURRENT_BRANCH_MARKER/' -e 's/(detached from .*)/HEAD/'`
do
if [ "$k" == 'CURRENT_BRANCH_MARKER' ]; then
# Set flag, skip output
CURRENT_BRANCH=1
elif [ $CURRENT_BRANCH == 0 ]; then
echo -e `git log -1 --pretty=format:"%Cgreen%ci |%Cblue%cr |%Creset$k |%s" $k --`
else
echo -e `git log -1 --pretty=format:"%Cgreen%ci |%Cblue%cr |%Creset* %Cgreen$k%Creset |%s" $k --`
CURRENT_BRANCH=0
fi
done | sort | column -t -s "|"
Это превращает *, отмечающий текущую ветвь, в ключевое слово, и когда тело цикла видит ключевое слово, оно вместо этого устанавливает флаг и ничего не выводит. Флаг используется для указания того, что для следующей строки следует использовать альтернативное форматирование. Как я уже сказал, совершенно взломан, но это работает! (В основном. По какой-то причине мой последний столбец устарел на текущей ветке. Но я действительно должен вернуться к выполнению реальной работы, а не настраивать это больше.)