Sitter här på tåget på väg till FSCONS. Jag skrev häromdagen ett inlägg där jag efterlyste en fri ersättare till Dropbox och i en av kommentarerna rekommenderades SVN. Jag passade på nu när har hade ett par timmar över på tåget att titta på det. Jag sökte på nätet men hittade inget som fungerar tvåvägs (dessutom går det ohyggligt segt här på tåget så jag ledsnade på att leta) så jag började skriva på ett eget mest på skoj.
Jag gör inga anspråk på att det är snyggt eller ens fungerar. Men jag har i alla fall två kataloger på min dator som synkas snyggt och fint så snart något ändras i dem. Jag har inte testat allt men har hunnit med att skapa, ändra och ta bort kataloger och filer. Konflikter hanteras inte (med det tror jag inte de gör i Dropbox heller). Det spottar ur sig lite felmeddelanden i bland (till exempel i tunnlar och så… :-)).
Bifogar skriptet här om någon vill lattja vidare med det. Observera att det är ett hack gjort på ett tåg …
Ursäkta de långa raderna …
#!/bin/bash # # Skript to keep a directory synced via SVN. Very untested. Have not used it in # practice yet. # # *** DO NOT USE FOR PRODUCTION DATA *** # # By: Marcus Rejås, Rejås Dataskonsult AB # # This is free software under GPL see http://www.gnu.org/licenses/. I will # include the correct statements some day. # # # In order to make this work you have to have a checked out copy of the dir to # sync. You should be able to run "svn up" in that dir without supplying a # password. # # This dir should be pointed out in CONFIG_FILE ($HOME/.svnsync) as: # # sync_dir[0]=/home/rejas/Sync1 # # If you have more than one, just add them. # # sync_dir[1]=/home/rejas/Sync2 # sync_dir[2]=/home/rejas/Sync3" # ... # # Then run this script. For now you probably want to run in a terminal just to # test it. If you (not likely) will find that it works you could add it as a # startup skript in you desktop environment (or whatever). # # # Notes ... # apt-get install libnotify-bin # apt-get install zenity (Currently not needed. Maybe use for extra candy ...) CONFIG_FILE=$HOME/.svnsync DELAY=5 # Run every DELAY seconds HOST=`hostname -f` NOTIFY=1 # Nofify via libnotify function notify { if [ $NOTIFY -eq 1 ]; then notify-send "SVN Update daemom" "$1" fi } notify "SVN sync daemon started" # # Set config file, if noone found raise an error # if [ -e $CONFIG_FILE ]; then source $CONFIG_FILE else echo "No config file ($CONFIG_FILE) found" echo echo "Create one with content like:" echo echo "sync_dir[0]=/home/rejas/Sync1" echo "sync_dir[1]=/home/rejas/Sync2" echo echo "Please observe that these needs to be checked out directories" notify "No config file found!!" exit 1 fi # # There is currently no code to set up the local repo, so it must be created. # while true; do for DIR in ${sync_dir[*]}; do status=`svn status $DIR --xml | xmlstarlet sel -t -m "/status/target/entry" -v "concat(@path,':',wc-status/@item,'\n')" -n` if [ -z "$status" ]; then status=`svn status $DIR -u --xml | xmlstarlet sel -t -m "/status/target/entry" -v "concat(@path,':',wc-status/@item,'\n')" -n` fi if [ -z "$status" ]; then continue; fi # # Find out what to do ... # echo -e $status | while read line; do file=`echo $line | cut -d: -f1` stat=`echo $line | cut -d: -f2` if [ -z "$stat" ]; then continue; fi case $stat in # I'm not sure if this is all cases, let me know if you hit the last rule (and how to handle it ...) modified) mess="updated $file to Server" svn commit --non-interactive -m "Sync script on $HOST: $mess" $file notify "$mess" ;; none) mess="updated $file from Server" svn update --non-interactive $file notify "$mess" ;; missing) mess="Deleted $file from server" svn delete --non-interactive $file svn commit --non-interactive -m "Sync script on $HOST: deleted $file" $file notify "$mess" ;; unversioned) mess="Added $file to server" svn add $file svn commit --non-interactive -m "Sync script on $HOST: added $file" $file notify "$mess" ;; deleted) mess="Deleting $file" # # This is a little hack. Dirs needs to be removed from the repo root # svn commit --non-interactive -m "Sync script on $HOST: deleted files" `dirname $file` notify "$mess" ;; normal) mess="updated $file from Server" svn update --non-interactive $file notify "$mess" ;; *) echo $file is unknown status $stat notify "$mess" esac done done sleep $DELAY echo "Running ..." done
Om jag förstått det hela rätt, så hanterar Dropbox konflikter på det sätt att den senast inlagda filen är den som gäller, men den har inget stöd för merge-oprationer. Däremot sparar de någon slags historik så man kan återskapa filerna.
Har aldrig använt Dropbox själv, utan har bara läst om det någonstans.
Själv använder jag git med Joey Hess’ mr för att hålla reda på mina filer, vilket fungerar riktigt bra. Kanske någonting att titta på? mr har stöd för svn, bzr, git, svn, cvs etc