I wanted a tool to help manage logging into lots of systems with lots of files and tools that need to be in lots of places. But some systems are for work, others for play, others for photography, etc. And a different collection of files are needed on each system. How can I manage some systems that are both photography and play but not work? What can do I when switching between them?
git soc
is going to be the answer.
- multi-processing for speed of operating on multiple repositories at once
- configuration for each registration stored as editable yaml
Works! But I'm in the process of rewriting lots of it because, well, let's just say I didn't know python very well when I started the project.
pip install git-soc
# cd ~/src/
# git clone https://github.com/hardaker/git-soc.git
# cd git-soc
# git soc register github/git-soc
-- registering ~/lib/git-soc.d/work/github.yml
# cd ~/lib/org
# git soc register personal/org
-- registering ~/lib/git-soc.d/personal/org.yml
# cd ~
# git soc status
/home/hardaker/lib/org
/home/hardaker/src/git-soc d<>
(d = dirty)
(> = needs push)
(< = needs merge)
# git soc push
/home/hardaker/src/git-soc fae63ca..0bb41cb
/home/hardaker/lib/org [up to date]
# git soc fetch
/home/hardaker/lib/org pulled
/home/hardaker/src/git-soc won't: dirty
# git soc pull
/home/hardaker/lib/org 92e6422..831ba44
/home/hardaker/src/git-soc won't: dirty
# git soc pushpull
... the same as both the above two commands ...
# git soc cmd "ls .git"
--- /home/hardaker/lib/org
running 'ls .git' in /home/hardaker/lib/org
branches config FETCH_HEAD hooks info MERGE_RR ORIG_HEAD refs
COMMIT_EDITMSG description HEAD index logs objects packed-refs rr-cache
--- /home/hardaker/src/git-soc
running 'ls .git' in /home/hardaker/src/git-soc
branches COMMIT_EDITMSG.~2~ config HEAD info objects refs
COMMIT_EDITMSG COMMIT_EDITMSG.~30~ description hooks logs ORIG_HEAD rr-cache
COMMIT_EDITMSG.~1~ COMMIT_EDITMSG.~31~ FETCH_HEAD index MERGE_RR packed-refs
These registration flags are supported today:
Auto-commits any outstanding chasges; useful constantly saved settings, files, emacs org files, etc.
Whether or not to clone a repository if it doesn't exist. By default, things are cloned but a repo YAML file may set "clone: false" to disable it from being pulled if it doesn't exist.
- auto discover new commands
- add known files
- git annex support
- register with other arguments
- auto_add
- Supports
git annex
for large files - Easy configuration (automatic but editing yaml is possible if needed)
- Support for bootstrapping with ansible
- Startup from just a set of yaml files retrieved from another system (after a new yaml files are found, it should auto-clone everything needed)
Right now a number of other projects exist to manage a large collection of git repos, but they all don't quite match what I needed, so I'm starting a new one.
-
antlink - great for managing a single tree of a lot of repos, with support for partial tree-branch checkouts (the default) and grafting of external gitrepos. Still a single place for a tree root to exist (though you could symlink in). Doesn't support
git annex
. We hope to support antlink sub-trees within git-soc. -
repo - the repo management tool for the android toolkit. Again, a large-tree collection but with poor documentation.
-
gr:
-
mu: if there was one I would emulate as much as possible, it's this one. But that has no interactive support and it's configuration isn't splittable.
-
gitsync: I used this for a while and it supports a good registration mechanism, but is entirely automatic and doesn't support annex.