gitwatch / gitwatch

Watch a file or folder and automatically commit changes to a git repo easily.
GNU General Public License v3.0
1.51k stars 218 forks source link
autocommit git

gitwatch

A bash script to watch a file or folder and commit changes to a git repo

What to use it for?

That's really up to you, but here are some examples:

Installation

gitwatch can be installed in various ways.

From Source

gitwatch can be installed from source by simply cloning the repository and putting the shell script into your $PATH. The commands below will do that for you if /usr/local/bin is in your $PATH. You may need to invoke install with sudo.

git clone https://github.com/gitwatch/gitwatch.git
cd gitwatch
[sudo] install -b gitwatch.sh /usr/local/bin/gitwatch

Update

If you installed gitwatch from source, you can update it by following the exact same steps (or git pull rather than clone if you kept the repository around).

bpkg

gitwatch can be installed with bpkg. Make sure you have bpkg installed before running the command below. You may need to invoke bpkg with sudo when using the -g flag.

[sudo] bpkg install -g gitwatch/gitwatch

Archlinux

There is an AUR package for Archlinux. Install it with you favorite aur helper.

NixOs

As Module

If you add gitwatch to your flake, and append field gitwatch.modules to your nixosSystem modules, then you can enable services.gitwatch.*:

services.gitwatch.<service name> = {
    enable = true;
    path = "/home/me/my-repo";
    remote = "git@github.com:me/my-repo.git";
    user = "me";
};

This will make NixOS to create systemd service named gitwatch-<service name>. Note that the service does not start before reboot, or alternatively if it is started manually: systemctl start gitwatch-<service name>.

As Package

You can to play around with nix package inside this repository. Call nix run in this repository to run gitwatch script or nix shell to enter shell with gitwatch command available.

Requirements

To run this script, you must have installed and globally available:

Notes for Mac

If running on OS X, you'll need to install the following Homebrew tools:

brew install fswatch
brew install coreutils

What it does

When you start the script, it prepares some variables and checks if the file or directory given as input really exists.

Then it goes into the main loop (which will run forever, until the script is forcefully stopped/killed), which will:

Notes:

Usage

gitwatch.sh [-r <remote> [-b <branch>]] <file or directory to watch>

It is expected that the watched file/directory are already in a git repository (the script will not create a repository). If a folder is being watched, this will be watched fully recursively; this also means that all files and sub-folders added and removed from the directory will always be added and removed in the next commit. The .git folder will be excluded from the inotifywait call so changes to it will not cause unnecessary triggering of the script.

If you have any large files in your repository that are changing frequently, you might wish to ignore them with a .gitignore file.

Starting on Boot

If you want to have the script auto-started upon boot, the method to do this depends on your operating system and distribution. If you have a GUI dialog to set up startup launches, you might want to use that, so you can more easily find and change the startup script calls later on.

Please also note that if either of the paths involved (script or target) contains spaces or special characters, you need to escape them accordingly; if you don't know how to do that, the internet will help you, or feel free to ask here or contact me directly.

SysVInit

A central place to put startup scripts on Linux is generally /etc/rc.local (to my knowledge; only tested and confirmed on Ubuntu). This file, if it has the +x bit, will be executed upon startup, by the root user account. If you want to start gitwatch from rc.local, the recommended way to call it is:

su -c "/absolute/path/to/script/gitwatch.sh /absolute/path/to/watched/file/or/folder" -l <username> &

The <username> bit should be replaced with your username or that of any other (non-root) user account; it only needs write-access to the git repository of the file/folder you want to watch. The ampersand (&) at the end sends the launched process into the background (this is important if you have other calls in rc.local after the mentioned line, because the gitwatch call does not usually return).

systemd

Other Articles

On the Gitwatch Wiki

Community Articles