2015-02-09 14:34:08 +01:00
![](http://i.imgur.com/Q7TQYHx.png)
# `$ git-stats`
2015-01-26 09:08:11 +01:00
A GitHub-like contributions calendar, but locally, with all your git commits.
2015-02-16 13:37:44 +01:00
I'd be curious to see your calendar with all your commits. Ping me on Twitter ([**@IonicaBizau**](https://twitter.com/IonicaBizau)). :smile: Until then, here's my calendar:
2015-02-09 14:39:24 +01:00
![](http://i.imgur.com/LfLJAaE.png)
2015-01-26 09:08:11 +01:00
2015-02-15 19:51:33 +01:00
## Contents
2015-02-15 19:52:44 +01:00
- [Installation ](#installation )
- [Catching the `git commit` command ](#catching-the-git-commit-command )
- [Using `git` hooks ](#using-git-hooks )
- [Overriding the `git` command ](#overriding-the-git-command )
- [Usage ](#usage )
- [Importing and deleting commits ](#importing-and-deleting-commits )
- [Importing all the commits from GitHub and BitBucket ](#importing-all-the-commits-from-github-and-bitbucket )
- [See the GitHub Contributions calendar ](#see-the-github-contributions-calendar )
- [Documentation ](#documentation- )
- [How to contribute ](#how-to-contribute )
2015-02-15 19:51:33 +01:00
2015-02-09 14:39:24 +01:00
## Installation
2015-01-26 09:08:11 +01:00
```sh
2015-01-26 09:08:43 +01:00
$ npm install -g git-stats
2015-01-26 09:08:11 +01:00
```
2015-02-09 13:28:51 +01:00
### Catching the `git commit` command
2015-02-11 19:13:56 +01:00
Would you like to catch and automatically store the commits when you do `git commit` ? If so, try one of the following solutions.
2015-02-09 13:28:51 +01:00
2015-02-11 19:07:10 +01:00
#### Using `git` hooks
The way I recommend to track your git commits is to use git hooks. Run the following command to initialize the `post-commit` git hook.
```sh
# Using curl
2015-02-11 19:08:49 +01:00
curl -s https://raw.githubusercontent.com/IonicaBizau/git-stats/master/scripts/init-git-post-commit | bash
2015-02-11 19:07:10 +01:00
# ...or wget
2015-02-11 19:08:49 +01:00
wget -qO- https://raw.githubusercontent.com/IonicaBizau/git-stats/master/scripts/init-git-post-commit | bash
2015-02-11 19:07:10 +01:00
```
Then, you have to run `git init` into your existing git repositories from your local machine (that's because the `post-commit` should be updated). This
2015-02-15 19:20:49 +01:00
step will not be needed after cloning a repository (the git hooks will be added automatically from `~/.git-templates` ).
2015-02-11 19:07:10 +01:00
#### Overriding the `git` command
One of the solutions is becoming a mad scientist, overriding the `git` command with a function. However, this may not work for you if you're using `zsh` .
2015-02-11 19:13:56 +01:00
Add the following lines in your `~/.bashrc` (or `~/.bash_profile` on OS X) file:
2015-02-01 07:24:53 +01:00
```sh
2015-02-09 13:28:51 +01:00
# Override the Git command
2015-02-01 07:24:53 +01:00
git() {
cmd=$1
shift
extra=""
quoted_args=""
whitespace="[[:space:]]"
for i in "$@"
do
quoted_args="$quoted_args \"$i\""
done
cmdToRun="`which git` "$cmd" $quoted_args"
cmdToRun=`echo $cmdToRun | sed -e 's/^ *//' -e 's/ * $//'`
bash -c "$cmdToRun"
if [ $? -eq 0 ]; then
# Commit stats
if [ "$cmd" == "commit" ]; then
commit_hash=`git rev-parse HEAD`
repo_url=`git config --get remote.origin.url`
commit_date=`git log -1 --format=%cd`
commit_data="\"{ \"date\": \"$commit_date\", \"url\": \"$repo_url\", \"hash\": \"$commit_hash\" }\""
git-stats --record "$commit_data"
fi
fi
}
```
2015-02-09 13:36:44 +01:00
## Usage
2015-02-09 14:11:53 +01:00
```sh
$ git-stats --help
git-stats --help
A GitHub-like contributions calendar, but locally, with all your git commits.
usage: git-stats [start] [end] [options] [data]
start: Optional start date
end: Optional end date
options:
-v Displays version information.
-h --help Displays this help.
--no-ansi Doesn't use ANSI colors in the squares.
--record < data > Records a new commit. Don't use this unless you are
a mad scientist. If you are a developer, just use this
option as part of the module.
--light Enable the light theme.
examples:
git-stats # Displays your commit calendar
git-stats -v
git-stats -h
git-stats --light # Light mode
git-stats '1 January 2012' # All the commits from 1 January 2012, to now
git-stats '1 January 2012' '31 December 2012' # All the commits from 2012
2015-02-09 17:13:52 +01:00
Your commit history is kept in the .git-stats, in your $HOME directory (~/)
2015-02-09 14:11:53 +01:00
Documentation can be found at https://github.com/IonicaBizau/git-stats
```
2015-02-09 17:13:52 +01:00
If you override the `git` command with a function, then your commits will be automatically recorded.
2015-02-09 14:11:53 +01:00
### Importing and deleting commits
2015-02-09 17:13:52 +01:00
I know it's not nice to start your git commit calendar from scratch. That's why I
created a `git-stats-importer` that imports or deletes the commits from a repository.
2015-02-09 14:11:53 +01:00
Check it out here: https://github.com/IonicaBizau/git-stats-importer
The usage is simple:
```sh
# Install the importer tool
$ npm install -g git-stats-importer
# Go to the repository you want to import
$ cd path/to/my-repository
# Import the commits
$ git-stats-importer
# ...or delete them if that's a dummy repository
$ git-stats-importer --delete
```
### Importing all the commits from GitHub and BitBucket
2015-02-09 17:13:52 +01:00
Yes, you read correctly! That's also possible. I [built a tool for that too ](https://github.com/IonicaBizau/repository-downloader )!
2015-02-09 14:11:53 +01:00
```sh
# Download the repository downloader
2015-02-11 00:18:00 +01:00
$ git clone https://github.com/IonicaBizau/repository-downloader.git
2015-02-09 14:11:53 +01:00
# Go to repository downloader
$ cd repository-downloader
# Install the dependencies
$ npm install
# Start downloading and importing
$ ./start
```
2015-02-09 14:39:24 +01:00
### See the GitHub Contributions calendar
There is a solution for that, too! :smile: It's called [`ghcal` ](https://github.com/IonicaBizau/ghcal ).
```sh
# Install ghcal
$ npm install -g ghcal
# Checkout my contributions
$ ghcal ionicabizau
```
2015-02-15 19:20:49 +01:00
For more detailed documentation, check out the repository: https://github.com/IonicaBizau/ghcal.
2015-02-09 14:39:24 +01:00
2015-02-10 13:08:57 +01:00
## Documentation [![Inline docs](http://inch-ci.org/github/IonicaBizau/git-stats.svg?branch=master)](http://inch-ci.org/github/IonicaBizau/git-stats)
2015-02-09 17:13:52 +01:00
If you want to use this as a module, that is possible. See the content below.
2015-02-09 13:36:44 +01:00
2015-02-01 07:24:53 +01:00
### `record(data, callback)`
2015-01-26 09:08:11 +01:00
Records a new commit.
2015-02-01 07:24:53 +01:00
#### Params
2015-01-26 09:08:43 +01:00
- **Object** `data` : The commit data containing:
2015-02-09 14:14:10 +01:00
- `date` (String|Date): The date object or a string in a format that can be parsed.
2015-01-26 09:08:11 +01:00
- `url` (String): The repository remote url.
- `hash` (String): The commit hash.
- **Function** `callback` : The callback function.
2015-02-09 14:14:10 +01:00
#### Return
- **GitStats** The `GitStats` object.
### `get(callback)`
2015-01-26 09:08:11 +01:00
Gets the git stats.
2015-02-01 07:24:53 +01:00
#### Params
2015-01-26 09:08:11 +01:00
- **Function** `callback` : The callback function.
2015-02-09 14:14:10 +01:00
#### Return
- **GitStats** The `GitStats` object.
### `save(stats, callback)`
Saves the provided stats.
#### Params
- **Object** `stats` : The stats to be saved.
- **Function** `callback` : The callback function.
#### Return
- **GitStats** The `GitStats` object.
### `iterateDays(data, callback)`
2015-02-15 19:20:49 +01:00
Iterate through the days, calling the callback function on each day.
2015-02-09 14:14:10 +01:00
#### Params
- **Object** `data` : An object containing the following fields:
- `start` (Moment): A `Moment` date object representing the start date (default: *an year ago* ).
- `end` (Moment): A `Moment` date object representing the end date (default: *now* ).
- `format` (String): The format of the date (default: `"MMM D, YYYY"` ).
- **Function** `callback` : The callback function called with the current day formatted (type: string) and the `Moment` date object.
#### Return
- **GitStats** The `GitStats` object.
### `graph(data, callback)`
Creates an object with the stats on the provided period (default: *last year* ).
#### Params
- **Object** `data` : The object passed to the `iterateDays` method.
- **Function** `callback` : The callback function.
#### Return
- **GitStats** The `GitStats` object.
### `calendar(data, callback)`
Creates the calendar data for the provided period (default: *last year* ).
#### Params
- **Object** `data` : The object passed to the `graph` method.
- **Function** `callback` : The callback function.
#### Return
- **GitStats** The `GitStats` object.
### `ansiCalendar(data, callback)`
Creates the ANSI contributions calendar.
#### Params
- **Object** `data` : The object passed to the `calendar` method.
- **Function** `callback` : The callback function.
#### Return
- **GitStats** The `GitStats` object.
2015-01-26 09:08:11 +01:00
## How to contribute
1. File an issue in the repository, using the bug tracker, describing the
contribution you'd like to make. This will help us to get you started on the
right foot.
2. Fork the project in your account and create a new branch:
`your-great-feature` .
3. Commit your changes in that branch.
4. Open a pull request, and reference the initial issue in the pull request
message.
## License
See the [LICENSE ](./LICENSE ) file.