/git-notes

Sync your personal notes through Git automatically

Primary LanguageGoMIT LicenseMIT

Fork Info

This fork adds the ability to use non-master branches, by inspecting the local repos and using whichever branch they currently have checked out.

This allows things to work when the user has a non-default init.defaultbranch setting.

Fork TODO

  • Use a more meaningful commit message, perhaps holding the filenames.
  • Support branch names with legal-but-uncommon characters (space, ", ', etc)
  • Set the commit email in the config file, perhaps.

Git Notes

CircleCI codecov Gitter

Your personal notes synced through Git

Git Notes is in its alpha stage. I'd love to chat to users who want to use Git Notes. Please join our Gitter channel.


Git Notes is a locally installed app that detects changes in a Git repo and push the changes immmediately to Github, Gitlab, or your own Git host. Here are the advantages:

  • You can use your fav editor like Vim, Emacs, Sublime, or Atom.
  • Your notes are more permanent. When was the last time you deleted a git repo? I don't remember mine either. Storing Github is how you're able to keep your several-year-old notes.
  • Your notes are versioned by Git.
  • Conflicts are handled intuitively for programmers. You see the git-style conflict text in your notes.

I hope Git Notes hits all the notes for you as it does for me. Enjoy!

Installation

  1. Setup your personal note directory with Git. Make the master branch, commit, add origin, and git push origin master -u.
  2. Clone https://github.com/tanin47/git-notes to $GOPATH/src/github.com/tanin47/git-notes. If your GOPATH is empty, maybe you might want to use ~/go.
  3. Make the config file that contains the paths that will be synced automatically by Git Notes. See the example: git-notes.json.example
  4. Build the binary with go build

The binary will be built as git-notes in the root dir.

You can run it by: git-notes [your-config-file].

To make Git Notes run at the startup and in the background, please follow the specific platform instruction below:

Ubuntu

Move ./service_conf/linux.git-notes.service to /etc/systemd/system/git-notes.service

Modify /etc/systemd/user/git-notes.service to use the binary that you built above with and your config file.

Reload service file after moving: systemctl daemon-reload

Enable Git Notes to start at boot: systemctl enable git-notes.service

Run: systemctl start git-notes.service

Read logs: journalctl -u git-notes.service --follow

Start after booting: systemctl enable git-notes.service

Mac

Move ./service_conf/mac.git-notes.plist to ~/Library/LaunchAgents/git-notes.plist

Modify ~/Library/LaunchAgents/git-notes.plist to use the binary that you built above with and your config file.

Run and start after booting:

  1. launchctl load ~/Library/LaunchAgents/git-notes.plist
  2. launchctl start ~/Library/LaunchAgents/git-notes.plist

If the plist file is changed, you will need to unload it first with: launchctl unload ~/Library/LaunchAgents/git-notes.plist.

Read logs: use Console.app. Search for logger.

Windows

TBD

Android and iOS

TBD: I want to build apps for this!

Architecture

Our main engine observes the current state of the git repo and make one action to transition to the next state.

Here are all the states:

  • dirty: Unstaged change -> git add . -> staged
  • staged: Staged change -> git commit -m 'Updated' -> ahead or out-of-sync
  • ahead: Ahead of the remote branch and can fast forward -> git push -> synced
  • out_of_sync: The remote branch has unseen commits -> git pull -> ahead (no conflict) or dirty (there are conflicts)
  • synced: The local branch matches the remote branch

This loop runs until no changes are observed. If the engine doesn't end on synced, something is wrong.

When the file change is detected, we invoke the engine again.

The file changes are detected by running git status every 10 seconds.

Develop

  • go build to build the binary
  • go run . to run the application
  • go test to run tests
  • gofmt -w . to format all files
  • goimports -w . to organize imports in all files