Repository files navigation

git-spend : time tracker using git commit message commands

MITReleaseBuild StatusCoverageA+Code QualityDownload

Purpose

Collect, addition and return all the /spend and /spent time-tracking directives in git commit messages.

This looks at the git log of the currently checked out branch of the working directory, and therefore requires git to be installed on your system.

TLDR; JUST DOWNLOAD LINUX/MACDOWNLOAD WINDOWS

By Example

Say you are in the directory of a project with one commit like so :

feat(crunch): implement a nice feature
Careful, it's still sharp.
/spend 10h30

Running:

$ git spend sum

would yield:

1 day 2 hours 30 minutes

Of course, git-spend really shines when you have multiple commits with /spend commands that you want to tally and sum.

💡 You can use git-spend sum or git spend sum, they are equivalent.

Specifications

We assume 8 hours per day, 5 days per week, 4 weeks per month. (like Gitlab does) These can be configured at runtime if needed, using environment variables.

The complete specification can be found in the rules of the test data, and in excruciating detail in the grammar.

The acceptance testing suite also holds many usage examples.

Usage

Go into your git-versioned project's directory:

cd <some git versioned project with commits using /spend directives>

and run:

git spend sum

2 days 1 hour 42 minutes

Or run git-spend from anywhere, but specify the --target directory (which defaults to .):

git spend sum --target <some git versioned project dir>

2 days 1 hour 42 minutes

⛑ Use git spend sum --help or man git-spend-sum to see all the options. Meanwhile, let's look at some available options, below.

Format the output

You can get the spent time in a specific unit :

git spend sum --minutes
git spend sum --hours
git spend sum --days

These values will always be rounded to integers, for convenience, although git-spend does understand floating point numbers in /spend directives.

Filter by commit authors

You can track the time of specified authors only, by name or email :

git spend sum --author Alice --author bob@email.net

Exclude merge commits

You can also exclude merge commits :

git spend sum --no-merges

Restrict to a range of commits

You can restrict to a range of commits, using a commit hash, a tag, or even HEAD~N.

git spend sum --since <ref> --until <ref>

For example, to get the time spent on the last 15 commits :

git spend sum --since HEAD~15

Or the time spent on a tag since previous tag :

git spend sum --since 0.1.0 --until 0.1.1

You can also use dates and datetimes, but remember to quote them if you specify the time:

git spend sum --since 2023-03-21
git spend sum --since "2023-03-21 13:37:00"

📅 Other supported time formats: RFC3339, RFC822, RFC850. If you need a specific timezone, try setting the TZ environment variable: TZ="Europe/Paris" git-spend sum --since 2023-03-21

Download

Direct download

You can ⮋ download the binary straight from the latest build in the releases, and move it anywhere in your $PATH, such as /usr/local/bin/git-spend for example.

⚠ Remember to enable the execution bit with chmod u+x ./git-spend, for example.

There is an experimental install script that does exactly this, plus man pages generation:

curl https://raw.githubusercontent.com/Goutte/git-spend/main/install.sh | sh

🐧 This script only works for linux/amd64, for now. Stigmergy?

Via go get

You can also install via go get (hopefully) :

go get -u github.com/goutte/git-spend

or go install:

go install github.com/goutte/git-spend

If that fails, you can install by cloning and running make install.

Advanced Usage

Read from standard input

You can also directly parse messages from stdin instead of attempting to read the git log:

git log > git.log
cat git.log | git-spend sum --stdin

git spend ignores standard input otherwise.

Configure the time modulo

If you live somewhere where work hours per week are limited (to 35 for example) in order to mitigate labor oppression tactics from monopoly hoarders, you can use environment variables to control how time is "rolled over" between units :

GIT_SPEND_HOURS_PER_DAY=7 git-spend sum

Here are the available environment variables :

  • GIT_SPEND_MINUTES_PER_HOUR (default: 60)
  • GIT_SPEND_HOURS_PER_DAY (default: 8)
  • GIT_SPEND_DAYS_PER_WEEK (default: 5)
  • GIT_SPEND_WEEKS_PER_MONTH (default: 4)

Install the man pages

If you installed via direct download, you might want to install the man pages:

sudo git spend man --install

git help spend will then work as expected.

Develop

First, you'll need to install Golang.

git clone https://github.com/Goutte/git-spend.git
cd git-spend
go get
go run main.go

Build & Run & Install

The binaries in the releases are built by our Continuous Integration.

Nevertheless, if you want to build your own git-spend, you can clone this project and run:

make
make install

upx is used to reduce the binary size in make install-release.


You can compare the checksums, and they should be the same unless microsoft is being naughty.

Build for other platforms

You may use the GOOS and GOARCH environment variables to control the build targets:

GOOS=<target-OS> GOARCH=<target-architecture> go build -o build/git-spend .

To list available targets (os/arch), you can run:

go tool dist list

There's an example in the Makefile, with the recipe make build-windows-amd64.

Contribute

Merge requests are welcome. Make sure you record the time you /spend in your commit messages. :)

Translations

