{ "info": { "author": "Remi Rampin", "author_email": "remirampin@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 5 - Production/Stable", "Environment :: Console", "Intended Audience :: Developers", "Intended Audience :: System Administrators", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Topic :: Software Development :: Version Control :: Git", "Topic :: System :: Archiving :: Backup", "Topic :: Utilities" ], "description": "What is this?\n=============\n\nThis is a small tool that does ``git fetch`` then writes down all ref updates in a SQLite3 database. It also creates refs to make sure no commit gets garbage collected.\n\nWhat for?\n=========\n\nIf the remote repository gets force-pushed to, some commits might get lost. There will also be no evidence in the Git log that such destructive changes happened. It is also possible for a commit to be created but pushed much later, or branches can get renamed; none of this appears in the Git log either.\n\nThis tool will allow you to get a clear picture of what happened, never lose a commit, and quickly get a snapshot of a repository at a specific point in time. It is therefore more suitable for backups than a mirror.\n\nDoesn't the reflog do all that?\n===============================\n\nThis is indeed similar to Git's built-in reflog, except that the reflog isn't aware of branch renames, and a branch's reflog gets deleted with the branch.\n\nIt is also local, so you wouldn't be able to read the reflog of a remote repository.\n\nHow to use\n==========\n\nFirst, create a bare repo::\n\n $ mkdir my-repo-backup && cd my-repo-backup\n $ git init --bare\n\nSet up one (or multiple) remotes to fetch from::\n\n $ git remote add origin https://github.com/remram44/doublegit.git\n\nThen simply run doublegit once in a while::\n\n $ python3 doublegit.py /path/to/my-repo-backup\n\nYou can then query ``gitarchive.sqlite3`` for branch updates or for the position of the branches at a given point in time.\n\nNext steps?\n===========\n\nI think it would be cool if this tool could record GitHub/GitLab/... API events too; things like issues/merge requests/comments.\n\nIt could also automatically backup all your starred repos.\n\nThis also doesn't support tags yet.", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/remram44/doublegit", "keywords": "git,versioning,version control,backup", "license": "MIT", "maintainer": "Remi Rampin", "maintainer_email": "remirampin@gmail.com", "name": "doublegit", "package_url": "https://pypi.org/project/doublegit/", "platform": "", "project_url": "https://pypi.org/project/doublegit/", "project_urls": { "Homepage": "https://github.com/remram44/doublegit", "Say Thanks": "https://saythanks.io/to/remram44", "Source": "https://github.com/remram44/doublegit", "Tracker": "https://github.com/remram44/doublegit/issues" }, "release_url": "https://pypi.org/project/doublegit/1.2/", "requires_dist": null, "requires_python": "", "summary": "Version and backup a Git repository", "version": "1.2" }, "last_serial": 5594710, "releases": { "0.0": [ { "comment_text": "", "digests": { "md5": "b5dbc25ac7be24265fbceef979ea3139", "sha256": "cddcf9ee5bf4f84a25125d01163904edc6789ff5a231dd77f1bba7add6223002" }, "downloads": -1, "filename": "doublegit-0.0.tar.gz", "has_sig": false, "md5_digest": "b5dbc25ac7be24265fbceef979ea3139", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 2797, "upload_time": "2019-03-16T17:11:47", "url": "https://files.pythonhosted.org/packages/63/25/bf6f680bb9e0a40a315b143a7de5ec5adb9a305ea2b0a1d764255e3c8e24/doublegit-0.0.tar.gz" } ], "1.0": [ { "comment_text": "", "digests": { "md5": "490a2c72cbb9cec702e2761e67f284be", "sha256": "afcd83aecca24b97389f164616363be921f31a348ffc2f2ae42b537577b2e71a" }, "downloads": -1, "filename": "doublegit-1.0-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "490a2c72cbb9cec702e2761e67f284be", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 6005, "upload_time": "2019-03-16T22:17:53", "url": "https://files.pythonhosted.org/packages/f3/65/2e3fa953f13b834c049c7f558e6dd42c15292f8e88536cd607d152cd1aa2/doublegit-1.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "7b6c7b29d475e27aca68547ad4c755c1", "sha256": "6583001ae50e8917c5ff66cf8292a179f24e82cff8c38930878af29a3541e8f7" }, "downloads": -1, "filename": "doublegit-1.0.tar.gz", "has_sig": true, "md5_digest": "7b6c7b29d475e27aca68547ad4c755c1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6186, "upload_time": "2019-03-16T22:17:40", "url": "https://files.pythonhosted.org/packages/2b/31/4adeeabc854d007164e9e79a817e8f005a9b447140210e214114b5389278/doublegit-1.0.tar.gz" } ], "1.2": [ { "comment_text": "", "digests": { "md5": "44c4bd3533179c55436ad6106f427ceb", "sha256": "56b45e6741a0cc27776c4dadedfe49b1a95e377d61035232f937ce6daa4fbc14" }, "downloads": -1, "filename": "doublegit-1.2-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "44c4bd3533179c55436ad6106f427ceb", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 6361, "upload_time": "2019-07-28T03:58:54", "url": "https://files.pythonhosted.org/packages/43/3f/4630da1abd184e02c03a18312ea4d90d790affd9470088e2e3b50ab3c03f/doublegit-1.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "006617bd1af6621a8530b02ebe9b76d0", "sha256": "7bc7bb11df1840627a53c5e325d52e4bed25a4078b7b27d51d98ffc1d6aad850" }, "downloads": -1, "filename": "doublegit-1.2.tar.gz", "has_sig": true, "md5_digest": "006617bd1af6621a8530b02ebe9b76d0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6792, "upload_time": "2019-07-28T03:58:42", "url": "https://files.pythonhosted.org/packages/22/0b/115d6ad564c93cbe996a137477ef57fcddcfb27f237a1cecb5330086307d/doublegit-1.2.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "44c4bd3533179c55436ad6106f427ceb", "sha256": "56b45e6741a0cc27776c4dadedfe49b1a95e377d61035232f937ce6daa4fbc14" }, "downloads": -1, "filename": "doublegit-1.2-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "44c4bd3533179c55436ad6106f427ceb", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 6361, "upload_time": "2019-07-28T03:58:54", "url": "https://files.pythonhosted.org/packages/43/3f/4630da1abd184e02c03a18312ea4d90d790affd9470088e2e3b50ab3c03f/doublegit-1.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "006617bd1af6621a8530b02ebe9b76d0", "sha256": "7bc7bb11df1840627a53c5e325d52e4bed25a4078b7b27d51d98ffc1d6aad850" }, "downloads": -1, "filename": "doublegit-1.2.tar.gz", "has_sig": true, "md5_digest": "006617bd1af6621a8530b02ebe9b76d0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6792, "upload_time": "2019-07-28T03:58:42", "url": "https://files.pythonhosted.org/packages/22/0b/115d6ad564c93cbe996a137477ef57fcddcfb27f237a1cecb5330086307d/doublegit-1.2.tar.gz" } ] }