Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Tool for smooth git handover.

License

NotificationsYou must be signed in to change notification settings

remotemobprogramming/mob

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

mob Logo

Test WorkflowContributorsDownloadsDownloads of latestStarsSlack Status

#StandWithUkrainedonate here #StandWithUkraine

Fastgit handover for remote pair/mob programming.

diagram how mob works

What people say about mob

Sometimes you come across a tool that you didn't realize you needed until you do; mob is just such a tool. Living as we do in a world where remote pair programming has become the norm for many teams, having a tool that allows for seamless handover either between pairs or a wider group as part of a mob programming session is super useful. mob hides all the version control paraphernalia behind a command-line interface that makes participating in mob programming sessions simpler. It also provides specific advice around how to participate remotely, for example, to "steal the screenshare" in Zoom rather than ending a screenshare, ensuring the video layout doesn't change for participants. A useful tool and thoughtful advice, what's not to like? —Technology RadarVolume 25, thoughtworks

"Mob has allowed us to run fast-paced, engaging, and effective sessions by enabling sub-10-second handover times and otherwise getting out of the way. A simple but great tool!" —Jeff Langr, developer

"I love it, it is a quantum leap in our collaboration." — Vasiliy Sivovolov, Senior Software Engineer

"What a great tool to organise remote working." —Jennifer Gommans, IT Consultant

"I was recently introduced tomob.sh for remote pairing/mobbing collaboration and I absolutely love it. The timer feature is really a selling point for me. Kudos" —Fabien Illert, IT Consultant

How to install

The recommended way to install mob is as a binary via the provided install script:

# Works for macOS, Linux, and even on Windows in Git Bashcurl -sL install.mob.sh| sh

On macOS via Homebrew:

brew install mob

On Windows viaScoop:

scoop install mob

or viaChocolatey:

choco install mob

On Arch Linux via yay:

yay -S mobsh-bin

OnNix through declarative installation:

