Извлекать строки из моих коммитов git

Итак, за последние пару недель я решил записать свои оплачиваемые времена в git коммитах. Это позволяет клиенту видеть, сколько они тратят, но также это означает, что мне не нужно все это кончать в конце недели. Это хорошо для нас обоих.

Я оставляю маленькие закодированные сообщения в конце своих коммитов. Вот пример:

Flushed out the flux capacitor, drank some BRAWNDO.

T=0.3

Это означает, что я потратил ~ 20 минут на то, чтобы что-то сделать. 1 час.

Так что я засорял их в своих проектах. Теперь вопрос в том, как мне выбрать их с определенной даты и сложить, чтобы я мог выставить счет клиенту?

Я должен добавить, что это не однопользовательские проекты. Некоторые сотрудничают, другой разработчик, возможно, пожелает последовать моему примеру и обработать свои счета таким образом. Мне нужно фильтровать только мои коммиты.

1
задан 22 September 2015 в 17:44

1 ответ

Мы можем ограничить то, что регистрирует выводы мерзавца на основе кто (--author: может быть имя или электронная почта) и когда (--since: берет причудливое количество форматов и нечетких строк).

Затем мы просто должны найти строки, которые запускаются с T=, добавьте плюс символы между всеми числами и подайте их в калькулятор командной строки bc.

$ git log --all --author=Oli --since="1 week" | grep -oP '(?<=T=)[\d.]+' | paste -sd+ | bc
30.5

Или с awk:

$ git log --all --author=Oli --since="1 week" | awk -F= '/T\=[0-9.]+/{t+=$2} END{print t}'
30.5

Urgh, только 30,5 часа?! Похоже 60.

В большем проекте с миллионами фиксаций могло бы быть мудро прибавить a --grep '^T=' к git log команда. Это недооценит быстрый фильтр внутренне перед внешним grep обусловливает данные.


Проблема произошла после того, чтобы начинать использовать это. Я должен был сбросить часы. Я был посредством нескольких повторений сценария (большая умная передача по каналу), но благодаря git rebase и другие tree-messing-up операции, лучший способ отсортировать фиксации по дате, и таким образом, они только обнаруживаются однажды, должны сделать это вручную.

Поэтому я представляю самый ужасный функциональный сценарий, я думаю, что когда-либо писал.

TOTAL=0
STARTD=""

function dfmt {
    date -d$1 +%Y-%m-%d
}

while read DATE HASH; do
    [[ -z $STARTD ]] && STARTD=$DATE
    while read M; do
        if [[ $M == "RESET" ]]; then
            echo -e "$(dfmt $STARTD) to $(dfmt $DATE)\t$TOTAL"
            TOTAL=0
            STARTD=$DATE
        else
            TOTAL=$(bc <<< "$TOTAL + $M")
        fi
    done < <(git show -s $HASH | grep -oP '(?<=T=)([\d.]+|RESET)')
done < <(git log --author=Oli --all --pretty="%aI %H" | sort -u -k1,1)

echo -e "$(dfmt $STARTD) to $(dfmt now)*\t$TOTAL\t" $(bc <<< "scale=2; $TOTAL / 8.0") " days"

Это анализирует каждую фиксацию и производит каждый тарификационный блок (между T=RESET маркеры). Это намного лучше. Это намного медленнее. Кажется неизбежным, что я перепишу это в Python один день, но я должен сделать оплату работы на данный момент :)

1
ответ дан 23 September 2015 в 03:44
  • 1
    Существует ли учебное руководство о том, как данным резервного копирования с помощью живого CD Linux? I' m не слишком уверенный, если моя установка Windows повреждается - я думаю, что это было последнее обновление, которое это сделало, который мог бы быть проблемой. –  12 December 2016 в 14:08

Другие вопросы по тегам:

Похожие вопросы: