Skip to main content

Download some projects.

Project description

pully

pipeline status coverage report latest release pre-commit cici enabled code style: prettier

pully is a tool for managing a large number of Git repository checkouts effectively.

Why pully

pully was created to make managing and automating changes to multiple projects easier. There are two general use cases pully is designed to address. First, a mass action where a a set of projects is cloned and the same action is run on each project. Second, managing a local workspace for a set of projects.

Large scale changes

pully helps solve problems where you need to make the same action across multiple projects.

  • Update the copyright date in the license file of all projects.
  • Update pre-commit versions in all projects.
  • Add badgie to all projects.

The recommended workflow in this case is to use pully to clone workspaces for mass actions not regular development. Avoid using the same project workspaces for both regular development and automated actions. Different branches, new files, and unknown state that are common in work in progress are likely to interfere with scripted changes.

Manage local workspaces

pully can be used to manage project checkouts for regular development. This makes onboarding new developers or setting up new environments easier. Common tasks like pulling the latest changes or pruning remote branches are easy to do. Beware of scripting changes to multiple projects since the status of each project may different and cause unexpected results.

With great power comes great responsibility

We recommend tremendous caution when automating repository changes. Some tips:

  • Avoid making and committing changes in a single command

  • Ensure that a human is reviewing all changes before committing

  • Automate the creation of branches and merge requests as a minimally privileged user

We expect some of these workflows to become pully features in the future.

Installation

python3 -m pip install pully

Quickstart

# add projects for pully to track
pully add -G saferatday0/library

# clone/fetch all projects
pully

# run commands in checked out projects
pully run touch .gitkeep

Usage

Initialize a project workspace

Run pully init to create a project workspace.

pully init

A .pully.json will be created in the current directory that will be used to track project checkouts.

Add projects for tracking

Track any project by path:

pully add -P saferatday0/badgie
$ pully add -P saferatday0/badgie
searching for group id by full path saferatday0
searching for project id by full path
found project ids: [70752539]
found pully file at /home/user/projects/.pully.json
adding saferatday0/badgie

Track any group by path (subgroups are supported):

pully add -G saferatday0/library
$ pully add -G saferatday0/library
searching for group id by full path saferatday0/library
found group ids: [108399662]
creating new pullyfile at /home/user/projects
adding saferatday0/library/ansible
adding saferatday0/library/asciidoctor
...
adding saferatday0/library/verible
adding saferatday0/library/zola

Only newly added projects will be printed.

Clone/fetch all repositories

Call pully to clone or pull the project to your local filesystem:

pully
$ pully
found pully file at /home/user/projects/.pully.json
cloning saferatday0/library/ansible (70326944)
cloning saferatday0/library/asciidoctor (70588591)
...
cloning saferatday0/library/zola (70432884)
cloning saferatday0/badgie (70752539)

This is the same as calling pully pull:

pully pull

Running commands on repositories

The pully run command can be used to run a command in each repository.

Commands can be run in one of two ways:

  • As arguments

  • Using -c/--command

As arguments

When run this way, commands are run directly, a shell is not instantiated, and executable paths are fully resolved:

pully run git status

Command line options can be passed using --:

pully run -- ls -l

Using -c/--command

When run this way, a shell is launched, so shell features like indirection and pipes can be used

pully run -c 'echo "$(pwd) $(git branch)"'

["/bin/sh", "-euc"] is the default entrypoint. A different entrypoint can be specified with -e/--entrypoint:

pully run -e '["python3", "-c"]' -c 'fp = open(".gitignore", "a"); fp.write("*.pdf\n");'
$ pully run -e '["python3", "-c"]' -c 'fp = open(".gitignore", "a"); fp.write("*.pdf\n");'
found pully file at /home/user/projects/.pully.json
running saferatday0/library/ansible --------------------------------------------
running saferatday0/library/asciidoctor ----------------------------------------
...
$ cd saferatday0/badgie/
$ git diff
diff --git a/.gitignore b/.gitignore
index c84b6c9..e56720a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -15,3 +15,4 @@ build/
 env.sh

 node_modules/
+*.pdf

Cleanup

Reverting changes is easy:

pully run git checkout .
$ pully run git checkout .
found pully file at /home/bweir/blah/.pully.json
running saferatday0/library/ansible --------------------------------------------
Updated 1 path from the index
running saferatday0/library/asciidoctor ----------------------------------------
Updated 1 path from the index

Private repositories

pully can clone private repositories by setting the GITLAB_PRIVATE_TOKEN environment variable:

export GITLAB_PRIVATE_TOKEN="XXXXXX"
pully add -G private/namespace
pully

License

Copyright 2025 UL Research Institutes.

Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pully-0.6.0.tar.gz (16.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

pully-0.6.0-py3-none-any.whl (16.3 kB view details)

Uploaded Python 3

File details

Details for the file pully-0.6.0.tar.gz.

File metadata

  • Download URL: pully-0.6.0.tar.gz
  • Upload date:
  • Size: 16.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.11.13

File hashes

Hashes for pully-0.6.0.tar.gz
Algorithm Hash digest
SHA256 e74837f9eee4be1f701709641d2af95625008f354a6e07865691751919aba594
MD5 ff3df8a0e71349b1604733b79fdbdbf8
BLAKE2b-256 23864e6de3160cc998a6ffe6ecc2f319a8667dbe50a34f1f020343b352def572

See more details on using hashes here.

File details

Details for the file pully-0.6.0-py3-none-any.whl.

File metadata

  • Download URL: pully-0.6.0-py3-none-any.whl
  • Upload date:
  • Size: 16.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.11.13

File hashes

Hashes for pully-0.6.0-py3-none-any.whl
Algorithm Hash digest
SHA256 655dad120b73014b66fff732dd512011022044df9f51bdaacce9d120f1f5f8ff
MD5 872d38a53c2c4d4f869925378f197a00
BLAKE2b-256 dce073d3d1f1ffd6fba9b30a749f41e0c485c5a5f2ca1794a520df50ba656813

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page