从我的 git 提交中提取字符串

从我的 git 提交中提取字符串

因此,在过去的几周里,我决定在 git commits 中记下我的计费时间。这样客户就能知道他们花了多少钱,而且这也意味着我不必在周末把所有钱都补上。这对我们双方都有好处。

我在提交的末尾留下了一些加密信息。以下是示例:

Flushed out the flux capacitor, drank some BRAWNDO.

T=0.3

这意味着我花了约 20 分钟做某事。1 是一个小时。

所以我的项目里到处都是这些。现在的问题是,我如何从某个日期中挑选出这些,并将它们加起来,以便我可以向客户开具账单?

我应该补充一点,这些不是单用户项目。有些是协作项目,其他开发人员可能希望效仿我的做法,以这种方式处理他们的账单。我需要仅过滤我的提交。

答案1

我们可以根据谁(--author:可以是姓名或电子邮件)和何时(--since:采用大量格式和模糊字符串)来限制 git 输出的日志内容。

然后我们只需要找到以 开头的行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

呃,只有 30.5 小时?!感觉像 60 小时。

--grep '^T='对于拥有数百万次提交的大型项目,在命令中添加一个可能是明智之举。这将在外部条件化数据git log之前在内部进行快速过滤。grep


开始使用后出现了问题。我需要重置时钟。我已经经历了几次脚本迭代(大量巧妙的管道),但由于和git rebase其他树混乱操作,按日期对提交进行排序的最佳方法是手动执行,这样它们只会显示一次。

因此我展示了我认为我写过的最丑陋的功能脚本。

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 重写这个,但我现在必须做付费工作 :)

相关内容