An open API service indexing awesome lists of open source software.

https://github.com/kejadlen/git-together

Better commit attribution while pairing without messing with your git workflow.
https://github.com/kejadlen/git-together

git mob pair

Last synced: 7 months ago
JSON representation

Better commit attribution while pairing without messing with your git workflow.

Awesome Lists containing this project

README

          

# git-together

![CI](https://github.com/kejadlen/git-together/workflows/CI/badge.svg)

Following in the footsteps of [git-pair][gp] and [git-duet][gd], but without
needing to change your existing git habits.

[gp]: https://github.com/pivotal/git_scripts
[gd]: https://github.com/git-duet/git-duet

## Installation

```bash
brew install kejadlen/git-together/git-together
```

## Configuration

Here's one way to configure `git-together`, but since it uses `git config` to
store information, there are many other ways to do it. This particular example
assumes a desire to store authors at the repo-level in a `.git-together` file.

```bash
# `git-together` is meant to be aliased as `git`
alias git=git-together

# Use .git-together per project for author configuration
git config --add include.path ../.git-together
# Or use one .git-together for all projects
git config --global --add include.path ~/.git-together

# Setting the default domain
git config --file .git-together --add git-together.domain rocinante.com

# Adding a couple authors
git config --file .git-together --add git-together.authors.jh 'James Holden; jholden'
git config --file .git-together --add git-together.authors.nn 'Naomi Nagata; nnagata'

# Adding an author with a different domain
git config --file .git-together --add git-together.authors.ca 'Chrisjen Avasarala; avasarala@un.gov'
```

For completion with zsh, you'll need to update your `.zshrc` to copy the existing completion rules
from the main git binary

```zsh
# initialize the compinit system if not already
autoload -U compinit
compinit

# tell zsh to use the completion setup for the git when using git-together
compdef git-together=git
```

## Usage

```bash
# Pairing
git with jh nn
# ...
git commit

# Soloing
git with nn
# ...
git commit

# Mobbing
git with jh nn ca
# ...
git commit
```

Soloing and mobbing are automatically set by the number of authors passed to
`git with`. `git-together` rotates authors by default after making a commit so
that the author/committer roles are fairly spread across the pair/mob over
time.

Aliases are supported as well. You can make git-together do its thing when you
use an alias for a committing command by configuring a comma-separated list of
aliases:

```bash
git config git-together.aliases ci,rv,m
# ...
git ci
```

By default, `git-together` sets and rotates pairs for a single local
repository. If you are working across multiple repos with a pair on a regular
basis, this can be difficult to set across all of them. The `--global` flag can
be passed along to set a global pair. `git-together` will still default to a
local repository, so if you'd like to reset from local to global, you can use
the `--clear` flag.

```bash
# Set for all repos
git with --global jh nn

# Override in single repo
git with nn

# Clear local and move back to global
git with --clear
```

## Technical Details

Because repo-level authors are common and there's no good way of configuring
`git config` on cloning a repo, `git-together` will automatically include
`.git-together` to `git config` if it exists. (See `GitConfig::auto_include`
for details.) This allows `git-together` to work immediately on cloning a repo
without manual configuration.

Under the hood, `git-together` sets `GIT_AUTHOR_NAME`, `GIT_AUTHOR_EMAIL`,
`GIT_COMMITTER_NAME`, and `GIT_COMMITTER_EMAIL` for the `commit`, `merge`, and
`revert` subcommands so that git commits have the correct attribution..
`git-together` also adds the `--signoff` argument to the `commit` and `revert`
subcommands so that the commit message includes the `Signed-off-by: ` line.

## Known Issues

`git-together` works by aliasing `git` itself, so there are going to be issues
with git's in-built aliases as well as other utilities (such as [Hub][hub])
that work in the same manner.

[hub]: https://hub.github.com/

## Development

### Rust version

Install rust using the [rustup][rustup] tool. Installing from homebrew won't work
because some nightly features of rust are needed to build.

Then, switch to the nightly with

```bash
rustup default nightly
```

### Bats

[Bats][bats] is a bash testing framework, used here for integration tests. This
can be installed with homebrew.

```bash
brew install bats
```

[rustup]: https://www.rustup.rs/
[bats]: https://github.com/sstephenson/bats

### Testing

```bash
cargo test
./bats/integration.bats
```