{"id":28885183,"url":"https://github.com/en9inerd/sdfm","last_synced_at":"2026-05-14T22:49:39.603Z","repository":{"id":301808858,"uuid":"992941366","full_name":"en9inerd/sdfm","owner":"en9inerd","description":"Simple DotFiles Manager","archived":false,"fork":false,"pushed_at":"2025-10-05T23:18:53.000Z","size":70,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2025-10-06T01:12:59.675Z","etag":null,"topics":["bash","bash-script","cli","dotfiles","script"],"latest_commit_sha":null,"homepage":"","language":"Shell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/en9inerd.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,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-05-30T00:35:28.000Z","updated_at":"2025-10-05T23:18:57.000Z","dependencies_parsed_at":"2025-08-10T04:14:33.002Z","dependency_job_id":null,"html_url":"https://github.com/en9inerd/sdfm","commit_stats":null,"previous_names":["en9inerd/sdfm"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/en9inerd/sdfm","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/en9inerd%2Fsdfm","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/en9inerd%2Fsdfm/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/en9inerd%2Fsdfm/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/en9inerd%2Fsdfm/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/en9inerd","download_url":"https://codeload.github.com/en9inerd/sdfm/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/en9inerd%2Fsdfm/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":280673151,"owners_count":26371379,"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-10-23T02:00:06.710Z","response_time":142,"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":["bash","bash-script","cli","dotfiles","script"],"created_at":"2025-06-20T22:04:52.288Z","updated_at":"2026-05-14T22:49:39.592Z","avatar_url":"https://github.com/en9inerd.png","language":"Shell","funding_links":[],"categories":[],"sub_categories":[],"readme":"# sdfm - Simple DotFiles Manager\n\nA lightweight Bash tool for managing your dotfiles in a Git repository with easy backup and environment switching.\n\n---\n\n## Features\n\n- Initialize or clone a dotfiles repository  \n- Track files and directories under `$HOME`  \n- Create and switch between environments (branches)  \n- Backup existing files before applying new ones  \n- Tag and version your configurations  \n- Synchronize with remote  \n- Minimal dependencies (Bash, Git, rsync)\n\n---\n\n## Installation\n\nYou can install **sdfm** automatically with the provided `install.sh` script:\n\n```bash\ncurl -fsSL https://raw.githubusercontent.com/en9inerd/sdfm/master/install.sh | bash\n```\n\n## Usage\n\n```bash\nsdfm \u003ccommand\u003e [options]\n```\n\nRun `sdfm help` for a full command list:\n\n```\nRepository Setup:\n  init --remote \u003curl\u003e [--branch \u003cbranch\u003e]        Initialize dotfiles repo\n  clone \u003curl\u003e [--branch \u003cbranch\u003e]                Clone remote repo\n  create-empty-branch \u003cbranch\u003e                   Create new empty orphan branch\n\nEnvironment Management:\n  switch \u003cbranch\u003e                                Switch to environment (Git branch)\n  copy \u003cnew-branch\u003e                              Create and switch to a new branch\n  sync [--force] [--dry-run]                     Sync with remote (requires --force)\n  pull [--merge]                                 Pull from remote (fast-forward default)\n  push                                           Push current branch\n  tag \u003cname\u003e                                     Create and push a tag\n  list-tags                                      List tags\n  checkout-tag \u003ctag\u003e                             Checkout a tag\n\nFile Tracking:\n  add \u003cfile\u003e...                                  Copy file(s) from $HOME to repo\n  rm \u003cfile\u003e...                                   Remove file(s) from repo\n  list                                           List tracked files\n  update [--dry-run]                             Update tracked files from $HOME\n  status                                         Show status\n  log                                            Show log\n  diff                                           Show differences between $HOME and repo\n  apply [--dry-run]                              Backup and apply dotfiles to $HOME\n\nBackup Maintenance:\n  list-backups                                   List available backups\n  restore \u003ctimestamp\u003e                            Restore files from a backup\n  cleanup-backup [--keep-days \u003cn\u003e] [--dry-run]   Delete old backups (default: 30 days)\n\nOther:\n  git \u003cargs\u003e                                     Run arbitrary git command in repo\n  help                                           Show this help\n```\n\n## Example Workflow\n\n1. Initialize a new repository  \n\n```bash\nsdfm init --remote git@github.com:yourname/dotfiles.git --branch main\n```\n\n2. Add and commit dotfiles  \n\n```bash\nsdfm add ~/.bashrc ~/.vimrc ~/.config/nvim\n```\n\n3. Push changes\n\n```bash\nsdfm push\n```\n\n4. Apply configuration\n\nThis backs up current files before overwriting them:\n\n```bash\nsdfm apply\n```\n\n5. Switch environments\n\nCreate a new branch:\n\n```bash\nsdfm copy work-env\n```\n\nSwitch to it:\n\n```bash\nsdfm switch work-env\n```\n\n6. Sync with remote  \n\n```bash\nsdfm sync --force\n```\n\n7. Tag configuration\n\n```bash\nsdfm tag initial-setup\n```\n\nList tags:\n\n```bash\nsdfm list-tags\n```\n\nCheckout a tagged version:\n\n```bash\nsdfm checkout-tag initial-setup\n```\n\n## Backups\n\nEvery `apply` creates a backup in:\n\n```bash\n$HOME/.local/share/sdfm/backups/\u003ctimestamp\u003e\n```\n\nList available backups:\n\n```bash\nsdfm list-backups\n```\n\nRestore from a backup:\n\n```bash\nsdfm restore 20260201143022\n```\n\nClean up old backups (older than 30 days by default):\n\n```bash\nsdfm cleanup-backup\nsdfm cleanup-backup --keep-days 7\nsdfm cleanup-backup --dry-run  # Preview what would be deleted\n```\n\n## Dry-Run Mode\n\nPreview changes before applying them:\n\n```bash\nsdfm apply --dry-run      # See what files would be overwritten\nsdfm update --dry-run     # See what files would be updated in repo\nsdfm sync --dry-run       # See what local changes would be discarded\n```\n\n## Safety Features\n\n- **Sensitive file warnings**: Adding files matching patterns like `.ssh/id_*`, `.env`, `*credentials*` will prompt for confirmation\n- **Sync protection**: `sync` requires `--force` flag if there are local changes to discard\n- **Automatic backups**: Every `apply` backs up existing files first\n\n## Requirements\n\n- Bash\n- Git\n- rsync\n\n## License\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fen9inerd%2Fsdfm","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fen9inerd%2Fsdfm","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fen9inerd%2Fsdfm/lists"}