1#!/bin/sh 2# 3# Copyright (c) 2005, Linus Torvalds 4# Copyright (c) 2005, Junio C Hamano 5# 6# Clone a repository into a different directory that does not yet exist. 7 8usage() { 9echo>&2"* git clone [-l] <repo> <dir>" 10exit1 11} 12 13get_repo_base() { 14(cd"$1"&& (cd .git ;pwd))2> /dev/null 15} 16 17quiet= 18use_local=no 19while 20case"$#,$1"in 210,*)break;; 22*,-l|*,--l|*,--lo|*,--loc|*,--loca|*,--local) use_local=yes;; 23*,-q|*,--quiet) quiet=-q;; 24*,-*) usage ;; 25*)break;; 26esac 27do 28shift 29done 30 31# Turn the source into an absolute path if 32# it is local 33repo="$1" 34local=no 35if base=$(get_repo_base "$repo");then 36 repo="$base" 37local=yes 38fi 39 40dir="$2" 41mkdir"$dir"&& 42D=$( 43(cd"$dir"&& git-init-db&&pwd) 44) && 45test -d"$D"|| usage 46 47# We do local magic only when the user tells us to. 48case"$local,$use_local"in 49yes,yes) 50(cd"$repo/objects") || { 51 repo="$repo/.git" 52(cd"$repo/objects") || { 53echo>&2"-l flag seen but$repois not local." 54exit1 55} 56} 57 58# See if we can hardlink and drop "l" if not. 59 sample_file=$(cd"$repo"&& \ 60find objects -type f -print|sed-e1q) 61 62# objects directory should not be empty since we are cloning! 63test -f"$repo/$sample_file"||exit 64 65 l= 66ifln"$repo/$sample_file""$D/.git/objects/sample"2>/dev/null 67then 68 l=l 69fi&& 70rm-f"$D/.git/objects/sample"&& 71cp-r$l"$repo/objects""$D/.git/"||exit1 72 73# Make a duplicate of refs and HEAD pointer 74 HEAD= 75iftest -f"$repo/HEAD" 76then 77 HEAD=HEAD 78fi 79tar Ccf "$repo"- refs $HEAD|tar Cxf "$D/.git"- ||exit1 80exit0 81;; 82esac 83 84case"$repo"in 85rsync://*) 86 rsync $quiet-avz --ignore-existing"$repo/objects/""$D/.git/objects/"&& 87 rsync $quiet-avz --ignore-existing"$repo/refs/""$D/.git/refs/" 88;; 89http://*) 90echo"Somebody should add http fetch">&2 91exit1 92;; 93*) 94cd"$D"&& git-clone-pack$quiet"$repo" 95;; 96esac