From 6277f4c870c0b808d70220c68a5748c02820e02c Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Thu, 15 Jan 2009 22:48:46 -0500 Subject: [PATCH] Add git-remote file to lib. This adds a special type of git repository, where the .git directory is stored on a file server, to avoid wasting space with it on the client. --- debian/changelog | 8 ++++++++ lib/git-remote | 41 +++++++++++++++++++++++++++++++++++++++++ mr | 7 +++++++ 3 files changed, 56 insertions(+) create mode 100644 lib/git-remote diff --git a/debian/changelog b/debian/changelog index a90ccdc..1e807b0 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,11 @@ +mr (0.37) UNRELEASED; urgency=low + + * Add git-remote file to lib. + This adds a special type of git repository, where the .git directory + is stored on a file server, to avoid wasting space with it on the client. + + -- Joey Hess Thu, 15 Jan 2009 22:47:48 -0500 + mr (0.36) unstable; urgency=low * Add webcheckout command. See diff --git a/lib/git-remote b/lib/git-remote new file mode 100644 index 0000000..e671dde --- /dev/null +++ b/lib/git-remote @@ -0,0 +1,41 @@ +# This adds a special type of git repository, where the .git directory +# is stored on a file server, to avoid wasting space with it on the client. +# One example use is storing a music collection in git, where you can spare +# the extra space needed for .git on your file server, but not on your +# laptop. This fills basically the same niche as unison. +# +# To make mr use this file, add a line like this inside the [DEFAULT] +# section of your ~/.mrconfig +#include = cat /usr/share/mr/git-remote +# +# And an example repo using it would look something like: +#[lib/sound] +#checkout = git_remote_checkout turtle /media/turtle/home/joey/lib sound +# +# In this example, the file server's hostname is "turtle", +# and it's mounted on /media/turtle. The file server contains a sound.git +# repository in the specified directory under that mount point. +# When mr checks out that repository, it will create a sound.hostname +# directory on the server, containing just the .git directory, and symlink +# the client's .git directory to it. After checkout, normal git and mr +# commands can be used, as long as the file server is available. + +lib = + + git_remote_checkout() { + server="$1" + remotebase="$2" + dir="$3" + hostname="$(hostname)" + if [ "$hostname" = "$server" ]; then + git clone "$dir.git" "$dir" + else + if [ ! -d "$remotebase/$dir.$hostname" ]; then + git clone --no-checkout "$remotebase/$dir.git" "$remotebase/$dir.$hostname" + fi + mkdir -p $dir + cd $dir + ln -sf $remotebase/$dir/.git + git checkout . + fi + } diff --git a/mr b/mr index 0895305..7d35892 100755 --- a/mr +++ b/mr @@ -341,6 +341,13 @@ the action that is performed for a given revision control system, you can override these rcs specific actions. To add a new revision control system, you can just add rcs specific actions for it. +=head1 EXTENSIONS + +mr can be extended to support things such as unison and remote git +checkout. Some files providing such extensions are available in +/usr/share/mr/. See the documentation in the files for details about using +them. + =head1 AUTHOR Copyright 2007 Joey Hess -- 2.39.2