{pkgs, ...}:{# Either for all usersenvironment.systemPackages=withpkgs;[mob];# Or for an explicit userusers.users."youruser".packages=withpkgs;[mob];}

On NetBSD, macOS, SmartOS, Linux, FreeBSD, OpenBSD, and more, viapkgsrc:

# If there's a binary package for your platformpkgin install mob# Otherwise, for any platformcd pkgsrc/devel/mob&& bmake install clean

On Ubuntu there's an EXPERIMENTALsnap package with a known limitation (ssh-agent not working):

sudo snap install mob-shsudo snap connect mob-sh:ssh-keys

Using go tools

If you have go 1.20+ you can install and build directly from source:

go install github.com/remotemobprogramming/mob/v4@latest

or pick a specific version:

go install github.com/remotemobprogramming/mob/v4@v4.4.0

or to install latest unreleased changes:

go install github.com/remotemobprogramming/mob/v4@main

How to use

You only need three commands:mob start,mob next, andmob done.

Switch to a separate branch withmob start and handover to the next person withmob next.Repeat.When you're done, get your changes into the staging area of themain branch withmob done and commit them.

asciicast

Here's a short example on how the two developers Carola and Maria code a feature together and push it in the end.

# Carolamain $ mob startmob/main $echo"hello"> work.txtmob/main $ mob next# Mariamain $ mob startmob/main $ cat work.txt# shows "hello"mob/main $echo" world">> work.txtmob/main $ mob next# Carolamob/main $ mob startmob/main $ cat work.txt# shows "hello world"mob/main $echo"!">> work.txtmob/main $ mobdonemain $ git commit -m"create greeting file"main $ git push

And here's the man page of the tool:

mob enables a smooth Git handoverBasic Commands:  start              start session from base branch in wip branch  next               handover changes in wip branch to next person  done               squashes all changes in wip branch to index in base branch  reset              removes local and remote wip branch  clean              removes all orphan wip branchesBasic Commands(Options):  start [<minutes>]                      Start a <minutes> timer    [--include-uncommitted-changes|-i]   Move uncommitted changes to wip branch    [--discard-uncommitted-changes|-d]   Discard uncommitted changes    [--branch|-b <branch-postfix>]       Set wip branch to 'mob/<base-branch>-<branch-postfix>'    [--create|-c]                        Create the remote branch    [--room <room-name>]                 Set room name for timer.mob.sh once  next    [--stay|-s]                          Stay on wip branch (default)    [--return-to-base-branch|-r]         Return to base branch    [--message|-m <commit-message>]      Override commit message  done    [--no-squash]                        Squash no commits from wip branch, only merge wip branch    [--squash]                           Squash all commits from wip branch    [--squash-wip]                       Squash wip commits from wip branch, maintaining manual commits  reset    [--branch|-b <branch-postfix>]       Set wip branch to 'mob/<base-branch>/<branch-postfix>'  goal                                   Gives you the current goal of your timer.mob.sh room    [<your-goal>]                        Sets the goal of your timer.mob.sh room    [--delete]                           Deletes the goal of your timer.mob.sh roomTimer Commands:  timer <minutes>           Start a <minutes> timer    [--room <room-name>]    Set room name for timer.mob.sh once  timer open                Opens the timer website    [--room <room-name>]    Set room name for timer.mob.sh once  start <minutes>           Start mob session in wip branch and a <minutes> timer  break <minutes>           Start a <minutes> break timer  goal                      Gives you the current goal of your timer.mob.sh room    [<your-goal>]           Sets the goal of your timer.mob.sh room    [--delete]              Deletes the goal of your timer.mob.sh roomShort Commands (Options and descriptions as above):  s                  alias for 'start'  n                  alias for 'next'  d                  alias for 'done'  b                  alias for 'branch'  t                  alias for 'timer'  g                  Alias for 'goal'Get more information:  status             show the status of the current session  fetch              fetch remote state  branch             show remote wip branches  config             show all configuration options  version            show the version  help               show helpOther  moo                moo!Add --debug to any option to enable verbose loggingExamples:  # start 10 min session in wip branch 'mob-session'  mob start 10  # start session in wip branch 'mob/<base-branch>/green'  mob start --branch green  # handover code and return to base branch  mob next --return-to-base-branch  # squashes all commits and puts changes in index of base branch  mob done  # make a sound check  mob moo

If you need some assistance when typing the subcommands and options, you might want to have a look atfig which gives you autocompletion in your shell.

Best Practices

  • Say out loud
    • Whenever you key inmob next at the end of your turn ormob start at the beginning of your turn say the command out loud.
    • Why? Everybody sees and also hears whose turn is ending and whose turn has started. But even more important, the person whose turn is about to start needs to know when the previous person enteredmob next so they get the latest commit via theirmob start.
  • Steal the screenshare
    • After your turn, don't disable the screenshare. Let the next person steal the screenshare. (Requires a setting in Zoom)
    • Why? This provides more calm (and less diversion) for the rest of the mob as the video conference layout doesn't change, allowing the rest of the mob to keep discussing the problem and finding the best solution, even during a Git handover.
  • Share audio
    • Share your audio when you share your screen.
    • Why? Sharing audio means everybody will hear when the timer is up. So everybody will help you to rotate, even if you have missed it coincidentally or deliberately.
  • Use a timer
    • Always specify a timer when usingmob start (for a 5 minute timer usemob start 5)
    • Why? Rotation is key to good pair and mob programming. Just build the habit right from the start. Try to set a timer so everybody can have a turn at least once every 30 minutes.
  • Set up a global shortcut for screensharing
  • Set your editor to autosave
    • Have your editor save your files on every keystroke automatically. IntelliJ products do this automatically. VS Code, however, needs to be configured via "File > Auto Save toggle".
    • Why? Sometimes people forget to save their files. With autosave, any change will be handed over viamob next.

The Perfect Git Handover

The perfect git handover is quick, requires no talking, and allows the rest of the team to continue discussing how to best solve the current problem undisturbed by the handover. Here's how to achieve that.

  • Situation Maria is typist sharing the screen, Mona is next
  • Maria runsmob next
    • keeps sharing the screen with the terminal showing the successful run ofmob next
    • does nothing (i.e., no typing, no mouse cursor movement, no window switching)
  • Mona steals screenshare using keyboard shortcut, and, afterwards, runsmob start
  • Maria checks her twitter

Complementary Scripts

mob-start feature1 creates a new base branchfeature1 to immediately start a wip branchmob/feature1 from there.

mob-start() { git checkout -b"$@"&& git push origin"$@" --set-upstream&& mob start --include-uncommitted-changes; }

Useful Aliases

alias ms='mob start'alias mn='mob next'alias md='mob done'alias moo='mob moo'

Use the name you like

mob version#v1.11.0alias ensemble='mob'# introduce aliasexport MOB_CLI_NAME='ensemble'# makes it aware of the aliasensemble next#👉 to start working together, use##  ensemble start#

And starting with v1.12.0,mob is symlink aware as well:

mob version#v1.12.0ln -s /usr/local/bin/mob /usr/local/bin/ensembleensemble next#👉 to start working together, use##  ensemble start#

Automatically set the timer room when using ticket numbers as branch modifiers

Say you're a larger team and work on the same git repository using ticket numbers as branch modifiers.It's easy to forget exporting the room that enables the integration with timer.mob.sh.Just set the configuration optionMOB_TIMER_ROOM_USE_WIP_BRANCH_QUALIFIER=true in~/.mob for that.

Automatically open the last modified file of the previous typist

When you are rotating the typist, you often need to open the file, which the previous typist has modified last.Mob supports you and can automate this step. You just need the configuration optionMOB_OPEN_COMMAND with the command to open a file in your preferred IDE.

For example if you want use IntelliJ the configuration option would look like this:MOB_OPEN_COMMAND="idea %s"

More on Installation

Known Issues

  • When you have an ssh key with a password and you running mob on windows in powershell, you will not be able to enter a password for your ssh key. You can circumvent this problem by using the git bash instead of powershell.

Linux Timer

(This is not needed when installing via snap.)

To get the timer to play "mob next" on your speakers when your time is up, you'll need an installed speech engine.Install that on Debian/Ubuntu/Mint as follows:

sudo apt-get install espeak-ng-espeak mbrola-us1

or on Arch Linux as follows:

sudo pacman -S espeak-ng-espeakyay -S mbrola-voices-us1

Create a little script in your$PATH calledsay with the following content:

#!/bin/shespeak -v us-mbrola-1"$@"

If you use WSL2 on windows, install eSpeak as windows tool and Create a little script in your$PATH calledsay with the following content:

#!/bin/sh/mnt/c/Program\Files\ \(x86\)/eSpeak/command_line/espeak.exe"$@"

make sure that the path to the windowsespeak.exefits your installation.You can avoid the long path by adding it to your windows path variable.

How to configure

Show your current configuration withmob config:

MOB_CLI_NAME="mob"MOB_DONE_SQUASH=squashMOB_GIT_HOOKS_ENABLED=falseMOB_NEXT_STAY=trueMOB_NOTIFY_COMMAND="/usr/bin/osascript -e 'display notification\"%s\"'"MOB_NOTIFY_MESSAGE="mob next"MOB_OPEN_COMMAND="idea %s"MOB_REMOTE_NAME="origin"MOB_REQUIRE_COMMIT_MESSAGE=falseMOB_SKIP_CI_PUSH_OPTION_ENABLED=trueMOB_START_COMMIT_MESSAGE="mob start [ci-skip] [ci skip] [skip ci]"MOB_START_CREATE=falseMOB_STASH_NAME="mob-stash-name"MOB_TIMER_LOCAL=trueMOB_TIMER_ROOM_USE_WIP_BRANCH_QUALIFIER=falseMOB_TIMER_ROOM="mob"MOB_TIMER_URL="https://timer.mob.sh/"MOB_TIMER_USER="sh"MOB_TIMER=""MOB_VOICE_COMMAND="say\"%s\""MOB_VOICE_MESSAGE="mob next"MOB_WIP_BRANCH_PREFIX="mob/"MOB_WIP_BRANCH_QUALIFIER_SEPARATOR="-"MOB_WIP_BRANCH_QUALIFIER=""MOB_WIP_COMMIT_MESSAGE="mob next [ci-skip] [ci skip] [skip ci]"

Override default value permanently via a.mob file in your user home or in your git project repository root. (recommended)

Override default value permanently via environment variables:

export MOB_NEXT_STAY=true

Override default value just for a single call:

MOB_NEXT_STAY=true mob next

Integration with timer.mob.sh

For your name to show up in the room at timer.mob.sh you must set a timer value either via theMOB_TIMER variable, a config file, or an argument tostart.

How to uninstall

Mob can simply be uninstalled by removing the installed binary (at least if it was installed via thehttp://install.mob.sh script).

Linux

rm /usr/local/bin/mob

Windows (Git Bash)

rm~/bin/mob.exe

MacOS

brew uninstall remotemobprogramming/brew/mob

How to contribute

Propose your change in an issue ordirectly create a pull request with your improvements.

# PROJECT_ROOT is the root of the project/repositorycd$PROJECT_ROOTgit version# >= 2.17go version# >= 1.15go build# builds 'mob'gotest# runs all testsgotest -run TestDetermineBranches# runs the single test named 'TestDetermineBranches'# run tests and show test coverage in browsergotest -coverprofile=cover.out&& go tool cover -html=cover.out

Design Concepts

  • mob is a thin wrapper around git.
  • mob is not interactive.
  • mob owns its wip branches. It will create wip branches, make commits, push them, but also delete them.
  • mob requires the user to do changes in non-wip branches.
  • mob provides a copy'n'paste solution if it encounters an error.
  • mob relies on information accessible via git.
  • mob provides only a few environment variables for configuration.
  • mob only uses the Go standard library and no 3rd party plugins.

Who is using 'mob'?

Credits

Created byDr. Simon Harrer in September 2018.

Currently maintained byGregor Riegler andJoshua Töpfer, and to some limited degree still byDr. Simon Harrer.

Contributions and testing by Jochen Christ, Martin Huber, Franziska Dessart, Nikolas Hermannand Christoph Welcz. Thank you!

Logo designed bySonja Scheungrab.

Legal Notice |Privacy

Sponsor this project

 

Packages

No packages published

Contributors95

Languages


[8]ページ先頭

©2009-2025 Movatter.jp