Translations files are in locale/*.toml. To add another language, add a new file, some sugar, some water, and … voilà !

Ideas Stash

You can pick and start any, or do something else entirely. If you don't like any of these, please voice your concerns as early as possible.

  • curl install.sh | sudo sh(ongoing, wider support needed)
  • i18n (ongoing, cobra forked)
  • git-spend sum --format <custom format>
  • git-spend sum --short1d3h27m
  • git-spend chrono start → start an internal chronometer
  • git-spend chrono add → add time to the chronometer
  • Rewriting of /spend chrono [± <duration>] by commit hook
  • Rewriting of /spend <ref> [± <duration>] by commit hook 🌟
  • git spend hook --install to install git hooks for rewriting
  • git spend hook --remove to remove installed git hooks
  • git-spend amend <duration> → amend previous commit with /spend <duration>
  • git-spend amend --add <duration> → same but adds
  • git-spend amend --subtract <duration> → same but subtracts (alias: --sub ?)
  • docker (docker run git-spend -- awkward? ; would need a volume)
  • flatpak perhaps (road blocked, see packaging/)
  • Right-To-Left (ساعد)

About

Sum the time-tracking "/spend" commands of commit messages.

Topics

Resources

Stars

15 stars

Watchers

1 watching

Forks

Releases

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

git-spend : time tracker using git commit message commands

MITReleaseBuild StatusCoverageA+Code QualityDownload

Purpose

Collect, addition and return all the /spend and /spent time-tracking directives in git commit messages.

This looks at the git log of the currently checked out branch of the working directory, and therefore requires git to be installed on your system.

TLDR; JUST DOWNLOAD LINUX/MACDOWNLOAD WINDOWS

By Example

Say you are in the directory of a project with one commit like so :

feat(crunch): implement a nice feature
Careful, it's still sharp.
/spend 10h30

Running:

$ git spend sum

would yield:

1 day 2 hours 30 minutes

Of course, git-spend really shines when you have multiple commits with /spend commands that you want to tally and sum.

💡 You can use git-spend sum or git spend sum, they are equivalent.

Specifications

We assume 8 hours per day, 5 days per week, 4 weeks per month. (like Gitlab does) These can be configured at runtime if needed, using environment variables.

The complete specification can be found in the rules of the test data, and in excruciating detail in the grammar.

The acceptance testing suite also holds many usage examples.

Usage

Go into your git-versioned project's directory:

cd <some git versioned project with commits using /spend directives>

and run:

git spend sum

2 days 1 hour 42 minutes

Or run git-spend from anywhere, but specify the --target directory (which defaults to .):

git spend sum --target <some git versioned project dir>

2 days 1 hour 42 minutes

⛑ Use git spend sum --help or man git-spend-sum to see all the options. Meanwhile, let's look at some available options, below.

Format the output

You can get the spent time in a specific unit :

git spend sum --minutes
git spend sum --hours
git spend sum --days

These values will always be rounded to integers, for convenience, although git-spend does understand floating point numbers in /spend directives.

Filter by commit authors

You can track the time of specified authors only, by name or email :

git spend sum --author Alice --author bob@email.net

Exclude merge commits

You can also exclude merge commits :

git spend sum --no-merges

Restrict to a range of commits

You can restrict to a range of commits, using a commit hash, a tag, or even HEAD~N.

git spend sum --since <ref> --until <ref>

For example, to get the time spent on the last 15 commits :

git spend sum --since HEAD~15

Or the time spent on a tag since previous tag :

git spend sum --since 0.1.0 --until 0.1.1

You can also use dates and datetimes, but remember to quote them if you specify the time:

git spend sum --since 2023-03-21
git spend sum --since "2023-03-21 13:37:00"

📅 Other supported time formats: RFC3339, RFC822, RFC850. If you need a specific timezone, try setting the TZ environment variable: TZ="Europe/Paris" git-spend sum --since 2023-03-21

Download

Direct download

You can ⮋ download the binary straight from the latest build in the releases, and move it anywhere in your $PATH, such as /usr/local/bin/git-spend for example.

⚠ Remember to enable the execution bit with chmod u+x ./git-spend, for example.

There is an experimental install script that does exactly this, plus man pages generation:

curl https://raw.githubusercontent.com/Goutte/git-spend/main/install.sh | sh

🐧 This script only works for linux/amd64, for now. Stigmergy?

Via go get

You can also install via go get (hopefully) :

go get -u github.com/goutte/git-spend

or go install:

go install github.com/goutte/git-spend

If that fails, you can install by cloning and running make install.

Advanced Usage

Read from standard input

You can also directly parse messages from stdin instead of attempting to read the git log:

git log > git.log
cat git.log | git-spend sum --stdin

git spend ignores standard input otherwise.

Configure the time modulo

If you live somewhere where work hours per week are limited (to 35 for example) in order to mitigate labor oppression tactics from monopoly hoarders, you can use environment variables to control how time is "rolled over" between units :

GIT_SPEND_HOURS_PER_DAY=7 git-spend sum

Here are the available environment variables :

  • GIT_SPEND_MINUTES_PER_HOUR (default: 60)
  • GIT_SPEND_HOURS_PER_DAY (default: 8)
  • GIT_SPEND_DAYS_PER_WEEK (default: 5)
  • GIT_SPEND_WEEKS_PER_MONTH (default: 4)

Install the man pages

If you installed via direct download, you might want to install the man pages:

sudo git spend man --install

git help spend will then work as expected.

Develop

First, you'll need to install Golang.

git clone https://github.com/Goutte/git-spend.git
cd git-spend
go get
go run main.go

Build & Run & Install

The binaries in the releases are built by our Continuous Integration.

Nevertheless, if you want to build your own git-spend, you can clone this project and run:

make
make install

upx is used to reduce the binary size in make install-release.


You can compare the checksums, and they should be the same unless microsoft is being naughty.

Build for other platforms

You may use the GOOS and GOARCH environment variables to control the build targets:

GOOS=<target-OS> GOARCH=<target-architecture> go build -o build/git-spend .

To list available targets (os/arch), you can run:

go tool dist list

There's an example in the Makefile, with the recipe make build-windows-amd64.

Contribute

Merge requests are welcome. Make sure you record the time you /spend in your commit messages. :)

Translations

Translations files are in locale/*.toml. To add another language, add a new file, some sugar, some water, and … voilà !

Ideas Stash

You can pick and start any, or do something else entirely. If you don't like any of these, please voice your concerns as early as possible.

  • curl install.sh | sudo sh(ongoing, wider support needed)
  • i18n (ongoing, cobra forked)
  • git-spend sum --format <custom format>
  • git-spend sum --short1d3h27m
  • git-spend chrono start → start an internal chronometer
  • git-spend chrono add → add time to the chronometer
  • Rewriting of /spend chrono [± <duration>] by commit hook
  • Rewriting of /spend <ref> [± <duration>] by commit hook 🌟
  • git spend hook --install to install git hooks for rewriting
  • git spend hook --remove to remove installed git hooks
  • git-spend amend <duration> → amend previous commit with /spend <duration>
  • git-spend amend --add <duration> → same but adds
  • git-spend amend --subtract <duration> → same but subtracts (alias: --sub ?)
  • docker (docker run git-spend -- awkward? ; would need a volume)
  • flatpak perhaps (road blocked, see packaging/)
  • Right-To-Left (ساعد)

About

Sum the time-tracking "/spend" commands of commit messages.

Topics

Resources

Stars

15 stars

Watchers

1 watching

Forks

Releases

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

git-spend : time tracker using git commit message commands

MITReleaseBuild StatusCoverageA+Code QualityDownload

Purpose

Collect, addition and return all the /spend and /spent time-tracking directives in git commit messages.

This looks at the git log of the currently checked out branch of the working directory, and therefore requires git to be installed on your system.

TLDR; JUST DOWNLOAD LINUX/MACDOWNLOAD WINDOWS

By Example

Say you are in the directory of a project with one commit like so :

feat(crunch): implement a nice feature
Careful, it's still sharp.
/spend 10h30

Running:

$ git spend sum

would yield:

1 day 2 hours 30 minutes

Of course, git-spend really shines when you have multiple commits with /spend commands that you want to tally and sum.

💡 You can use git-spend sum or git spend sum, they are equivalent.

Specifications

We assume 8 hours per day, 5 days per week, 4 weeks per month. (like Gitlab does) These can be configured at runtime if needed, using environment variables.

The complete specification can be found in the rules of the test data, and in excruciating detail in the grammar.

The acceptance testing suite also holds many usage examples.

Usage

Go into your git-versioned project's directory:

cd <some git versioned project with commits using /spend directives>

and run:

git spend sum

2 days 1 hour 42 minutes

Or run git-spend from anywhere, but specify the --target directory (which defaults to .):

git spend sum --target <some git versioned project dir>

2 days 1 hour 42 minutes

⛑ Use git spend sum --help or man git-spend-sum to see all the options. Meanwhile, let's look at some available options, below.

Format the output

You can get the spent time in a specific unit :

git spend sum --minutes
git spend sum --hours
git spend sum --days

These values will always be rounded to integers, for convenience, although git-spend does understand floating point numbers in /spend directives.

Filter by commit authors

You can track the time of specified authors only, by name or email :

git spend sum --author Alice --author bob@email.net

Exclude merge commits

You can also exclude merge commits :

git spend sum --no-merges

Restrict to a range of commits

You can restrict to a range of commits, using a commit hash, a tag, or even HEAD~N.

git spend sum --since <ref> --until <ref>

For example, to get the time spent on the last 15 commits :

git spend sum --since HEAD~15

Or the time spent on a tag since previous tag :

git spend sum --since 0.1.0 --until 0.1.1

You can also use dates and datetimes, but remember to quote them if you specify the time:

git spend sum --since 2023-03-21
git spend sum --since "2023-03-21 13:37:00"

📅 Other supported time formats: RFC3339, RFC822, RFC850. If you need a specific timezone, try setting the TZ environment variable: TZ="Europe/Paris" git-spend sum --since 2023-03-21

Download

Direct download

You can ⮋ download the binary straight from the latest build in the releases, and move it anywhere in your $PATH, such as /usr/local/bin/git-spend for example.

⚠ Remember to enable the execution bit with chmod u+x ./git-spend, for example.

There is an experimental install script that does exactly this, plus man pages generation:

curl https://raw.githubusercontent.com/Goutte/git-spend/main/install.sh | sh

🐧 This script only works for linux/amd64, for now. Stigmergy?

Via go get

You can also install via go get (hopefully) :

go get -u github.com/goutte/git-spend

or go install:

go install github.com/goutte/git-spend

If that fails, you can install by cloning and running make install.

Advanced Usage

Read from standard input

You can also directly parse messages from stdin instead of attempting to read the git log:

git log > git.log
cat git.log | git-spend sum --stdin

git spend ignores standard input otherwise.

Configure the time modulo

If you live somewhere where work hours per week are limited (to 35 for example) in order to mitigate labor oppression tactics from monopoly hoarders, you can use environment variables to control how time is "rolled over" between units :

GIT_SPEND_HOURS_PER_DAY=7 git-spend sum

Here are the available environment variables :

  • GIT_SPEND_MINUTES_PER_HOUR (default: 60)
  • GIT_SPEND_HOURS_PER_DAY (default: 8)
  • GIT_SPEND_DAYS_PER_WEEK (default: 5)
  • GIT_SPEND_WEEKS_PER_MONTH (default: 4)

Install the man pages

If you installed via direct download, you might want to install the man pages:

sudo git spend man --install

git help spend will then work as expected.

Develop

First, you'll need to install Golang.

git clone https://github.com/Goutte/git-spend.git
cd git-spend
go get
go run main.go

Build & Run & Install

The binaries in the releases are built by our Continuous Integration.

Nevertheless, if you want to build your own git-spend, you can clone this project and run:

make
make install

upx is used to reduce the binary size in make install-release.


You can compare the checksums, and they should be the same unless microsoft is being naughty.

Build for other platforms

You may use the GOOS and GOARCH environment variables to control the build targets:

GOOS=<target-OS> GOARCH=<target-architecture> go build -o build/git-spend .

To list available targets (os/arch), you can run:

go tool dist list

There's an example in the Makefile, with the recipe make build-windows-amd64.

Contribute

Merge requests are welcome. Make sure you record the time you /spend in your commit messages. :)

Translations

Translations files are in locale/*.toml. To add another language, add a new file, some sugar, some water, and … voilà !

Ideas Stash

You can pick and start any, or do something else entirely. If you don't like any of these, please voice your concerns as early as possible.

  • curl install.sh | sudo sh(ongoing, wider support needed)
  • i18n (ongoing, cobra forked)
  • git-spend sum --format <custom format>
  • git-spend sum --short1d3h27m
  • git-spend chrono start → start an internal chronometer
  • git-spend chrono add → add time to the chronometer
  • Rewriting of /spend chrono [± <duration>] by commit hook
  • Rewriting of /spend <ref> [± <duration>] by commit hook 🌟
  • git spend hook --install to install git hooks for rewriting
  • git spend hook --remove to remove installed git hooks
  • git-spend amend <duration> → amend previous commit with /spend <duration>
  • git-spend amend --add <duration> → same but adds
  • git-spend amend --subtract <duration> → same but subtracts (alias: --sub ?)
  • docker (docker run git-spend -- awkward? ; would need a volume)
  • flatpak perhaps (road blocked, see packaging/)
  • Right-To-Left (ساعد)

About

Sum the time-tracking "/spend" commands of commit messages.

Topics

Resources

Stars

15 stars

Watchers

1 watching

Forks

Releases

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

git-spend : time tracker using git commit message commands

MITReleaseBuild StatusCoverageA+Code QualityDownload

Purpose

Collect, addition and return all the /spend and /spent time-tracking directives in git commit messages.

This looks at the git log of the currently checked out branch of the working directory, and therefore requires git to be installed on your system.

TLDR; JUST DOWNLOAD LINUX/MACDOWNLOAD WINDOWS

By Example

Say you are in the directory of a project with one commit like so :

feat(crunch): implement a nice feature
Careful, it's still sharp.
/spend 10h30

Running:

$ git spend sum

would yield:

1 day 2 hours 30 minutes

Of course, git-spend really shines when you have multiple commits with /spend commands that you want to tally and sum.

💡 You can use git-spend sum or git spend sum, they are equivalent.

Specifications

We assume 8 hours per day, 5 days per week, 4 weeks per month. (like Gitlab does) These can be configured at runtime if needed, using environment variables.

The complete specification can be found in the rules of the test data, and in excruciating detail in the grammar.

The acceptance testing suite also holds many usage examples.

Usage

Go into your git-versioned project's directory:

cd <some git versioned project with commits using /spend directives>

and run:

git spend sum

2 days 1 hour 42 minutes

Or run git-spend from anywhere, but specify the --target directory (which defaults to .):

git spend sum --target <some git versioned project dir>

2 days 1 hour 42 minutes

⛑ Use git spend sum --help or man git-spend-sum to see all the options. Meanwhile, let's look at some available options, below.

Format the output

You can get the spent time in a specific unit :

git spend sum --minutes
git spend sum --hours
git spend sum --days

These values will always be rounded to integers, for convenience, although git-spend does understand floating point numbers in /spend directives.

Filter by commit authors

You can track the time of specified authors only, by name or email :

git spend sum --author Alice --author bob@email.net

Exclude merge commits

You can also exclude merge commits :

git spend sum --no-merges

Restrict to a range of commits

You can restrict to a range of commits, using a commit hash, a tag, or even HEAD~N.

git spend sum --since <ref> --until <ref>

For example, to get the time spent on the last 15 commits :

git spend sum --since HEAD~15

Or the time spent on a tag since previous tag :

git spend sum --since 0.1.0 --until 0.1.1

You can also use dates and datetimes, but remember to quote them if you specify the time:

git spend sum --since 2023-03-21
git spend sum --since "2023-03-21 13:37:00"

📅 Other supported time formats: RFC3339, RFC822, RFC850. If you need a specific timezone, try setting the TZ environment variable: TZ="Europe/Paris" git-spend sum --since 2023-03-21

Download

Direct download

You can ⮋ download the binary straight from the latest build in the releases, and move it anywhere in your $PATH, such as /usr/local/bin/git-spend for example.

⚠ Remember to enable the execution bit with chmod u+x ./git-spend, for example.

There is an experimental install script that does exactly this, plus man pages generation:

curl https://raw.githubusercontent.com/Goutte/git-spend/main/install.sh | sh

🐧 This script only works for linux/amd64, for now. Stigmergy?

Via go get

You can also install via go get (hopefully) :

go get -u github.com/goutte/git-spend

or go install:

go install github.com/goutte/git-spend

If that fails, you can install by cloning and running make install.

Advanced Usage

Read from standard input

You can also directly parse messages from stdin instead of attempting to read the git log:

git log > git.log
cat git.log | git-spend sum --stdin

git spend ignores standard input otherwise.

Configure the time modulo

If you live somewhere where work hours per week are limited (to 35 for example) in order to mitigate labor oppression tactics from monopoly hoarders, you can use environment variables to control how time is "rolled over" between units :

GIT_SPEND_HOURS_PER_DAY=7 git-spend sum

Here are the available environment variables :

  • GIT_SPEND_MINUTES_PER_HOUR (default: 60)
  • GIT_SPEND_HOURS_PER_DAY (default: 8)
  • GIT_SPEND_DAYS_PER_WEEK (default: 5)
  • GIT_SPEND_WEEKS_PER_MONTH (default: 4)

Install the man pages

If you installed via direct download, you might want to install the man pages:

sudo git spend man --install

git help spend will then work as expected.

Develop

First, you'll need to install Golang.

git clone https://github.com/Goutte/git-spend.git
cd git-spend
go get
go run main.go

Build & Run & Install

The binaries in the releases are built by our Continuous Integration.

Nevertheless, if you want to build your own git-spend, you can clone this project and run:

make
make install

upx is used to reduce the binary size in make install-release.


You can compare the checksums, and they should be the same unless microsoft is being naughty.

Build for other platforms

You may use the GOOS and GOARCH environment variables to control the build targets:

GOOS=<target-OS> GOARCH=<target-architecture> go build -o build/git-spend .

To list available targets (os/arch), you can run:

go tool dist list

There's an example in the Makefile, with the recipe make build-windows-amd64.

Contribute

Merge requests are welcome. Make sure you record the time you /spend in your commit messages. :)

Translations

Translations files are in locale/*.toml. To add another language, add a new file, some sugar, some water, and … voilà !

Ideas Stash

You can pick and start any, or do something else entirely. If you don't like any of these, please voice your concerns as early as possible.

  • curl install.sh | sudo sh(ongoing, wider support needed)
  • i18n (ongoing, cobra forked)
  • git-spend sum --format <custom format>
  • git-spend sum --short1d3h27m
  • git-spend chrono start → start an internal chronometer
  • git-spend chrono add → add time to the chronometer
  • Rewriting of /spend chrono [± <duration>] by commit hook
  • Rewriting of /spend <ref> [± <duration>] by commit hook 🌟
  • git spend hook --install to install git hooks for rewriting
  • git spend hook --remove to remove installed git hooks
  • git-spend amend <duration> → amend previous commit with /spend <duration>
  • git-spend amend --add <duration> → same but adds
  • git-spend amend --subtract <duration> → same but subtracts (alias: --sub ?)
  • docker (docker run git-spend -- awkward? ; would need a volume)
  • flatpak perhaps (road blocked, see packaging/)
  • Right-To-Left (ساعد)

About

Sum the time-tracking "/spend" commands of commit messages.

Topics

Resources

Stars

15 stars

Watchers

1 watching

Forks

Releases

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

git-spend : time tracker using git commit message commands

MITReleaseBuild StatusCoverageA+Code QualityDownload

Purpose

Collect, addition and return all the /spend and /spent time-tracking directives in git commit messages.

This looks at the git log of the currently checked out branch of the working directory, and therefore requires git to be installed on your system.

TLDR; JUST DOWNLOAD LINUX/MACDOWNLOAD WINDOWS

By Example

Say you are in the directory of a project with one commit like so :

feat(crunch): implement a nice feature
Careful, it's still sharp.
/spend 10h30

Running:

$ git spend sum

would yield:

1 day 2 hours 30 minutes

Of course, git-spend really shines when you have multiple commits with /spend commands that you want to tally and sum.

💡 You can use git-spend sum or git spend sum, they are equivalent.

Specifications

We assume 8 hours per day, 5 days per week, 4 weeks per month. (like Gitlab does) These can be configured at runtime if needed, using environment variables.

The complete specification can be found in the rules of the test data, and in excruciating detail in the grammar.

The acceptance testing suite also holds many usage examples.

Usage

Go into your git-versioned project's directory:

cd <some git versioned project with commits using /spend directives>

and run:

git spend sum

2 days 1 hour 42 minutes

Or run git-spend from anywhere, but specify the --target directory (which defaults to .):

git spend sum --target <some git versioned project dir>

2 days 1 hour 42 minutes

⛑ Use git spend sum --help or man git-spend-sum to see all the options. Meanwhile, let's look at some available options, below.

Format the output

You can get the spent time in a specific unit :

git spend sum --minutes
git spend sum --hours
git spend sum --days

These values will always be rounded to integers, for convenience, although git-spend does understand floating point numbers in /spend directives.

Filter by commit authors

You can track the time of specified authors only, by name or email :

git spend sum --author Alice --author bob@email.net

Exclude merge commits

You can also exclude merge commits :

git spend sum --no-merges

Restrict to a range of commits

You can restrict to a range of commits, using a commit hash, a tag, or even HEAD~N.

git spend sum --since <ref> --until <ref>

For example, to get the time spent on the last 15 commits :

git spend sum --since HEAD~15

Or the time spent on a tag since previous tag :

git spend sum --since 0.1.0 --until 0.1.1

You can also use dates and datetimes, but remember to quote them if you specify the time:

git spend sum --since 2023-03-21
git spend sum --since "2023-03-21 13:37:00"

📅 Other supported time formats: RFC3339, RFC822, RFC850. If you need a specific timezone, try setting the TZ environment variable: TZ="Europe/Paris" git-spend sum --since 2023-03-21

Download

Direct download

You can ⮋ download the binary straight from the latest build in the releases, and move it anywhere in your $PATH, such as /usr/local/bin/git-spend for example.

⚠ Remember to enable the execution bit with chmod u+x ./git-spend, for example.

There is an experimental install script that does exactly this, plus man pages generation:

curl https://raw.githubusercontent.com/Goutte/git-spend/main/install.sh | sh

🐧 This script only works for linux/amd64, for now. Stigmergy?

Via go get

You can also install via go get (hopefully) :

go get -u github.com/goutte/git-spend

or go install:

go install github.com/goutte/git-spend

If that fails, you can install by cloning and running make install.

Advanced Usage

Read from standard input

You can also directly parse messages from stdin instead of attempting to read the git log:

git log > git.log
cat git.log | git-spend sum --stdin

git spend ignores standard input otherwise.

Configure the time modulo

If you live somewhere where work hours per week are limited (to 35 for example) in order to mitigate labor oppression tactics from monopoly hoarders, you can use environment variables to control how time is "rolled over" between units :

GIT_SPEND_HOURS_PER_DAY=7 git-spend sum

Here are the available environment variables :

  • GIT_SPEND_MINUTES_PER_HOUR (default: 60)
  • GIT_SPEND_HOURS_PER_DAY (default: 8)
  • GIT_SPEND_DAYS_PER_WEEK (default: 5)
  • GIT_SPEND_WEEKS_PER_MONTH (default: 4)

Install the man pages

If you installed via direct download, you might want to install the man pages:

sudo git spend man --install

git help spend will then work as expected.

Develop

First, you'll need to install Golang.

git clone https://github.com/Goutte/git-spend.git
cd git-spend
go get
go run main.go

Build & Run & Install

The binaries in the releases are built by our Continuous Integration.

Nevertheless, if you want to build your own git-spend, you can clone this project and run:

make
make install

upx is used to reduce the binary size in make install-release.


You can compare the checksums, and they should be the same unless microsoft is being naughty.

Build for other platforms

You may use the GOOS and GOARCH environment variables to control the build targets:

GOOS=<target-OS> GOARCH=<target-architecture> go build -o build/git-spend .

To list available targets (os/arch), you can run:

go tool dist list

There's an example in the Makefile, with the recipe make build-windows-amd64.

Contribute

Merge requests are welcome. Make sure you record the time you /spend in your commit messages. :)

Translations

Translations files are in locale/*.toml. To add another language, add a new file, some sugar, some water, and … voilà !

Ideas Stash

You can pick and start any, or do something else entirely. If you don't like any of these, please voice your concerns as early as possible.

  • curl install.sh | sudo sh(ongoing, wider support needed)
  • i18n (ongoing, cobra forked)
  • git-spend sum --format <custom format>
  • git-spend sum --short1d3h27m
  • git-spend chrono start → start an internal chronometer
  • git-spend chrono add → add time to the chronometer
  • Rewriting of /spend chrono [± <duration>] by commit hook
  • Rewriting of /spend <ref> [± <duration>] by commit hook 🌟
  • git spend hook --install to install git hooks for rewriting
  • git spend hook --remove to remove installed git hooks
  • git-spend amend <duration> → amend previous commit with /spend <duration>
  • git-spend amend --add <duration> → same but adds
  • git-spend amend --subtract <duration> → same but subtracts (alias: --sub ?)
  • docker (docker run git-spend -- awkward? ; would need a volume)
  • flatpak perhaps (road blocked, see packaging/)
  • Right-To-Left (ساعد)

About

Sum the time-tracking "/spend" commands of commit messages.

Topics

Resources

Stars

15 stars

Watchers

1 watching

Forks

Releases

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

git-spend : time tracker using git commit message commands

MITReleaseBuild StatusCoverageA+Code QualityDownload

Purpose

Collect, addition and return all the /spend and /spent time-tracking directives in git commit messages.

This looks at the git log of the currently checked out branch of the working directory, and therefore requires git to be installed on your system.

TLDR; JUST DOWNLOAD LINUX/MACDOWNLOAD WINDOWS

By Example

Say you are in the directory of a project with one commit like so :

feat(crunch): implement a nice feature
Careful, it's still sharp.
/spend 10h30

Running:

$ git spend sum

would yield:

1 day 2 hours 30 minutes

Of course, git-spend really shines when you have multiple commits with /spend commands that you want to tally and sum.

💡 You can use git-spend sum or git spend sum, they are equivalent.

Specifications

We assume 8 hours per day, 5 days per week, 4 weeks per month. (like Gitlab does) These can be configured at runtime if needed, using environment variables.

The complete specification can be found in the rules of the test data, and in excruciating detail in the grammar.

The acceptance testing suite also holds many usage examples.

Usage

Go into your git-versioned project's directory:

cd <some git versioned project with commits using /spend directives>

and run:

git spend sum

2 days 1 hour 42 minutes

Or run git-spend from anywhere, but specify the --target directory (which defaults to .):

git spend sum --target <some git versioned project dir>

2 days 1 hour 42 minutes

⛑ Use git spend sum --help or man git-spend-sum to see all the options. Meanwhile, let's look at some available options, below.

Format the output

You can get the spent time in a specific unit :

git spend sum --minutes
git spend sum --hours
git spend sum --days

These values will always be rounded to integers, for convenience, although git-spend does understand floating point numbers in /spend directives.

Filter by commit authors

You can track the time of specified authors only, by name or email :

git spend sum --author Alice --author bob@email.net

Exclude merge commits

You can also exclude merge commits :

git spend sum --no-merges

Restrict to a range of commits

You can restrict to a range of commits, using a commit hash, a tag, or even HEAD~N.

git spend sum --since <ref> --until <ref>

For example, to get the time spent on the last 15 commits :

git spend sum --since HEAD~15

Or the time spent on a tag since previous tag :

git spend sum --since 0.1.0 --until 0.1.1

You can also use dates and datetimes, but remember to quote them if you specify the time:

git spend sum --since 2023-03-21
git spend sum --since "2023-03-21 13:37:00"

📅 Other supported time formats: RFC3339, RFC822, RFC850. If you need a specific timezone, try setting the TZ environment variable: TZ="Europe/Paris" git-spend sum --since 2023-03-21

Download

Direct download

You can ⮋ download the binary straight from the latest build in the releases, and move it anywhere in your $PATH, such as /usr/local/bin/git-spend for example.

⚠ Remember to enable the execution bit with chmod u+x ./git-spend, for example.

There is an experimental install script that does exactly this, plus man pages generation:

curl https://raw.githubusercontent.com/Goutte/git-spend/main/install.sh | sh

🐧 This script only works for linux/amd64, for now. Stigmergy?

Via go get

You can also install via go get (hopefully) :

go get -u github.com/goutte/git-spend

or go install:

go install github.com/goutte/git-spend

If that fails, you can install by cloning and running make install.

Advanced Usage

Read from standard input

You can also directly parse messages from stdin instead of attempting to read the git log:

git log > git.log
cat git.log | git-spend sum --stdin

git spend ignores standard input otherwise.

Configure the time modulo

If you live somewhere where work hours per week are limited (to 35 for example) in order to mitigate labor oppression tactics from monopoly hoarders, you can use environment variables to control how time is "rolled over" between units :

GIT_SPEND_HOURS_PER_DAY=7 git-spend sum

Here are the available environment variables :

  • GIT_SPEND_MINUTES_PER_HOUR (default: 60)
  • GIT_SPEND_HOURS_PER_DAY (default: 8)
  • GIT_SPEND_DAYS_PER_WEEK (default: 5)
  • GIT_SPEND_WEEKS_PER_MONTH (default: 4)

Install the man pages

If you installed via direct download, you might want to install the man pages:

sudo git spend man --install

git help spend will then work as expected.

Develop

First, you'll need to install Golang.

git clone https://github.com/Goutte/git-spend.git
cd git-spend
go get
go run main.go

Build & Run & Install

The binaries in the releases are built by our Continuous Integration.

Nevertheless, if you want to build your own git-spend, you can clone this project and run:

make
make install

upx is used to reduce the binary size in make install-release.


You can compare the checksums, and they should be the same unless microsoft is being naughty.

Build for other platforms

You may use the GOOS and GOARCH environment variables to control the build targets:

GOOS=<target-OS> GOARCH=<target-architecture> go build -o build/git-spend .

To list available targets (os/arch), you can run:

go tool dist list

There's an example in the Makefile, with the recipe make build-windows-amd64.

Contribute

Merge requests are welcome. Make sure you record the time you /spend in your commit messages. :)

Translations

Translations files are in locale/*.toml. To add another language, add a new file, some sugar, some water, and … voilà !

Ideas Stash

You can pick and start any, or do something else entirely. If you don't like any of these, please voice your concerns as early as possible.

  • curl install.sh | sudo sh(ongoing, wider support needed)
  • i18n (ongoing, cobra forked)
  • git-spend sum --format <custom format>
  • git-spend sum --short1d3h27m
  • git-spend chrono start → start an internal chronometer
  • git-spend chrono add → add time to the chronometer
  • Rewriting of /spend chrono [± <duration>] by commit hook
  • Rewriting of /spend <ref> [± <duration>] by commit hook 🌟
  • git spend hook --install to install git hooks for rewriting
  • git spend hook --remove to remove installed git hooks
  • git-spend amend <duration> → amend previous commit with /spend <duration>
  • git-spend amend --add <duration> → same but adds
  • git-spend amend --subtract <duration> → same but subtracts (alias: --sub ?)
  • docker (docker run git-spend -- awkward? ; would need a volume)
  • flatpak perhaps (road blocked, see packaging/)
  • Right-To-Left (ساعد)

About

Sum the time-tracking "/spend" commands of commit messages.

Topics

Resources

Stars

15 stars

Watchers

1 watching

Forks

Releases

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

git-spend : time tracker using git commit message commands

MITReleaseBuild StatusCoverageA+Code QualityDownload

Purpose

Collect, addition and return all the /spend and /spent time-tracking directives in git commit messages.

This looks at the git log of the currently checked out branch of the working directory, and therefore requires git to be installed on your system.

TLDR; JUST DOWNLOAD LINUX/MACDOWNLOAD WINDOWS

By Example

Say you are in the directory of a project with one commit like so :

feat(crunch): implement a nice feature
Careful, it's still sharp.
/spend 10h30

Running:

$ git spend sum

would yield:

1 day 2 hours 30 minutes

Of course, git-spend really shines when you have multiple commits with /spend commands that you want to tally and sum.

💡 You can use git-spend sum or git spend sum, they are equivalent.

Specifications

We assume 8 hours per day, 5 days per week, 4 weeks per month. (like Gitlab does) These can be configured at runtime if needed, using environment variables.

The complete specification can be found in the rules of the test data, and in excruciating detail in the grammar.

The acceptance testing suite also holds many usage examples.

Usage

Go into your git-versioned project's directory:

cd <some git versioned project with commits using /spend directives>

and run:

git spend sum

2 days 1 hour 42 minutes

Or run git-spend from anywhere, but specify the --target directory (which defaults to .):

git spend sum --target <some git versioned project dir>

2 days 1 hour 42 minutes

⛑ Use git spend sum --help or man git-spend-sum to see all the options. Meanwhile, let's look at some available options, below.

Format the output

You can get the spent time in a specific unit :

git spend sum --minutes
git spend sum --hours
git spend sum --days

These values will always be rounded to integers, for convenience, although git-spend does understand floating point numbers in /spend directives.

Filter by commit authors

You can track the time of specified authors only, by name or email :

git spend sum --author Alice --author bob@email.net

Exclude merge commits

You can also exclude merge commits :

git spend sum --no-merges

Restrict to a range of commits

You can restrict to a range of commits, using a commit hash, a tag, or even HEAD~N.

git spend sum --since <ref> --until <ref>

For example, to get the time spent on the last 15 commits :

git spend sum --since HEAD~15

Or the time spent on a tag since previous tag :

git spend sum --since 0.1.0 --until 0.1.1

You can also use dates and datetimes, but remember to quote them if you specify the time:

git spend sum --since 2023-03-21
git spend sum --since "2023-03-21 13:37:00"

📅 Other supported time formats: RFC3339, RFC822, RFC850. If you need a specific timezone, try setting the TZ environment variable: TZ="Europe/Paris" git-spend sum --since 2023-03-21

Download

Direct download

You can ⮋ download the binary straight from the latest build in the releases, and move it anywhere in your $PATH, such as /usr/local/bin/git-spend for example.

⚠ Remember to enable the execution bit with chmod u+x ./git-spend, for example.

There is an experimental install script that does exactly this, plus man pages generation:

curl https://raw.githubusercontent.com/Goutte/git-spend/main/install.sh | sh

🐧 This script only works for linux/amd64, for now. Stigmergy?

Via go get

You can also install via go get (hopefully) :

go get -u github.com/goutte/git-spend

or go install:

go install github.com/goutte/git-spend

If that fails, you can install by cloning and running make install.

Advanced Usage

Read from standard input

You can also directly parse messages from stdin instead of attempting to read the git log:

git log > git.log
cat git.log | git-spend sum --stdin

git spend ignores standard input otherwise.

Configure the time modulo

If you live somewhere where work hours per week are limited (to 35 for example) in order to mitigate labor oppression tactics from monopoly hoarders, you can use environment variables to control how time is "rolled over" between units :

GIT_SPEND_HOURS_PER_DAY=7 git-spend sum

Here are the available environment variables :

  • GIT_SPEND_MINUTES_PER_HOUR (default: 60)
  • GIT_SPEND_HOURS_PER_DAY (default: 8)
  • GIT_SPEND_DAYS_PER_WEEK (default: 5)
  • GIT_SPEND_WEEKS_PER_MONTH (default: 4)

Install the man pages

If you installed via direct download, you might want to install the man pages:

sudo git spend man --install

git help spend will then work as expected.

Develop

First, you'll need to install Golang.

git clone https://github.com/Goutte/git-spend.git
cd git-spend
go get
go run main.go

Build & Run & Install

The binaries in the releases are built by our Continuous Integration.

Nevertheless, if you want to build your own git-spend, you can clone this project and run:

make
make install

upx is used to reduce the binary size in make install-release.


You can compare the checksums, and they should be the same unless microsoft is being naughty.

Build for other platforms

You may use the GOOS and GOARCH environment variables to control the build targets:

GOOS=<target-OS> GOARCH=<target-architecture> go build -o build/git-spend .

To list available targets (os/arch), you can run:

go tool dist list

There's an example in the Makefile, with the recipe make build-windows-amd64.

Contribute

Merge requests are welcome. Make sure you record the time you /spend in your commit messages. :)

Translations

Translations files are in locale/*.toml. To add another language, add a new file, some sugar, some water, and … voilà !

Ideas Stash

You can pick and start any, or do something else entirely. If you don't like any of these, please voice your concerns as early as possible.

  • curl install.sh | sudo sh(ongoing, wider support needed)
  • i18n (ongoing, cobra forked)
  • git-spend sum --format <custom format>
  • git-spend sum --short1d3h27m
  • git-spend chrono start → start an internal chronometer
  • git-spend chrono add → add time to the chronometer
  • Rewriting of /spend chrono [± <duration>] by commit hook
  • Rewriting of /spend <ref> [± <duration>] by commit hook 🌟
  • git spend hook --install to install git hooks for rewriting
  • git spend hook --remove to remove installed git hooks
  • git-spend amend <duration> → amend previous commit with /spend <duration>
  • git-spend amend --add <duration> → same but adds
  • git-spend amend --subtract <duration> → same but subtracts (alias: --sub ?)
  • docker (docker run git-spend -- awkward? ; would need a volume)
  • flatpak perhaps (road blocked, see packaging/)
  • Right-To-Left (ساعد)

About

Sum the time-tracking "/spend" commands of commit messages.

Topics

Resources

Stars

15 stars

Watchers

1 watching

Forks

Releases

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

git-spend : time tracker using git commit message commands

MITReleaseBuild StatusCoverageA+Code QualityDownload

Purpose

Collect, addition and return all the /spend and /spent time-tracking directives in git commit messages.

This looks at the git log of the currently checked out branch of the working directory, and therefore requires git to be installed on your system.

TLDR; JUST DOWNLOAD LINUX/MACDOWNLOAD WINDOWS

By Example

Say you are in the directory of a project with one commit like so :

feat(crunch): implement a nice feature
Careful, it's still sharp.
/spend 10h30

Running:

$ git spend sum

would yield:

1 day 2 hours 30 minutes

Of course, git-spend really shines when you have multiple commits with /spend commands that you want to tally and sum.

💡 You can use git-spend sum or git spend sum, they are equivalent.

Specifications

We assume 8 hours per day, 5 days per week, 4 weeks per month. (like Gitlab does) These can be configured at runtime if needed, using environment variables.

The complete specification can be found in the rules of the test data, and in excruciating detail in the grammar.

The acceptance testing suite also holds many usage examples.

Usage

Go into your git-versioned project's directory:

cd <some git versioned project with commits using /spend directives>

and run:

git spend sum

2 days 1 hour 42 minutes

Or run git-spend from anywhere, but specify the --target directory (which defaults to .):

git spend sum --target <some git versioned project dir>

2 days 1 hour 42 minutes

⛑ Use git spend sum --help or man git-spend-sum to see all the options. Meanwhile, let's look at some available options, below.

Format the output

You can get the spent time in a specific unit :

git spend sum --minutes
git spend sum --hours
git spend sum --days

These values will always be rounded to integers, for convenience, although git-spend does understand floating point numbers in /spend directives.

Filter by commit authors

You can track the time of specified authors only, by name or email :

git spend sum --author Alice --author bob@email.net

Exclude merge commits

You can also exclude merge commits :

git spend sum --no-merges

Restrict to a range of commits

You can restrict to a range of commits, using a commit hash, a tag, or even HEAD~N.

git spend sum --since <ref> --until <ref>

For example, to get the time spent on the last 15 commits :

git spend sum --since HEAD~15

Or the time spent on a tag since previous tag :

git spend sum --since 0.1.0 --until 0.1.1

You can also use dates and datetimes, but remember to quote them if you specify the time:

git spend sum --since 2023-03-21
git spend sum --since "2023-03-21 13:37:00"

📅 Other supported time formats: RFC3339, RFC822, RFC850. If you need a specific timezone, try setting the TZ environment variable: TZ="Europe/Paris" git-spend sum --since 2023-03-21

Download

Direct download

You can ⮋ download the binary straight from the latest build in the releases, and move it anywhere in your $PATH, such as /usr/local/bin/git-spend for example.

⚠ Remember to enable the execution bit with chmod u+x ./git-spend, for example.

There is an experimental install script that does exactly this, plus man pages generation:

curl https://raw.githubusercontent.com/Goutte/git-spend/main/install.sh | sh

🐧 This script only works for linux/amd64, for now. Stigmergy?

Via go get

You can also install via go get (hopefully) :

go get -u github.com/goutte/git-spend

or go install:

go install github.com/goutte/git-spend

If that fails, you can install by cloning and running make install.

Advanced Usage

Read from standard input

You can also directly parse messages from stdin instead of attempting to read the git log:

git log > git.log
cat git.log | git-spend sum --stdin

git spend ignores standard input otherwise.

Configure the time modulo

If you live somewhere where work hours per week are limited (to 35 for example) in order to mitigate labor oppression tactics from monopoly hoarders, you can use environment variables to control how time is "rolled over" between units :

GIT_SPEND_HOURS_PER_DAY=7 git-spend sum

Here are the available environment variables :

  • GIT_SPEND_MINUTES_PER_HOUR (default: 60)
  • GIT_SPEND_HOURS_PER_DAY (default: 8)
  • GIT_SPEND_DAYS_PER_WEEK (default: 5)
  • GIT_SPEND_WEEKS_PER_MONTH (default: 4)

Install the man pages

If you installed via direct download, you might want to install the man pages:

sudo git spend man --install

git help spend will then work as expected.

Develop

First, you'll need to install Golang.

git clone https://github.com/Goutte/git-spend.git
cd git-spend
go get
go run main.go

Build & Run & Install

The binaries in the releases are built by our Continuous Integration.

Nevertheless, if you want to build your own git-spend, you can clone this project and run:

make
make install

upx is used to reduce the binary size in make install-release.


You can compare the checksums, and they should be the same unless microsoft is being naughty.

Build for other platforms

You may use the GOOS and GOARCH environment variables to control the build targets:

GOOS=<target-OS> GOARCH=<target-architecture> go build -o build/git-spend .

To list available targets (os/arch), you can run:

go tool dist list

There's an example in the Makefile, with the recipe make build-windows-amd64.

Contribute

Merge requests are welcome. Make sure you record the time you /spend in your commit messages. :)

Translations

Translations files are in locale/*.toml. To add another language, add a new file, some sugar, some water, and … voilà !

Ideas Stash

You can pick and start any, or do something else entirely. If you don't like any of these, please voice your concerns as early as possible.

  • curl install.sh | sudo sh(ongoing, wider support needed)
  • i18n (ongoing, cobra forked)
  • git-spend sum --format <custom format>
  • git-spend sum --short1d3h27m
  • git-spend chrono start → start an internal chronometer
  • git-spend chrono add → add time to the chronometer
  • Rewriting of /spend chrono [± <duration>] by commit hook
  • Rewriting of /spend <ref> [± <duration>] by commit hook 🌟
  • git spend hook --install to install git hooks for rewriting
  • git spend hook --remove to remove installed git hooks
  • git-spend amend <duration> → amend previous commit with /spend <duration>
  • git-spend amend --add <duration> → same but adds
  • git-spend amend --subtract <duration> → same but subtracts (alias: --sub ?)
  • docker (docker run git-spend -- awkward? ; would need a volume)
  • flatpak perhaps (road blocked, see packaging/)
  • Right-To-Left (ساعد)

About

Sum the time-tracking "/spend" commands of commit messages.

Topics

Resources

Stars

15 stars

Watchers

1 watching

Forks

Releases

Used by

Contributors

Languages