因此,在过去的几周里,我决定在 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 重写这个,但我现在必须做付费工作 :)