Code Monkey home page Code Monkey logo

gitlabber's Introduction

https://github.com/ezbz/gitlabber/actions/workflows/python-app.yml/badge.svg?branch=master https://img.shields.io/pypi/pyversions/gitlabber https://readthedocs.org/projects/gitlabber/badge/?version=latest&style=plastic

Gitlabber

  • A utility to clone and pull GitLab groups, subgroups, projects based on path selection

Purpose

Gitlabber clones or pulls all projects under a subset of groups / subgroups by building a tree from the GitLab API and allowing you to specify which subset of the tree you want to clone using glob patterns and/or regex expressions.

Installation

  • You can install Gitlabber from PyPi:
pip install gitlabber
  • You'll need to create an access token from GitLab with API scopes read_repository and read_api (or api, for GitLab versions <12.0)

Usage

  • Arguments can be provided via the CLI arguments directly or via environment variables::

    Argument

    Flag

    Environment Variable

    token

    -t

    GITLAB_TOKEN

    url

    -u

    GITLAB_URL

    method

    -m

    GITLABBER_CLONE_METHOD

    naming

    -n

    GITLABBER_FOLDER_NAMING

    include

    -i

    GITLABBER_INCLUDE

    exclude

    -x

    GITLABBER_EXCLUDE

    root_group

    -g

    GITLABBER_ROOT_GROUP

  • To view the tree run the command with your includes/excludes and the -p flag. It will print your tree like so:

root [http://gitlab.my.com]
├── group1 [/group1]
│   └── subgroup1 [/group1/subgroup1]
│       └── project1 [/group1/subgroup1/project1]
└── group2 [/group2]
    ├── subgroup1 [/group2/subgroup1]
    │   └── project2 [/group2/subgroup1/project2]
    ├── subgroup2 [/group2/subgroup2]
    └── subgroup3 [/group2/subgroup3]
  • To see how to use glob patterns and regex to filter tree nodes, see the globre project page.
  • Cloning vs Pulling: when running Gitlabber consecutively with the same parameters, it will scan the local tree structure; if the project directory exists and is a valid git repository (has .git folder in it) Gitlabber will perform a git pull in the directory, otherwise the project directory will be created and the GitLab project will be cloned into it.
  • Cloning submodules: use the -r flag to recurse git submodules, uses the --recursive for cloning and utilizes GitPython's smart update method for updating cloned repositories
  • Printed Usage:
usage: gitlabber [-h] [-t token] [-u url] [--verbose] [-p] [-d]
                [--print-format {json,yaml,tree}] [-m {ssh,https}] [-i csv]
                [-x csv] [--version] [-g {id,full_path,full_name}]
                [dest]

Gitlabber - clones or pulls entire groups/projects tree from GitLab

positional arguments:
dest                  destination path for the cloned tree (created if doesn't exist)

optional arguments:
-h, --help            show this help message and exit
-t token, --token token
                        gitlab personal access token https://docs.gitlab.com/ee/user/profile/personal_access_tokens.html
-u url, --url url     base gitlab url (e.g.: 'http://gitlab.mycompany.com')
--verbose             print more verbose output
-p, --print           print the tree without cloning
--print-format {json,yaml,tree}
                        print format (default: 'tree')
-n {name,path}, --naming {name,path}
                        the folder naming strategy for projects (default: "name")
-m {ssh,http}, --method {ssh,http}
                        the git transport method to use for cloning (default: "ssh")
-a {include,exclude,only}, --archived {include,exclude,only}
                        include archived projects and groups in the results (default: "include")
-i csv, --include csv
                        comma delimited list of glob patterns of paths to projects or groups to clone/pull
-x csv, --exclude csv
                        comma delimited list of glob patterns of paths to projects or groups to exclude from clone/pull
-g root_group, --root-group root_group
                        id/full_path/full_name of a group to use as the root instead of the entire gitlab tree
-r, --recursive       clone/pull git submodules recursively
-d, --dont-checkout   clone/fetch git repository without checkout
--version             print the version

examples:

    clone an entire gitlab tree using a base url and a token:
    gitlabber -t <personal access token> -u <gitlab url> .

    # the following examples assume you provided token/url in environment variables so these arguments are omitted
    only print the gitlab tree:
    gitlabber -p .

    clone only projects under subgroup 'MySubGroup' to location '~/GitlabRoot':
    gitlabber -i '/MyGroup/MySubGroup**' ~/GitlabRoot

    clone only projects under group 'MyGroup' excluding any projects under subgroup 'MySubGroup':
    gitlabber -i '/MyGroup**' -x '/MyGroup/MySubGroup**' .

    clone an entire gitlab tree except projects under groups named 'ArchiveGroup':
    gitlabber -x '/ArchiveGroup**' .

    clone projects that start with a case insensitive 'w' using a regular expression:
    gitlabber -i '/{[w].*}' .

Debugging

  • You can use the --verbose flag to print Gitlabber debug messages
  • For more verbose GitLab messages, you can get the GitPython module to print more debug messages by setting the environment variable:
export GIT_PYTHON_TRACE='full'

Troubleshooting

Known Limitations

  • Renaming, moving and deleting projects: Gitlabber doesn't maintain local tree state (projects and groups). For that reason is does not rename move or delete local projects when they are modified on the server. When projects are moved or renamed, Gitlabber will clone them again under their new name or location. When deleted, Gitlabber will not delete the local project.
  • Folder naming strategy: Consecutively running Gitlabber with different values for the -n parameter will produce undesirable results. Use the same value as previous runs, or simply don't change it from the default (project name).
  • If you're going to clone a large number of projects, observe rate limits for gitlab.com, and for on-premise installations.

gitlabber's People

Contributors

ezbz avatar alvarodelvalle avatar arnvid avatar syphernl avatar crocmagnon avatar joubin avatar s1artie avatar waldyrious avatar dependabot[bot] avatar masecla22 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.