clowder - A group of cats
herding cats - An idiom that refers to a frustrating attempt to control or organize a class of entities which are uncontrollable or chaotic
Table of Contents
Why clowder
Managing multiple repositories can be pretty frustrating. There are a number of existing options, the primary being git submodules and subtrees. Google's repo tool takes a different approach, but is closely tied to Google's development workflow. clowder uses a similar approach as repo, but without the ties to Google's Android workflows. Information about projects is specified in a clowder.yml file. Projects can track branches, or be tied to specific tags or commits. This file can be checked into its own repository so it can be versioned and shared across teams. The primary purpose of clowder is synchronization of multiple repositories, so normal development still takes place in individual repositories with the usual git commands.
Installation
Requirements:
To install or upgrade clowder from PyPI:
sudo pip3 install clowder-repo --upgrade
To install the latest pre-release version:
sudo pip3 install clowder-repo --force-reinstall --pre
The clowder.yml file
name: my-first-clowder
defaults:
protocol: ssh
sources:
- name: github
url: github.com
projects:
- name: jrgoodle/mu
- name: jrgoodle/duke
- name: jrgoodle/kit
groups: [black-cats]
- name: jrgoodle/kishka
groups: [black-cats]
- name: jrgoodle/june
groups: [black-cats, notdefault]
- name: jrgoodle/sasha
groups: [black-cats, notdefault]
Syntax
For more information, see the clowder.yml syntax reference
name: my-first-clowder
The name is simply a descriptive identifier. It must be a string that doesn't contain any spaces
defaults:
protocol: ssh
The defaults section requires the protocol to use for cloning repositories. The default remote is assumed to be origin and the default branch is assumed to to be master
sources:
- name: github
url: github.com
The sources section contains all the locations to clone repositories from.
projects:
- name: jrgoodle/mu
- name: jrgoodle/duke
- name: jrgoodle/kit
groups: [black-cats]
- name: jrgoodle/kishka
groups: [black-cats]
- name: jrgoodle/june
groups: [black-cats, notdefault]
- name: jrgoodle/sasha
groups: [black-cats, notdefault]
A project requires at minimum the name of the repository. This is combined with defaults.protocol or sources.protocol to form the full url for cloning the repository, taking the form of git@${sources.url}:${projects.name}.git or https://${sources.url}/${projects.name}.git, depending on the protocol specified. If no path is specified, the last component of the name is used for the directory the project is cloned to. Projects can specify custom groups in order to run commands for only certain projects. By default, all projects are added to the all group, and a group of their name and path. If notdefault is present, then the project will not be included in commands unless another group argument is given that it belongs to.
There's much more cusomization possible with clowder. For some more complex examples see:
Command Usage
For more information, see the commands doc
First create a directory where all the projects will be cloned:
mkdir cats
cd cats
It's possible to just create a local clowder.yml file, but it's recommended to check the file into the root of a dedicated repository. These examples use an existing repository containing a clowder.yml file.
clowder init
clowder init git@github.com:JrGoodle/clowder-examples.git
The clowder init command does the following:
- Clones the examples clowder repo in the
cats/.clowderdirectory - Creates a symlink in the
catsdirectory:clowder.yml->.clowder/clowder.yml

clowder herd
The clowder herd command updates the state of the projects. When the command is run, the following happens:
- If any projects don't have a clean git status then
clowderexits - Projects are cloned if they don't currently exist
- Each project fetches the latest changes
- If the current git ref checked out doesn't match the
clowder.ymlconfiguration, the correct ref will be checked out - The latest changes are pulled for branches. For commits and tags, the commits are checked out into a detached
HEADstate

clowder status
The clowder status command prints the current state of all projects.

clowder forall
clowder forall -c 'git status' # Run command in all project directories
git commands
For more information, see the commands doc
clowder branch # Print all local branches
clowder checkout 'my_branch' # Checkout 'my_branch' in projects if it exists
clowder clean # Discard any changes in projects
clowder diff # Print git diff for all projects
clowder start 'my_feature' # Create new branch 'my_feature' for all projects
clowder stash # Stash changes in all projects
clowder prune 'stale_branch' # Prune branch 'stale_branch' for all projects
clowder repo commands
For more information, see the commands doc
clowder link 'v0.1' # Set clowder.yml symlink to a previously saved version
clowder repo run 'git status' # Run command in .clowder directory
clowder save 'v0.1' # Save a version of clowder.yml with current commit sha's
config commands
NOTE: EXPERIMENTAL
For more information, see the commands doc
clowder config get # Get config values
clowder config set projects 'my_group' # Set config values
clowder config clear projects # Clear config values
Development
See CONTRIBUTING.md for information on setting up your environment for development and contribution guidelines