{ "info": { "author": "Michael Hirsch, Ph.D.", "author_email": "scivision@users.noreply.github.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 5 - Production/Stable", "Environment :: Console", "Framework :: AsyncIO", "Intended Audience :: Developers", "Intended Audience :: End Users/Desktop", "Operating System :: OS Independent", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", "Topic :: Utilities" ], "description": "[![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.2592584.svg)](https://doi.org/10.5281/zenodo.2592584)\n\n[![Build Status](https://dev.azure.com/mhirsch0512/GitMC/_apis/build/status/scivision.gitMC?branchName=master)](https://dev.azure.com/mhirsch0512/GitMC/_build/latest?definitionId=2&branchName=master)\n[![Build Status](https://travis-ci.org/scivision/gitMC.svg?branch=master)](https://travis-ci.org/scivision/gitMC)\n[![Coverage Status](https://coveralls.io/repos/github/scivision/gitMC/badge.svg?branch=master)](https://coveralls.io/github/scivision/gitMC?branch=master)\n[![Build status](https://ci.appveyor.com/api/projects/status/co2em7skpsu0p8r3?svg=true)](https://ci.appveyor.com/project/scivision/gitmc)\n[![pypi versions](https://img.shields.io/pypi/pyversions/gitutils.svg)](https://pypi.python.org/pypi/gitutils)\n[![PyPi Download stats](http://pepy.tech/badge/gitutils)](http://pepy.tech/project/gitutils)\n\n# GitMC -- concurrent asynchronous Git Utilities for operations on massive numbers of Git repos\n\nPlatform-independent (Linux/Mac/Windows) Git utilities, useful for managing large (100+) numbers of Git repos.\nSpeed is an emphasis throughout, with concurrency via Python `asyncio` and pipelining.\nIn general, GitMC works with all GitHub repos, including organization private repos--assuming you have created a GitHub Oauth key with appropriate permissions (\"repo\" needed for private org/user repos\").\n\nGitMC uses command-line Git because PyGit also requires command-line Git installed, and we don't need the advanced functionality.\n\nAn important feature in\n```sh\npython CountGithubForks.py username\n```\nis showing which forks of your repos have had changes \"ahead of\" the parent repo.\n\n---\n\nCount how many total GitHub stars a GitHub account has:\n\n```sh\npython CountGithubStars.py username\n```\n\nThat will take a couple seconds even for large numbers of repos.\n\n---\n\nAlso see Git [utilities](https://github.com/scivision/gitedu) for managing large (100+) numbers of users / teams, particularly for education and institutions.\n\n## Install\n\nInstall Git in a way accessible from the command line line\n\n- Mac: `brew install git`\n- Linux: `apt install git`\n- Windows: command line [Git](https://git-scm.com/download/win).\n\n```sh\npython -m pip install -e .\n```\n\nFor better speed, optionally we suggest Git ≥ 2.18 and Git wire protocol v2:\n```sh\ngit config --global protocol.version 2\n```\nThis benefits both HTTPS and SSH connections.\n\n## Usage\n\n* `gitbranch` Tells of any non-master branches under directory ~/code\n* `gitemail` list all contributor email addresses. Optionally, amend email addresses for prior Git commits\n\n### Sync large number of git repos\n\nThese assume numerous subdirectories under `~/code` or `c:\\code`.\nThey work very quickly for large numbers (100+) repos.\n\n\n* `gitmodified` check if any local repos have pending changes\n* `gitcheck` check if any remote repos are ahead of local\n* `gitpull` Git pulls all repos\n* `gitfetch` Git fetches all repos\n\nYou can place an empty file `.nogit` in a subdirectory to skip it.\n\n\n#### [optional] speedup with https pull\nFor public repos, to make the Git remote checking go at least twice as fast, and significantly reduce the computational burden when SSH is used for `git push` (as is recommended), consider the \"pushInsteadOf\" global Git config.\nTo do this, when cloning a public repo (including ones you're a collaborator on), use `git clone https://`.\nThis global SSH push config one-time does SSH push for HTTPS-cloned repos:\n```sh\ngit config --global url.\"ssh://github.com/\".pushInsteadOf https://github.com/\n```\nThe pattern matching can be made for all sites by omitting `github.com` from the command above, or you can refine it for each site, or even for specific usernames by editing the command above.\nFor private repos, simply clone with SSH as usual\n\n\n### Preview all changed Jekyll files\n\nThis is for a website made using\n[Jekyll](https://www.scivision.dev/create-jekyll-github-pages-website)\nor Hugo:\n```sh\nActOnChanged -p\n```\n\nIt shows web page previews of all pages changed locally--start the Jekyll or Hugo debug server first e.g. `hugo serve`\n\n## Github\nPython GitHub [API](https://pypi.org/project/PyGithub/)\n\nMost users will need a GitHub API token, as the unauthenticated API access is severly limited.\n\n1. [Generate](https://github.com/settings/tokens) GitHub API token with ONLY the `user:email` permission.\n2. Copy that text string to a secure location on your computer.\n\n### GitHub user stats\n\n`ListAllGithubRepos username OauthKey`\nGives stats on GitHub repos for a particular user.\nIt requires extra prereqs via:\n```sh\npip install -e .[github]\n```", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/scivision/gitMC", "keywords": "concurrent,asynchronous,asyncio,git,GitHub", "license": "", "maintainer": "", "maintainer_email": "", "name": "gitutils", "package_url": "https://pypi.org/project/gitutils/", "platform": "", "project_url": "https://pypi.org/project/gitutils/", "project_urls": { "Homepage": "https://github.com/scivision/gitMC" }, "release_url": "https://pypi.org/project/gitutils/1.4.0/", "requires_dist": null, "requires_python": ">= 3.6", "summary": "concurrent, pipelined, platform-agnostic Git utilities for managing a large number of Git repositories", "version": "1.4.0" }, "last_serial": 5547078, "releases": { "1.1.3": [ { "comment_text": "", "digests": { "md5": "9bb2ca31ed34e725a07125af5f1ed0c5", "sha256": "72e2527c02371fd96f1d9f8d9dc4222ebc8be6c5ddcbb43c67f01e41703836bf" }, "downloads": -1, "filename": "gitutils-1.1.3.tar.gz", "has_sig": false, "md5_digest": "9bb2ca31ed34e725a07125af5f1ed0c5", "packagetype": "sdist", "python_version": "source", "requires_python": ">= 3.6", "size": 6717, "upload_time": "2018-08-09T19:02:59", "url": "https://files.pythonhosted.org/packages/35/7f/437fc84f8bbdf0f304f18a51a200b5faecfa003564acc472146c48b59326/gitutils-1.1.3.tar.gz" } ], "1.1.4": [ { "comment_text": "", "digests": { "md5": "4c6ce503a4f7fe7adee6e69e28ce039d", "sha256": "cef0c0d3a7423519dd3d5ae74a53fbe0e91c109710f29386981f22b5ba6c337e" }, "downloads": -1, "filename": "gitutils-1.1.4.tar.gz", "has_sig": false, "md5_digest": "4c6ce503a4f7fe7adee6e69e28ce039d", "packagetype": "sdist", "python_version": "source", "requires_python": ">= 3.6", "size": 6882, "upload_time": "2018-08-27T01:46:12", "url": "https://files.pythonhosted.org/packages/d7/2d/0cb85bce827a25241f3aa19f08b4ed903c91fd1939e3e9b0616b2b7eae0a/gitutils-1.1.4.tar.gz" } ], "1.1.5": [ { "comment_text": "", "digests": { "md5": "9fbc5cd6dfda6c9568e8947bc653dc81", "sha256": "a16c5df03d931ed6d92f1e355491638eb33f86c15e9f60990468156e9a516c51" }, "downloads": -1, "filename": "gitutils-1.1.5.tar.gz", "has_sig": false, "md5_digest": "9fbc5cd6dfda6c9568e8947bc653dc81", "packagetype": "sdist", "python_version": "source", "requires_python": ">= 3.6", "size": 7612, "upload_time": "2018-10-03T03:40:46", "url": "https://files.pythonhosted.org/packages/b5/da/b528b17b562ee644e5ce505cacffaf094017c5769dd63b2ea7a62eafb437/gitutils-1.1.5.tar.gz" } ], "1.1.6": [ { "comment_text": "", "digests": { "md5": "c168feff0d5fc163e65e045d4656adea", "sha256": "502c24373edcb570ba9c005f609624cef0e514e3073d2881c7789b6f703a10e3" }, "downloads": -1, "filename": "gitutils-1.1.6.tar.gz", "has_sig": false, "md5_digest": "c168feff0d5fc163e65e045d4656adea", "packagetype": "sdist", "python_version": "source", "requires_python": ">= 3.6", "size": 8073, "upload_time": "2018-10-08T03:17:38", "url": "https://files.pythonhosted.org/packages/ec/6f/111b5a115d2475757e9ea880b4400eaf75e57fcd770e0805789ee66e1b93/gitutils-1.1.6.tar.gz" } ], "1.2.0": [ { "comment_text": "", "digests": { "md5": "7f2c95c4587939a0eea820861fa18576", "sha256": "46bc1c6955bd07252f64b17b2ab688cdf1b782a69fc63f3bc5487d61598da497" }, "downloads": -1, "filename": "gitutils-1.2.0.tar.gz", "has_sig": false, "md5_digest": "7f2c95c4587939a0eea820861fa18576", "packagetype": "sdist", "python_version": "source", "requires_python": ">= 3.6", "size": 15832, "upload_time": "2019-03-13T17:56:57", "url": "https://files.pythonhosted.org/packages/57/84/e0a0728268492b1896aaed2fedff865b7b6c927de438786913f8c5bab98d/gitutils-1.2.0.tar.gz" } ], "1.2.1": [ { "comment_text": "", "digests": { "md5": "50b67bbfbc32b3929862d0099e65c4c4", "sha256": "998ac1c8a5baec513d8fe3eb573abcc696c83316a48e6aa21749f4d19ad59b18" }, "downloads": -1, "filename": "gitutils-1.2.1.tar.gz", "has_sig": false, "md5_digest": "50b67bbfbc32b3929862d0099e65c4c4", "packagetype": "sdist", "python_version": "source", "requires_python": ">= 3.6", "size": 16410, "upload_time": "2019-03-13T20:25:34", "url": "https://files.pythonhosted.org/packages/ed/12/d09c8cd1b4c10260c84c7b675e5d5379114bcdcded595aae1401f93cc16e/gitutils-1.2.1.tar.gz" } ], "1.2.2": [ { "comment_text": "", "digests": { "md5": "8e9cabee2820ece3319c1b07f419d7b4", "sha256": "5483ed34f574114bf2a9b0f48c91eda6fda45f22e1b70fc3a17720a5876a1596" }, "downloads": -1, "filename": "gitutils-1.2.2.tar.gz", "has_sig": false, "md5_digest": "8e9cabee2820ece3319c1b07f419d7b4", "packagetype": "sdist", "python_version": "source", "requires_python": ">= 3.6", "size": 16304, "upload_time": "2019-03-25T01:49:38", "url": "https://files.pythonhosted.org/packages/aa/84/983fd587040c8b874d2a4066497d47eb9ba9c182d4ac4fcb39466d5ac5be/gitutils-1.2.2.tar.gz" } ], "1.2.3": [ { "comment_text": "", "digests": { "md5": "c27eca41492aebd78a46080abe2daf4a", "sha256": "fdcc370a2c65655493bb4e1a064ef2cd3919ebd861e67c443f0e4bbf88234e8a" }, "downloads": -1, "filename": "gitutils-1.2.3.tar.gz", "has_sig": false, "md5_digest": "c27eca41492aebd78a46080abe2daf4a", "packagetype": "sdist", "python_version": "source", "requires_python": ">= 3.6", "size": 16405, "upload_time": "2019-03-29T20:32:13", "url": "https://files.pythonhosted.org/packages/6a/20/7cc76aff34057ac3b09c9f7847a7c65e7386a9c882875a569f859886da51/gitutils-1.2.3.tar.gz" } ], "1.2.4": [ { "comment_text": "", "digests": { "md5": "aee14fe53ae05a9196edde86a80af742", "sha256": "4d55b41f45566286bbed168969293c0e10d7ec5804cf586c72044de78cc80a73" }, "downloads": -1, "filename": "gitutils-1.2.4.tar.gz", "has_sig": false, "md5_digest": "aee14fe53ae05a9196edde86a80af742", "packagetype": "sdist", "python_version": "source", "requires_python": ">= 3.6", "size": 981328, "upload_time": "2019-06-04T17:07:37", "url": "https://files.pythonhosted.org/packages/85/a8/e9edf1a82f71738670bbb3343734d5dd047ca7e5a856ceaff7a0320baf05/gitutils-1.2.4.tar.gz" } ], "1.3.0": [ { "comment_text": "", "digests": { "md5": "e6469a6fd072489cc267c7835d7e906f", "sha256": "a919cd7ec9aaff4a8a4e7abdd4ab0eb289cd62b7e4941b91ea215b436a13a36b" }, "downloads": -1, "filename": "gitutils-1.3.0.tar.gz", "has_sig": false, "md5_digest": "e6469a6fd072489cc267c7835d7e906f", "packagetype": "sdist", "python_version": "source", "requires_python": ">= 3.7", "size": 16745, "upload_time": "2019-06-14T14:52:05", "url": "https://files.pythonhosted.org/packages/f6/d3/9f8d70c6c6f88206c9076782d04720d36ebfbee3d94a480059bcf6990454/gitutils-1.3.0.tar.gz" } ], "1.3.1": [ { "comment_text": "", "digests": { "md5": "f54f05956ea922446f85e2838093fed6", "sha256": "ca0062bde22815b26ed8c685db36d450f8d1278f77674a74e435d7de40f926d4" }, "downloads": -1, "filename": "gitutils-1.3.1.tar.gz", "has_sig": false, "md5_digest": "f54f05956ea922446f85e2838093fed6", "packagetype": "sdist", "python_version": "source", "requires_python": ">= 3.7", "size": 16867, "upload_time": "2019-06-14T15:09:56", "url": "https://files.pythonhosted.org/packages/23/ac/b3a31e9d6eeb8c2e2c88d13227f324bfe62d959d099ade0a2556ab795882/gitutils-1.3.1.tar.gz" } ], "1.3.2": [ { "comment_text": "", "digests": { "md5": "42393abb836206f006a467b8c1a0fc4c", "sha256": "cb4515107541916aa5f61ebc9e922ed74bcb7b2171d43aa46b73c77962cc500f" }, "downloads": -1, "filename": "gitutils-1.3.2.tar.gz", "has_sig": false, "md5_digest": "42393abb836206f006a467b8c1a0fc4c", "packagetype": "sdist", "python_version": "source", "requires_python": ">= 3.7", "size": 17072, "upload_time": "2019-07-02T02:12:22", "url": "https://files.pythonhosted.org/packages/8b/1c/56530fd1ed1c45ec277c473088c18704aadf9104ceacab869351f8749ec8/gitutils-1.3.2.tar.gz" } ], "1.3.3": [ { "comment_text": "", "digests": { "md5": "1eaf60d37d45b5c16f07111dfd93fb4a", "sha256": "a9f3a3f899a497118e14226a7bfaa48ec0d5d07946516a2f099c6823cd092276" }, "downloads": -1, "filename": "gitutils-1.3.3.tar.gz", "has_sig": false, "md5_digest": "1eaf60d37d45b5c16f07111dfd93fb4a", "packagetype": "sdist", "python_version": "source", "requires_python": ">= 3.6", "size": 17433, "upload_time": "2019-07-10T12:12:18", "url": "https://files.pythonhosted.org/packages/cf/20/eddb4e57bd69ca44800262792fd7f78c4228bf16bf5c8bf931c682342f88/gitutils-1.3.3.tar.gz" } ], "1.3.4": [ { "comment_text": "", "digests": { "md5": "eb9caf9640267ef8cafb6f0d56369a12", "sha256": "744fef63429410802490611ce812ba77905b601e18b28cfd89d5d72ba4179a82" }, "downloads": -1, "filename": "gitutils-1.3.4.tar.gz", "has_sig": false, "md5_digest": "eb9caf9640267ef8cafb6f0d56369a12", "packagetype": "sdist", "python_version": "source", "requires_python": ">= 3.6", "size": 17623, "upload_time": "2019-07-12T20:43:22", "url": "https://files.pythonhosted.org/packages/2b/c4/c669c3f4f9c7a8de8823d197771f757af46665394b3f3d722dee354e900e/gitutils-1.3.4.tar.gz" } ], "1.4.0": [ { "comment_text": "", "digests": { "md5": "2d6287d2af98c9d9c60c8871e02de7a2", "sha256": "b700c824c7ab2bf4b9c00d7eb152fabb675f6aef702b25639b04aacc44569aea" }, "downloads": -1, "filename": "gitutils-1.4.0.tar.gz", "has_sig": false, "md5_digest": "2d6287d2af98c9d9c60c8871e02de7a2", "packagetype": "sdist", "python_version": "source", "requires_python": ">= 3.6", "size": 18600, "upload_time": "2019-07-17T18:09:16", "url": "https://files.pythonhosted.org/packages/33/4d/70418d12d09352e5cd92675911a587755e46e9ed572e525345df0dc3ce4f/gitutils-1.4.0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "2d6287d2af98c9d9c60c8871e02de7a2", "sha256": "b700c824c7ab2bf4b9c00d7eb152fabb675f6aef702b25639b04aacc44569aea" }, "downloads": -1, "filename": "gitutils-1.4.0.tar.gz", "has_sig": false, "md5_digest": "2d6287d2af98c9d9c60c8871e02de7a2", "packagetype": "sdist", "python_version": "source", "requires_python": ">= 3.6", "size": 18600, "upload_time": "2019-07-17T18:09:16", "url": "https://files.pythonhosted.org/packages/33/4d/70418d12d09352e5cd92675911a587755e46e9ed572e525345df0dc3ce4f/gitutils-1.4.0.tar.gz" } ] }