{ "info": { "author": "Richard Walters", "author_email": "rwalters@digitalstirling.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 3 - Alpha", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Topic :: Software Development :: Version Control :: Git" ], "description": "mugit\n=======\n\nThis is a tool for managing a workspace containing multiple git_ repositories.\n\nAlthough generally all software architects agree that version control is\nessential to software development, the community is split on what is best\nfor large-scale projects, especially those which heavily reuse components.\nThere are many different opinions (for example, see [#]_, [#]_, [#]_, and\n[#]_) but they generally fall into one of two camps:\n\n- monorepo -- one monolithic repository containing everything\n\n- multiple repos -- split project into many repositories, each managing a\n single component\n\nFor those whose projects which adopt the philosophy of multiple repos, mugit\nis used in concert with git_ to manage the overall project workspace.\n\nThe root directory of the workspace, itself managed as a git_ repository,\nincludes a *manifest* file. This is an XML file describing which folders\nin the workspace are themselves git_ repositories. For each of these,\nthe manifest holds configuration metadata:\n\n- upstream URL, from which to clone the repository and to where to\n push changes\n\n- which branch to check out\n\n- whether or not to keep the repository *pinned*, or pointed to a\n specific revision even if the branch changes (e.g. new commits are\n added upstream)\n\nMultiple manifest files may exist in a project. Typically one manifest\nis used during normal development to keep all components up to date\non their configured branches, and another manifest (with all repositories\npinned) is used to mark what revisions of each component together\nconstitute the last release or snapshot of the overall project.\n\nInstallation\n------------\n\n- ``pip install mugit`` -- download and install from PyPI\n\n- ``pip install mugit-1.0.0-py2.py3-none-any.whl`` -- install from local\n wheel file\n\n- ``pip install -e .`` -- install in `editable mode`_ from mugit\n source folder\n\nUsage\n-----\n\n- ``mugit [COMMAND] --help`` -- get more help overall or for a specific command\n\n- ``mugit select [-c] `` -- select manifest to use in other\n mugit commands\n\n- ``mugit pull [-c]`` -- clone missing repositories and fetch/rebase\n existing ones\n\n- ``mugit status [-c] [-a]`` -- generate report on the state of the workspace\n\n - Use ``-a`` to list all repositories, not just ones with changes.\n\n- ``mugit update [-c]`` -- update manifest to reflect current workspace state\n\n- ``mugit add [-c] --all | ..`` -- add repositories to the manifest\n\n - Specify repositories by path or use ``--all`` to automatically scan\n for them.\n\n- ``mugit remove ..`` -- remove repositories from the manifest\n\n- ``mugit release `` -- create or update a release/snapshot manifest\n\n- ``mugit --version`` -- display tool version information\n\nMany mugit commands use `ANSI escape codes`_ to control cursor movement in\nthe console. This works for most terminals, but some (most notably, the\nWindows command prompt) may need help from the colorama_ library.\nThe commands which can make use of colorama_ accept the optional -c argument,\nwhich if used, activates colorama_.\n\nCreating a New Project\n~~~~~~~~~~~~~~~~~~~~~~\n\nWhen setting up a new project, use ``mugit select`` to choose the name\nof the manifest. The selected manifest is tracked in the ``.git/config``\nof the root project repository.\n\nAfter creating or cloning project components, use ``mugit add -a`` to\nscan the workspace for repositories, adding an entry for each into\nthe manifest. This creates the manifest XML file if it didn't exist\npreviously. Note that newly created components will have no upstream\nURL and will be skipped in all pulls and remote checks.\n\n::\n\n mkdir FooBar\n cd FooBar\n git init\n mkdir Foo\n mkdir Bar\n git clone https://example.com/Utilites.git\n cd Foo\n git init\n git commit --allow-empty -m \"Initial Revision\"\n cd ../Bar\n git init\n git commit --allow-empty -m \"Initial Revision\"\n cd ..\n mugit select main\n mugit add -a\n git add main.xml\n git commit -m \"Initial Revision\"\n\nTo add individual components later, create or clone them, and then\npass their paths to ``mugit add`` to update the manifest. Remember\nto commit the manifest change to the root project repository.\n\n::\n\n mkdir Spam\n cd Spam\n git init\n git commit --allow-empty -m \"Initial Revision\"\n cd ..\n mugit select main\n mugit add Spam\n git add main.xml\n git commit -m \"Add Spam\"\n\nWhen a new component is initially published, use ``mugit update`` to\nupdate the manifest to include the upstream URL. Remember\nto commit the manifest change to the root project repository.\n\n::\n\n cd Foo\n git remote add origin https://example.com/foo.git\n git push --set-upstream origin master\n cd ..\n mugit update\n git add main.xml\n git commit -m \"Foo now published at example.com\"\n\nCloning an Upstream Project\n~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nUse ``mugit select`` followed by ``mugit pull`` to initially clone\nall components in a project.\n\n::\n\n git clone https://example.com/FooBar.git\n cd FooBar\n mugit select main\n mugit pull\n\nChecking Status\n~~~~~~~~~~~~~~~\n\nUse ``mugit status`` whenever unsure about whether there are local\nchanges, or to check if there are other changes upstream.\nNormally, only components found to have local or remote changes will\nbe reported. Use the ``-a`` option to force all components to be\nincluded in the report.\n\n::\n\n mugit status -a\n\nDownloading Updates\n~~~~~~~~~~~~~~~~~~~\n\nUse ``mugit pull`` to fetch upstream changes. The changes are first\nfetched into the remote tracking branch. The working branch is then\nrebased onto the remote tracking branch, resulting in a fast-forward\n(if there were no local changes) or a rebase (if there were local changes).\n\nIt's best to check the status with ``mugit status`` first to make sure\nthere are no local untracked or staged changes which might interfere\nwith a rebase.\n\n::\n\n mugit status\n mugit pull\n\n\nMaking a Release\n~~~~~~~~~~~~~~~~\n\nUse ``mugit release`` to create a special copy of the selected\nmanifest where all components are *pinned*, or marked with their\ncurrent commit SHA1 code listed in the manifest. This is useful\nfor recording the exact revisions of all components used to form\na specific snapshot or release of the project.\n\n::\n\n mugit release release\n git add release.xml\n git commit -m \"Release 1.12.7\"\n git tag \"1.12.7\"\n\nChecking Out a Release\n~~~~~~~~~~~~~~~~~~~~~~\n\nA generated manifest can be used later with ``mugit select`` to check out\nthe exact revisions of all components in the manifest that were\npresent when that manifest was generated, even if component branches\nhave moved in the interim.\n\nNote that each component ise put into a *headless* state, even\nif the revision checked out happens to still be at the head of the\nconfigured branch.\n\n::\n\n mugit select release\n\nLicense/Warranty\n----------------\n\nThis tool is made available under the MIT license.\n\n::\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n\nSee the file `LICENSE.txt `_ for more information.\n\n.. _ANSI escape codes: https://en.wikipedia.org/wiki/ANSI_escape_code\n.. _colorama: https://pypi.python.org/pypi/colorama\n.. _editable mode: https://pip.pypa.io/en/stable/reference/pip_install/#editable-installs\n.. _git: https://git-scm.com/\n\n.. [#] https://gist.github.com/arschles/5d7ba90495eb50fa04fc\n.. [#] https://gist.github.com/technosophos/9c706b1ef10f42014a06\n.. [#] https://news.ycombinator.com/item?id=10007654\n.. [#] http://blog.shippable.com/our-journey-to-microservices-and-a-mono-repository\n\n\n", "description_content_type": null, "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://bitbucket.org/digitalstirling/mugit", "keywords": "git", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "mugit", "package_url": "https://pypi.org/project/mugit/", "platform": "", "project_url": "https://pypi.org/project/mugit/", "project_urls": { "Homepage": "https://bitbucket.org/digitalstirling/mugit" }, "release_url": "https://pypi.org/project/mugit/1.0.5/", "requires_dist": null, "requires_python": ">=2.7, <4", "summary": "Git multi-repository workspace management tool", "version": "1.0.5" }, "last_serial": 3422524, "releases": { "1.0.1": [ { "comment_text": "", "digests": { "md5": "bb1c8daa139e267207f30e9b4d241815", "sha256": "d7428c9100b7923bc2f67eccf06f0af71130418e875f6d37d0e0bbef13797c14" }, "downloads": -1, "filename": "mugit-1.0.1-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "bb1c8daa139e267207f30e9b4d241815", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.7, <4", "size": 25705, "upload_time": "2017-09-05T07:58:07", "url": "https://files.pythonhosted.org/packages/a0/ab/dc7c2ee267aaefa9390c3e053974e587742c04cc69b7b909b9fc50688af0/mugit-1.0.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "1d93590a32759c1a00b87fa0a663c5b9", "sha256": "82f8003e3dfaf5591fae4e88f349de110f660d819e344c6f59e2af2e07a528db" }, "downloads": -1, "filename": "mugit-1.0.1.tar.gz", "has_sig": true, "md5_digest": "1d93590a32759c1a00b87fa0a663c5b9", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7, <4", "size": 15154, "upload_time": "2017-09-05T07:58:09", "url": "https://files.pythonhosted.org/packages/5e/18/10cef758e74186d936920555c5981e70d2f201d3e93702c211f929989b1b/mugit-1.0.1.tar.gz" } ], "1.0.2": [ { "comment_text": "", "digests": { "md5": "401b42f3d1f2a0a98348778a43fbb0a1", "sha256": "bd1a7acc1f05654b3f7fdf3b976e86cde9486b41d6eb8f59952601b939805c6b" }, "downloads": -1, "filename": "mugit-1.0.2-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "401b42f3d1f2a0a98348778a43fbb0a1", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.7, <4", "size": 25752, "upload_time": "2017-09-06T07:54:19", "url": "https://files.pythonhosted.org/packages/37/e3/74b0ff99198607302fb9fd26179e878f6075b41308174493eefac3acb30e/mugit-1.0.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "f8aab215b74978ad85a131f69df46d9e", "sha256": "bd4e8aba1331fe28229517950ebd372d681a04d891611502c5a368005bfba432" }, "downloads": -1, "filename": "mugit-1.0.2.tar.gz", "has_sig": true, "md5_digest": "f8aab215b74978ad85a131f69df46d9e", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7, <4", "size": 15188, "upload_time": "2017-09-06T07:54:20", "url": "https://files.pythonhosted.org/packages/c9/5a/3eea01bd99f238a8626947a45f2947ec82a9d7244720c45732b25ad45eae/mugit-1.0.2.tar.gz" } ], "1.0.3": [ { "comment_text": "", "digests": { "md5": "878957a55dcd03ef6a6c3c3969cf53c4", "sha256": "261f28ccea8f5a9ad38da9a56273f0db3c1fe3e63527744f4b25eeadf5da2eb7" }, "downloads": -1, "filename": "mugit-1.0.3-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "878957a55dcd03ef6a6c3c3969cf53c4", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 19249, "upload_time": "2017-12-17T01:50:26", "url": "https://files.pythonhosted.org/packages/69/c2/2acbff8e21cfe6d42e0341b6ef3fafade70e8d160637e8ef91ea492241f4/mugit-1.0.3-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "d6d5c79fb1d76b096fa47f8beb32f795", "sha256": "7e7a750b29d016ea90d309715c27fdc03bf0e0dbe02046b420138fe26c3d6fff" }, "downloads": -1, "filename": "mugit-1.0.3.tar.gz", "has_sig": true, "md5_digest": "d6d5c79fb1d76b096fa47f8beb32f795", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15269, "upload_time": "2017-12-17T01:50:28", "url": "https://files.pythonhosted.org/packages/f0/b3/d71d1b278e7ea26b9d0d063534115bfa484e96ef10d3966fa7ca56309256/mugit-1.0.3.tar.gz" } ], "1.0.4": [ { "comment_text": "", "digests": { "md5": "4032339621c7bcbb27565cadbbd810f4", "sha256": "993532eb4b54518d344de40fbd6dd179c781a0da0bde19fa13d7dea2716b91fb" }, "downloads": -1, "filename": "mugit-1.0.4-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "4032339621c7bcbb27565cadbbd810f4", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.7, <4", "size": 26058, "upload_time": "2017-12-17T02:24:49", "url": "https://files.pythonhosted.org/packages/9a/39/b56136b9121520f3ff0eb2eefc1bee4ee90f3a19e66020f996aa528b7431/mugit-1.0.4-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "32ee8094b308878713e206a68257b89f", "sha256": "e92b718348c2f53db854939b4ffbbde6af0036b0daecdaa2a7e5d3b39405ee05" }, "downloads": -1, "filename": "mugit-1.0.4.tar.gz", "has_sig": true, "md5_digest": "32ee8094b308878713e206a68257b89f", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7, <4", "size": 15239, "upload_time": "2017-12-17T02:24:50", "url": "https://files.pythonhosted.org/packages/06/76/b1059b0b85b1c265581850eacdc188d3e574e75c6795083b2af63d3b7133/mugit-1.0.4.tar.gz" } ], "1.0.5": [ { "comment_text": "", "digests": { "md5": "7234e2f366d41fcc9def4dbe560e2a15", "sha256": "549ed253e1912daa467abf06b4ea09fe36e1ad6f637609eff87518cc156b5592" }, "downloads": -1, "filename": "mugit-1.0.5-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "7234e2f366d41fcc9def4dbe560e2a15", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.7, <4", "size": 26003, "upload_time": "2017-12-17T02:27:26", "url": "https://files.pythonhosted.org/packages/49/47/8eca7b85a3a40904f997432397f881be712dd48aed287f71ffcd0009a862/mugit-1.0.5-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "db25c911b52b48e1ebe39978cd296571", "sha256": "0e3c931daf72e1797c7756f77be31fa21a7e2691f1d74b3a909d00a0230a5f91" }, "downloads": -1, "filename": "mugit-1.0.5.tar.gz", "has_sig": true, "md5_digest": "db25c911b52b48e1ebe39978cd296571", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7, <4", "size": 15146, "upload_time": "2017-12-17T02:27:28", "url": "https://files.pythonhosted.org/packages/d5/0d/c7b7fa46414dca38165440e438993e9e9084f093a372849ee0dbe4234f9b/mugit-1.0.5.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "7234e2f366d41fcc9def4dbe560e2a15", "sha256": "549ed253e1912daa467abf06b4ea09fe36e1ad6f637609eff87518cc156b5592" }, "downloads": -1, "filename": "mugit-1.0.5-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "7234e2f366d41fcc9def4dbe560e2a15", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.7, <4", "size": 26003, "upload_time": "2017-12-17T02:27:26", "url": "https://files.pythonhosted.org/packages/49/47/8eca7b85a3a40904f997432397f881be712dd48aed287f71ffcd0009a862/mugit-1.0.5-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "db25c911b52b48e1ebe39978cd296571", "sha256": "0e3c931daf72e1797c7756f77be31fa21a7e2691f1d74b3a909d00a0230a5f91" }, "downloads": -1, "filename": "mugit-1.0.5.tar.gz", "has_sig": true, "md5_digest": "db25c911b52b48e1ebe39978cd296571", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7, <4", "size": 15146, "upload_time": "2017-12-17T02:27:28", "url": "https://files.pythonhosted.org/packages/d5/0d/c7b7fa46414dca38165440e438993e9e9084f093a372849ee0dbe4234f9b/mugit-1.0.5.tar.gz" } ] }