aboutsummaryrefslogtreecommitdiff
path: root/doc/tips
diff options
context:
space:
mode:
Diffstat (limited to 'doc/tips')
-rw-r--r--doc/tips/automatically_adding_metadata.mdwn24
-rwxr-xr-xdoc/tips/automatically_adding_metadata/pre-commit-annex61
2 files changed, 85 insertions, 0 deletions
diff --git a/doc/tips/automatically_adding_metadata.mdwn b/doc/tips/automatically_adding_metadata.mdwn
new file mode 100644
index 000000000..bd8fea737
--- /dev/null
+++ b/doc/tips/automatically_adding_metadata.mdwn
@@ -0,0 +1,24 @@
+git-annex's [[metadata]] works best when files have a lot of useful
+metadata attached to them.
+
+To make git-annex automatically set the year and month when adding files,
+run `git config annex.genmetadata true`.
+
+A git commit hook can be set up to extract lots of metadata from files
+like photos, mp3s, etc.
+
+* Install the `extract` utility, from <http://www.gnu.org/software/libextractor/>
+ `apt-get install extract`
+* Download [[pre-commit-annex]] and install it in your git-annex repository
+ as `.git/hooks/pre-commit-annex`.
+ Remember to make the script executable!
+* Run: `git config metadata.extract "artist album title camera_make video_dimensions"`
+
+Now any fields you list in metadata.extract to will be extracted and
+stored when files are committed.
+
+To get a list of all possible fields, run: `extract -L | sed ' ' _`
+
+By default, if a git-annex already has a metadata field for a file,
+its value will not be overwritten with metadata taken from files.
+To allow overwriting, run: `git config metadata.overwrite true`
diff --git a/doc/tips/automatically_adding_metadata/pre-commit-annex b/doc/tips/automatically_adding_metadata/pre-commit-annex
new file mode 100755
index 000000000..4897493cf
--- /dev/null
+++ b/doc/tips/automatically_adding_metadata/pre-commit-annex
@@ -0,0 +1,61 @@
+#!/bin/sh
+# This script can be used to add git-annex metadata to files when they're
+# committed.
+#
+# Copyright 2014 Joey Hess <id@joeyh.name>
+# License: GPL-3+
+
+extract="$(git config metadata.extract || true)"
+want="$(perl -e 'print (join("|", map {s/_/ /g; "^$_ - "} (split " ", shift())))' "$extract")"
+
+if [ -z "$want" ]; then
+ exit 0
+fi
+
+echo "$want"
+
+case "$(git config --bool metadata.overwrite || true)" in
+ true)
+ overwrite=1
+ ;;
+ *)
+ overwrite=""
+ ;;
+esac
+
+# By default, any existing metadata git-annex has stored is not overwritten
+# with metadata taken from files. Uncomment this to enable.
+#overwrite_metadata=1
+
+addmeta () {
+ file="$1"
+ field="$2"
+ value="$3"
+ afield="$(echo "$field" | tr ' ' _)"
+ if [ "$overwrite" ]; then
+ p="$afield=$value"
+
+ else
+ p="$afield?=$value"
+ fi
+ git -c annex.alwayscommit=false annex metadata "$file" -s "$p" --quiet
+}
+
+if git rev-parse --verify HEAD >/dev/null 2>&1; then
+ against=HEAD
+else
+ # Initial commit: diff against an empty tree object
+ against=4b825dc642cb6eb9a060e54bf8d69288fbee4904
+fi
+
+IFS="
+"
+for f in $(git diff-index --name-only --cached $against); do
+ if [ -e "$f" ]; then
+ for l in $(extract "$f" | egrep "$want"); do
+ field="${l%% - *}"
+ value="${l#* - }"
+ addmeta "$f" "$field" "$value"
+ done
+ fi
+done