{"id":13478767,"url":"https://github.com/svetlyak40wt/dotfiler","last_synced_at":"2025-05-16T17:07:00.558Z","repository":{"id":13347573,"uuid":"16034782","full_name":"svetlyak40wt/dotfiler","owner":"svetlyak40wt","description":"Shell agnostic git based dotfiles package manager, written in Python.","archived":false,"fork":false,"pushed_at":"2024-11-12T22:11:21.000Z","size":75,"stargazers_count":245,"open_issues_count":5,"forks_count":30,"subscribers_count":11,"default_branch":"master","last_synced_at":"2025-05-12T02:05:54.336Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/svetlyak40wt.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":null,"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":"2014-01-18T21:51:41.000Z","updated_at":"2025-03-23T02:43:37.000Z","dependencies_parsed_at":"2024-12-05T09:15:54.734Z","dependency_job_id":null,"html_url":"https://github.com/svetlyak40wt/dotfiler","commit_stats":null,"previous_names":[],"tags_count":4,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/svetlyak40wt%2Fdotfiler","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/svetlyak40wt%2Fdotfiler/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/svetlyak40wt%2Fdotfiler/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/svetlyak40wt%2Fdotfiler/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/svetlyak40wt","download_url":"https://codeload.github.com/svetlyak40wt/dotfiler/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254573588,"owners_count":22093731,"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":[],"created_at":"2024-07-31T16:02:02.514Z","updated_at":"2025-05-16T17:07:00.520Z","avatar_url":"https://github.com/svetlyak40wt.png","language":"Python","readme":"Dotfiler — the ultimate solution for managing dotfiles!\n=======================================================\n\n[![changelog](http://allmychanges.com/p/python/dotfiler/badge/)](http://allmychanges.com/p/python/dotfiler/?utm_source=badge)\n\nThis was inspired by [Zach Holman's dotfiles](https://github.com/holman/dotfiles) and\n[homesick](https://github.com/technicalpickles/homesick), but was made according the KISS priciple.\n\nThere are very few commands in dotfiler, only: `update`, `add` and `status`:\n\n* `update` will pull from all version controlled envs (env is a subdirectory inside\n  the `~/.dotfiles` dir, where different configs and scripts could be placed). After that,\n  `update` will make all that mumbo-jumbo, symlinking, and removing old broken symlinks.\n  If you want to see what will it do without but afraid to loose some files, just fire\n  `dot update --dry --verbose`.\n* `add` allows you to clone one or more repositories with configs. For example, this\n  will clone my emacs's configs: `dot add svetlyak40wt/dot-emacs`. Of course you could\n  use a full url, like this: \u003chttps://github.com/svetlyak40wt/dot-emacs\u003e or\n  \u003cgit@github.com:svetlyak40wt/dot-emacs.git\u003e.\n* `status` will show you if there are any uncommited changes in the envs and\n  warn you if some of them aren't version controlled.\n\nInstallation\n------------\n\n1. Clone this project somewhere like `$HOME/.dotfiles` and add `$HOME/.dotfiles/bin` into your `PATH`.\n2. Clone some config files into the `$HOME/.dotfiles`.\n3. Run `dot update` to make all necessary symlinks.\n4. Have a profit!\n\nOverview\n------------\n\nFrom user's point of view — very simply. You just create a separate subdirectory called \"environments\", put configs there and then run `dot update`. Dotfiler will make all necessary symlinks automagickally. **What makes dotfiler better, than other solutions?** It's ability to merge files from different environments into one target dir. Here's an example:\n\nSuppose, you have a `~/.zshrc` which sources all configs from `~/.zsh/`. And you want to separate default configs from the configs only needed on work machines. In most config managers you will end up with two separate repositories, each sharing part of zsh config. But dotfiler allows you to do a much more clever thing — separate zsh (actually any other configs too, if they understand `include`) into the different environments.\n\nIn this example:\n\n* The first environment, let's call it `base`, will contain the file `base/.zsh/generic`.\n* The second environment, called `atwork`, will have `atwork/.zsh/secret-settings`. \n\nBoth of them, of course, could include other files, not only zsh configs. Most importantly, these environment now can be stored separately and installed on each machine separately. Now, you can share you default configs on the GitHub, but keep work configs in a separate, private repository. \n\nYou can also add new environments using `dot add \u003curl\u003e \u003curl\u003e...`. (Probably the process of adding environments on a fresh machine will be even more improved, when I introduce a 'meta-environments', which will allow you to make one env depend on other envs and pull them automatically when adding)\n\nGet involved\n------------\n\nDon't hesitate to try dotfiler. Just install it and make your configs more structured.  Extract useful ones and share them on GitHub, as I did. Then send me a link with a short description (or make a pull request), and I'll add you repositories to the end of this page.\n\nDotfiler's core functionality is fully tested, but that doesn't mean there aren't bugs. If you find one, file the issue on Github, or even better, try to write a test and/or fix for that use case and send it as a pull request. To run all tests, install nose and run `nosetests bin/lib/dot`. \n\nHow it works\n------------\n\nFirst dotfiler, walks through all files and all environments collecting dirs and files mentioned in more than one environment as a tree. If a file with same filename exits in more than one environment this is an error and `dot` will tell you they are conflicting. \n\nThen, using this tree, it generates source—target pairs, where source is a file inside the environment dir and target is where it should be in your home dir. \n\nFinally, `dot` generates actions for each pair. Actions could be `rm`, `mkdir`, `link`, `already-linked` and `error`. Action are generated based on the current file system's state and previously generated actions. Here is a simple example:\n\nThis is a structure of the `~/.dotfiles` with two separate enviroments `zsh` and `emacs`:\n\n```\n.\n├── emacs\n│   └── .emacs.d\n│       ├── .gitignore\n│       ├── COPYING\n│       ├── README.markdown\n│       ├── art\n│       │   ├── debian-changelog-mode.el\n│       │   ├── lisp.el\n│       │   ├── multiple.el\n│       │   ├── my-org.el\n│       │   ├── my-python.el\n│       │   └── pymacs.el\n│       ├── art.el\n│       ├── changelog.md\n│       ├── customizations.el\n│       ├── init.el\n│       ├── modules\n│       │   ├── starter-kit-bindings.el\n│       │   ├── starter-kit-eshell.el\n│       │   ├── starter-kit-js.el\n│       │   ├── starter-kit-lisp.el\n│       │   ├── starter-kit-perl.el\n│       │   └── starter-kit-ruby.el\n│       ├── snippets\n│       │   └── python-mode\n│       │       └── pdb.yasnippet\n│       ├── starter-kit-defuns.el\n│       ├── starter-kit-misc.el\n│       ├── starter-kit-pkg.el\n│       ├── starter-kit.el\n│       ├── tar.sh\n│       ├── ubuntu -\u003e art\n│       ├── ubuntu.el -\u003e art.el\n│       ├── vagrant -\u003e art\n│       └── vagrant.el -\u003e art.el\n└── zsh\n    ├── .bash_profile\n    ├── .zsh\n    │   ├── 00-options\n    │   ├── 01-prompt-functions\n    │   ├── 02-prompt-colors\n    │   ├── 03-prompt\n    │   ├── aliases\n    │   ├── ash\n    │   ├── dotfiler\n    │   └── ssh-agent\n    └── .zshrc\n```\n\nAnd here is result of `dot update`:\n\n```\n[art@art-osx:~/.dotfiles]% dot update\nLINK    Symlink from /home/art/.bash_profile to /home/art/.dotfiles/zsh/.bash_profile was created\nLINK    Symlink from /home/art/.emacs.d to /home/art/.dotfiles/emacs/.emacs.d was created\nLINK    Symlink from /home/art/.zsh to /home/art/.dotfiles/zsh/.zsh was created\nLINK    Symlink from /home/art/.zshrc to /home/art/.dotfiles/zsh/.zshrc was created\n```\n\nAs you can see, dotfiler creates four symlinks, two to files, and two to directories. But this was simple situation\nwith no overlapping subdirectories.\n\nHere is another example, showing how config merging works:\n\n```\n.\n├── git\n│   ├── .gitconfig\n│   └── .zsh\n│       ├── git-aliases\n│       └── git-prompt\n└── zsh\n    ├── .bash_profile\n    ├── .zsh\n    │   ├── 00-options\n    │   ├── 01-prompt-functions\n    │   ├── 02-prompt-colors\n    │   ├── 03-prompt\n    │   ├── aliases\n    │   ├── ash\n    │   ├── dotfiler\n    │   └── ssh-agent\n    └── .zshrc\n```\n\nIn this case, we have two environments and both of them have configs for zsh. For this situation,\ndotfiler will try to create a directory `~/.zsh` and will make symlinks there:\n\n```\n[art@art-osx:~/.dotfiles]% dot update\nLINK    Symlink from /home/art/.bash_profile to /home/art/.dotfiles/zsh/.bash_profile was created\nLINK    Symlink from /home/art/.gitconfig to /home/art/.dotfiles/git/.gitconfig was created\nMKDIR   Directory /home/art/.zsh was created.\nLINK    Symlink from /home/art/.zsh/00-options to /home/art/.dotfiles/zsh/.zsh/00-options was created\nLINK    Symlink from /home/art/.zsh/01-prompt-functions to /home/art/.dotfiles/zsh/.zsh/01-prompt-functions was created\nLINK    Symlink from /home/art/.zsh/02-prompt-colors to /home/art/.dotfiles/zsh/.zsh/02-prompt-colors was created\nLINK    Symlink from /home/art/.zsh/03-prompt to /home/art/.dotfiles/zsh/.zsh/03-prompt was created\nLINK    Symlink from /home/art/.zsh/aliases to /home/art/.dotfiles/zsh/.zsh/aliases was created\nLINK    Symlink from /home/art/.zsh/ash to /home/art/.dotfiles/zsh/.zsh/ash was created\nLINK    Symlink from /home/art/.zsh/dotfiler to /home/art/.dotfiles/zsh/.zsh/dotfiler was created\nLINK    Symlink from /home/art/.zsh/git-aliases to /home/art/.dotfiles/git/.zsh/git-aliases was created\nLINK    Symlink from /home/art/.zsh/git-prompt to /home/art/.dotfiles/git/.zsh/git-prompt was created\nLINK    Symlink from /home/art/.zsh/ssh-agent to /home/art/.dotfiles/zsh/.zsh/ssh-agent was created\nLINK    Symlink from /home/art/.zshrc to /home/art/.dotfiles/zsh/.zshrc was created\n```\n\nHow to ignore some files\n========================\n\nEdit a config file `~/.dotfiles/.dotignore` and add any regex patterns you need.\n\nEnvironments\n------------\n\n* [svetlyak40wt/dot-emacs](https://github.com/svetlyak40wt/dot-emacs) — my emacs config, based on [Emacs Starter Kit](http://github.com/technomancy/emacs-starter-kit).\n* [svetlyak40wt/dot-zsh](https://github.com/svetlyak40wt/dot-zsh) — generic config for zsh, which sources all config files from `~/.zsh` directory.\n* [svetlyak40wt/dot-tmux](https://github.com/svetlyak40wt/dot-tmux) — config and python wrapper for tmux.\n* [svetlyak40wt/dot-git](https://github.com/svetlyak40wt/dot-git) — config and shell aliases for git.\n* [svetlyak40wt/dot-helpers](https://github.com/svetlyak40wt/dot-helpers) — misc command line helpers (see repo's README for full list).\n* [svetlyak40wt/dot-osx](https://github.com/svetlyak40wt/dot-osx) — OSX keybindings and settings.\n* [svetlyak40wt/dot-python-dev](https://github.com/svetlyak40wt/dot-python-dev) – emacs, zsh and pudb settings for Python developement.\n* [svetlyak40wt/dot-growl](https://github.com/svetlyak40wt/dot-growl) – A helper to use growl notifications from ssh sessions.\n* [svetlyak40wt/dot-lisp](https://github.com/svetlyak40wt/dot-lisp) – Dotfiler's config for Lisp development. \n* [svetlyak40wt/dot-osbench](https://github.com/svetlyak40wt/dot-osbench) – A helper to setup PATH to [OSBench's](https://github.com/svetlyak40wt/osbench) bin directory.\n\nAnother solutions\n-----------------\n\n* [skeswa/dotfiler](https://github.com/skeswa/dotfiler) – another utility with the same name but completely different approach.\n","funding_links":[],"categories":["Python","Shell Package Management"],"sub_categories":["Directory Navigation"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsvetlyak40wt%2Fdotfiler","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsvetlyak40wt%2Fdotfiler","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsvetlyak40wt%2Fdotfiler/lists"}