{"id":19382567,"url":"https://github.com/neuro-ml/bev","last_synced_at":"2025-08-03T08:05:29.555Z","repository":{"id":39676126,"uuid":"378495331","full_name":"neuro-ml/bev","owner":"neuro-ml","description":"Flexible version control for files and folders","archived":false,"fork":false,"pushed_at":"2024-11-18T11:04:03.000Z","size":233,"stargazers_count":6,"open_issues_count":1,"forks_count":2,"subscribers_count":5,"default_branch":"master","last_synced_at":"2025-07-04T18:51:22.404Z","etag":null,"topics":["data","git","python","storage","version-control"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/neuro-ml.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","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}},"created_at":"2021-06-19T20:02:19.000Z","updated_at":"2025-02-20T02:39:56.000Z","dependencies_parsed_at":"2023-02-16T10:46:24.561Z","dependency_job_id":"6564ac30-c6c9-4d0c-8f07-494eb972285d","html_url":"https://github.com/neuro-ml/bev","commit_stats":{"total_commits":115,"total_committers":1,"mean_commits":115.0,"dds":0.0,"last_synced_commit":"ce6912c2362d7ea5825bdf2810dd1f0dda5fe5e4"},"previous_names":[],"tags_count":38,"template":false,"template_full_name":null,"purl":"pkg:github/neuro-ml/bev","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/neuro-ml%2Fbev","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/neuro-ml%2Fbev/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/neuro-ml%2Fbev/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/neuro-ml%2Fbev/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/neuro-ml","download_url":"https://codeload.github.com/neuro-ml/bev/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/neuro-ml%2Fbev/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":268512159,"owners_count":24261887,"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","status":"online","status_checked_at":"2025-08-03T02:00:12.545Z","response_time":2577,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"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":["data","git","python","storage","version-control"],"created_at":"2024-11-10T09:22:14.477Z","updated_at":"2025-08-03T08:05:29.517Z","avatar_url":"https://github.com/neuro-ml.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![codecov](https://codecov.io/gh/neuro-ml/bev/branch/master/graph/badge.svg)](https://codecov.io/gh/neuro-ml/bev)\n[![pypi](https://img.shields.io/pypi/v/bev?logo=pypi\u0026label=PyPi)](https://pypi.org/project/bev/)\n![License](https://img.shields.io/github/license/neuro-ml/bev)\n[![PyPI - Downloads](https://img.shields.io/pypi/dm/bev)](https://pypi.org/project/bev/)\n![GitHub branch checks state](https://img.shields.io/github/checks-status/neuro-ml/bev/master)\n\nFlexible version control for files and folders.\n\n# Install\n\nThe simplest way is to get it from PyPi:\n\n```shell\npip install bev\n```\n\n# Cheatsheet\n\n### Adding new files\n\n```shell\nls\n# image.png ids.json some-folder\nbev add image.png\nls\n# image.png.hash ids.json some-folder\nbev add ids.json some-folder\nls\n# image.png.hash ids.json.hash some-folder.hash\n\ngit add image.png.hash ids.json.hash some-folder.hash\ngit commit -m \"added new files\"\n```\n\n### Restoring the hashed files and folders\n\n```shell\nls\n# image.png.hash ids.json.hash some-folder.hash\nbev pull image.png.hash --mode copy\nls\n# image.png ids.json.hash some-folder.hash\nbev pull some-folder.hash --mode copy\nls\n# image.png ids.json.hash some-folder\n```\n\n### Browsing a hashed folder\n\nIn this recipe we \"expand\" the hashed folder and fill it with the hashes of the files it contains.\nThis is much faster than copying back the entire folder.\n\n```shell\nls\n# image.png.hash ids.json.hash some-folder.hash\nbev pull some-folder.hash --mode hash\nls\n# image.png.hash ids.json.hash some-folder\nls some-folder\n# photo.jpg.hash some-text-file.txt.hash nested-folder\n```\n\nAfterwards you can add the folder back\n\n```shell\nbev add some-folder\nls\n# image.png.hash ids.json.hash some-folder.hash\n```\n\n# Getting started\n\n1. Choose a folder for your repository and create a basic config (`.bev.yml`):\n\n```yaml\nmain:\n  storage: /path/to/storage/folder\n\nmeta:\n  hash: sha256\n```\n\n2. Run `init`\n\n```shell\nbev init\n```\n\n3. Add files to bev\n\n```shell\nbev add /path/to/some/file.json\n# also can provide several paths\nbev add /path/to/some/folder/ /path/to/some/image.png\n```\n\n4. ... and to git\n\n```shell\ngit add file.json.hash folder.hash image.png.hash\ngit commit -m \"added files\"\n```\n\n5. Access the files from python\n\n```python\nimport imageio\nfrom bev import Repository\n\n# `version` can be a commit hash or a git tag \nrepo = Repository('/path/to/repo', version='8a7fe6')\nimage = imageio.imread(repo.resolve('image.png'))\n```\n\n6. Or from cli\n\n```shell\n# replace the folder's hash by the hashes of its files\nbev pull folder.hash --mode hash\n# entirely restore the folder (inverse of `bev add folder`)\nbev pull folder.hash --mode copy\n# same for files\nbev pull image.png.hash --mode copy\n```\n\n### Advanced usage\n\nHere are some tutorials that cover more advanced configuration, including multiple storage locations and machines:\n\n1. [Create a repository](https://github.com/neuro-ml/bev/wiki/Creating-a-repository) - needed only at first time setup\n2. [Adding files](https://github.com/neuro-ml/bev/wiki/Adding-files)\n3. [Accessing files](https://github.com/neuro-ml/bev/wiki/Accessing-the-stored-files)\n\n# Why not DVC?\n\n[DVC](https://github.com/iterative/dvc) is a great project, and we took inspiration from it while designing `bev`.\nHowever, out lab has several requirements that `DVC` doesn't meet:\n\n1. Our data caches are spread across multiple HDDs - we need support for multiple cache locations\n2. We have multiple machines, and each of them has a different storage configuration: locations, number of HDDs, their\n   volumes - we need a flexible way of choosing the right config depending on the machine\n3. Often we simultaneously conduct experiments on different versions of the same data - we need easy access to multiple\n   version of the same data\n4. The need for `dvc checkout` after `git checkout` is error-prone, because it can lead to situations when the data is\n   not consistent with the current commit - we need a more constrained relation between data and `git`\n\n`bev` supports all four out of the box!\n\nHowever, if these requirements are not essential to your project, you may want to stick with `DVC` - its community and\ntests coverage is much larger.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fneuro-ml%2Fbev","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fneuro-ml%2Fbev","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fneuro-ml%2Fbev/lists"}