{"id":19031432,"url":"https://github.com/plandes/grsync","last_synced_at":"2025-04-23T16:40:32.491Z","repository":{"id":57478149,"uuid":"147043094","full_name":"plandes/grsync","owner":"plandes","description":"Synchronize and manage multiple GitHub repositories","archived":false,"fork":false,"pushed_at":"2025-01-11T20:08:18.000Z","size":311,"stargazers_count":1,"open_issues_count":0,"forks_count":1,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-04-18T01:47:58.567Z","etag":null,"topics":["git","home-directory","linux","synchronization","unix","utility"],"latest_commit_sha":null,"homepage":"https://plandes.github.io/grsync/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/plandes.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2018-09-02T00:46:42.000Z","updated_at":"2025-01-11T19:36:45.000Z","dependencies_parsed_at":"2024-03-10T13:46:56.141Z","dependency_job_id":"69d73459-4454-4931-b0c7-d3b1bc454a7d","html_url":"https://github.com/plandes/grsync","commit_stats":null,"previous_names":[],"tags_count":19,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/plandes%2Fgrsync","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/plandes%2Fgrsync/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/plandes%2Fgrsync/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/plandes%2Fgrsync/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/plandes","download_url":"https://codeload.github.com/plandes/grsync/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":250471856,"owners_count":21436030,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["git","home-directory","linux","synchronization","unix","utility"],"created_at":"2024-11-08T21:23:22.543Z","updated_at":"2025-04-23T16:40:32.477Z","avatar_url":"https://github.com/plandes.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# GRSync: Persist create build out environments\n\n[![PyPI][pypi-badge]][pypi-link]\n[![Python 3.11][python311-badge]][python311-link]\n[![Build Status][build-badge]][build-link]\n\nThis program captures your home directory and synchronize it with another host\nusing Git repo metadata, symbolic links and persisted files.\n\nI wrote this because I couldn't find anything that creates repositories with\nthe idea of having a portable and easy to recreate your home directory on\nanother host.  If I've reinvented the wheel, please let me know :)\n\nMore specifically: it persists and creates build out environments in a nascent\naccount.  The program *memorizing* a users home directory and building it out\non another system (see [overview](#overview)).  This is done by:\n1. Copying files, directories and git repos configuration.\n2. Creating a distribution compressed file.\n3. Uncompress on the destination system and create repos.\n\nA future release will also synchronize and manage multiple GitHub repositories.\n\nA [utility script] also provided to do operations on all configured local git\nrepositories.\n\n\n## Documentation\n\nSee the [full documentation](https://plandes.github.io/grsync/index.html).  The\n[API reference](https://plandes.github.io/grsync/api.html) is also available.\n\n\n## Obtaining\n\nThe easist way to install the command line program is via the `pip` installer:\n```bash\npip install zensols.grsync\n```\n\nBinaries are also available on [pypi].\n\n## Overview\n\nNot only is the aim to create a repproducable development (or like)\nenvironment, it is also to create a *clean* environment.  This means we have\ntemporary directories we might expect to exist for our process(es), and of\ncourse repositories cloned in their nascent state.  These steps are summarized\nbelow:\n\n1. **Freeze**: This process captures the current host's setup and\nconfiguration (specified in the [configuration file]) and includes:\n* Empty directories.\n* Git repository meta data.\n* Locations of files to copy, top level directories of files to recursively\ncopy, where symlinks are considered files as well and currently not\nfollowed.  See [caveat](#symbolic-links).\n\nA sub-step of this process is *discover*, which reads the file system as\nindicated by the configuration file.  This includes reading git repostiory\nmetadata, identifying file metadata (i.e. permissions) etc.\n1. **Bootstraping**: create an Python virtual environment on the target machine\nthat can be loaded with this program and depenedencies.  This is not a\nnecessary step as the program is available as a [pip] install.  However, if\nthis step can be used to help automate new environments, after which, you\ncould futher add/install software with tools such as [Puppet].\n3. **Thaw**: This includes two steps:\n1. **File Extraction**: extracts the files from the distribution zip created\nin the *freeze* step.\n2. **Repo Cloning**: this step recursively clones all repositories.\n\n\n## Usage\n\nThe program has two phases: *freeze* and *thaw* (see [overview](#overview)).\nThe command line program is used twice: first on the *freeze* on the source\nsystem and then *thaw* on the target machine.\n\nSee [usage](https://plandes.github.io/grsync/doc/usage.html) for more information.\n\n\n## Configuration\n\nThe configuration is used the *freeze* phase to create the distribution file.\nThis fil contains all git repositories, files, empty directory paths on the\ncurrent file system that is stored to be *thawed* on the target system.\n\nSee [configuration](doc/configuration.md) for detailed documentation on\nconfiguration [test case yaml file](test-resources/midsize-test.yml) for an\nexample of a simple configuration file to capture a set of git repositories and\nsmall set of files.  The freeze/thaw/move test case uses [this configuration\nfile](test-resources/fs-test.yml), which is more comprehensive and up to date.\n\n\n## Symbolic Links\n\nAs mentioned in the [usage](#usage) section, symbolic links pointing to any\nfile in a repository are *froozen*, which means that integrity at thaw time is\nensured.  However, links **not** pointing to a repository are persisted, but\nthe files and directories they point to are not.\n\nA future release might have a *follow symbolic links* type functionality that\nallows this.  However, for now, you must include both the link and the data it\npoints to get this integrity.\n\n\n## Changelog\n\nAn extensive changelog is available [here](CHANGELOG.md).\n\n\n## Community\n\nPlease star this repository and let me know how and where you use this API.\nContributions as pull requests, feedback and any input is welcome.\n\n\n## License\n\n[MIT License](LICENSE.md)\n\nCopyright (c) 2020 - 2025 Paul Landes\n\n\n\u003c!-- links --\u003e\n[pypi]: https://pypi.org/project/zensols.grsync/\n[pypi-link]: https://pypi.python.org/pypi/zensols.grsync\n[pypi-badge]: https://img.shields.io/pypi/v/zensols.grsync.svg\n[python310-badge]: https://img.shields.io/badge/python-3.10-blue.svg\n[python310-link]: https://www.python.org/downloads/release/python-3100\n[python311-badge]: https://img.shields.io/badge/python-3.11-blue.svg\n[python311-link]: https://www.python.org/downloads/release/python-3110\n[build-badge]: https://github.com/plandes/grsync/workflows/CI/badge.svg\n[build-link]: https://github.com/plandes/grsync/actions\n\n[Python 3.9]: https://www.python.org\n[PyYAML]: https://pyyaml.org\n[test configuration]: test-resources/grsync-test.yml\n\n[maven profiles]: https://maven.apache.org/guides/introduction/introduction-to-profiles.html\n[configuration file]: test-resources/midsize-test.yml#L29\n[configuration file profile entry]: test-resources/midsize-test.yml#L29\n[pip]: https://docs.python.org/3/installing/index.html\n[Puppet]: https://en.wikipedia.org/wiki/Puppet_(software)\n[utility script]: https://plandes.github.io/grsync/doc/usage.html#utility-git-script\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fplandes%2Fgrsync","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fplandes%2Fgrsync","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fplandes%2Fgrsync/lists"}