diff --git a/Documentation/git-clone.txt b/Documentation/git-clone.txt index 790b87b231..8488202e3c 100644 --- a/Documentation/git-clone.txt +++ b/Documentation/git-clone.txt @@ -9,7 +9,7 @@ git-clone - Clones a repository. SYNOPSIS -------- [verse] -'git-clone' [-l [-s]] [-q] [-n] [-o ] [-u ] +'git-clone' [-l [-s]] [-q] [-n] [--naked] [-o ] [-u ] [] DESCRIPTION @@ -58,6 +58,12 @@ OPTIONS -n:: No checkout of HEAD is performed after the clone is complete. +--naked:: + Make a 'naked' GIT repository. That is, instead of + creating `` and placing the administrative + files in `/.git`, make the `` + itself the `$GIT_DIR`. This implies `-n` option. + -o :: Instead of using the branch name 'origin' to keep track of the upstream repository, use instead. Note @@ -103,6 +109,22 @@ $ cd copy $ git show-branch ------------ + +Create a naked repository to publish your changes to the public:: ++ +------------ +$ git clone --naked -l /home/proj/.git /pub/scm/proj.git +------------ + + +Create a repository on the kernel.org machine that borrows from Linus:: ++ +------------ +$ git clone --naked -l -s /pub/scm/.../torvalds/linux-2.6.git \ + /pub/scm/.../me/subsys-2.6.git +------------ + + Author ------ Written by Linus Torvalds diff --git a/git-clone.sh b/git-clone.sh index 377d59e62c..168eb963ba 100755 --- a/git-clone.sh +++ b/git-clone.sh @@ -9,7 +9,7 @@ unset CDPATH usage() { - echo >&2 "Usage: $0 [-l [-s]] [-q] [-u ] [-o ] [-n] []" + echo >&2 "Usage: $0 [--naked] [-l [-s]] [-q] [-u ] [-o ] [-n] []" exit 1 } @@ -53,11 +53,15 @@ use_local=no local_shared=no no_checkout= upload_pack= +naked= origin=origin while case "$#,$1" in 0,*) break ;; - *,-n) no_checkout=yes ;; + *,-n|*,--no|*,--no-|*,--no-c|*,--no-ch|*,--no-che|*,--no-chec|\ + *,--no-check|*,--no-checko|*,--no-checkou|*,--no-checkout) + no_checkout=yes ;; + *,--na|*,--nak|*,--nake|*,--naked) naked=yes ;; *,-l|*,--l|*,--lo|*,--loc|*,--loca|*,--local) use_local=yes ;; *,-s|*,--s|*,--sh|*,--sha|*,--shar|*,--share|*,--shared) local_shared=yes; use_local=yes ;; @@ -81,6 +85,9 @@ do shift done +# --naked implies --no-checkout +test -z "$naked" || no_checkout=yes + # Turn the source into an absolute path if # it is local repo="$1" @@ -95,10 +102,17 @@ dir="$2" [ -z "$dir" ] && dir=$(echo "$repo" | sed -e 's|/$||' -e 's|:*/*\.git$||' -e 's|.*/||g') [ -e "$dir" ] && echo "$dir already exists." && usage mkdir -p "$dir" && -D=$( - (cd "$dir" && git-init-db && pwd) -) && -test -d "$D" || usage +D=$(cd "$dir" && pwd) && +case "$naked" in +yes) GIT_DIR="$D" ;; +*) GIT_DIR="$D/.git" ;; +esac && export GIT_DIR && git-init-db || usage +case "$naked" in +yes) + GIT_DIR="$D" ;; +*) + GIT_DIR="$D/.git" ;; +esac # We do local magic only when the user tells us to. case "$local,$use_local" in @@ -118,21 +132,21 @@ yes,yes) test -f "$repo/$sample_file" || exit l= - if ln "$repo/$sample_file" "$D/.git/objects/sample" 2>/dev/null + if ln "$repo/$sample_file" "$GIT_DIR/objects/sample" 2>/dev/null then l=l fi && - rm -f "$D/.git/objects/sample" && + rm -f "$GIT_DIR/objects/sample" && cd "$repo" && - find objects -depth -print | cpio -puamd$l "$D/.git/" || exit 1 + find objects -depth -print | cpio -puamd$l "$GIT_DIR/" || exit 1 ;; yes) - mkdir -p "$D/.git/objects/info" + mkdir -p "$GIT_DIR/objects/info" { test -f "$repo/objects/info/alternates" && cat "$repo/objects/info/alternates"; echo "$repo/objects" - } >"$D/.git/objects/info/alternates" + } >"$GIT_DIR/objects/info/alternates" ;; esac @@ -143,27 +157,27 @@ yes,yes) HEAD=HEAD fi (cd "$repo" && tar cf - refs $HEAD) | - (cd "$D/.git" && tar xf -) || exit 1 + (cd "$GIT_DIR" && tar xf -) || exit 1 ;; *) case "$repo" in rsync://*) rsync $quiet -av --ignore-existing \ - --exclude info "$repo/objects/" "$D/.git/objects/" && + --exclude info "$repo/objects/" "$GIT_DIR/objects/" && rsync $quiet -av --ignore-existing \ - --exclude info "$repo/refs/" "$D/.git/refs/" || exit + --exclude info "$repo/refs/" "$GIT_DIR/refs/" || exit # Look at objects/info/alternates for rsync -- http will # support it natively and git native ones will do it on the # remote end. Not having that file is not a crime. rsync -q "$repo/objects/info/alternates" \ - "$D/.git/TMP_ALT" 2>/dev/null || - rm -f "$D/.git/TMP_ALT" - if test -f "$D/.git/TMP_ALT" + "$GIT_DIR/TMP_ALT" 2>/dev/null || + rm -f "$GIT_DIR/TMP_ALT" + if test -f "$GIT_DIR/TMP_ALT" then ( cd "$D" && . git-parse-remote && - resolve_alternates "$repo" <"./.git/TMP_ALT" ) | + resolve_alternates "$repo" <"$GIT_DIR/TMP_ALT" ) | while read alt do case "$alt" in 'bad alternate: '*) die "$alt";; esac @@ -171,9 +185,9 @@ yes,yes) '') echo >&2 "Getting alternate: $alt" ;; esac rsync $quiet -av --ignore-existing \ - --exclude info "$alt" "$D/.git/objects" || exit + --exclude info "$alt" "$GIT_DIR/objects" || exit done - rm -f "$D/.git/TMP_ALT" + rm -f "$GIT_DIR/TMP_ALT" fi ;; http://*) @@ -194,25 +208,25 @@ esac cd "$D" || exit -if test -f ".git/HEAD" +if test -f "$GIT_DIR/HEAD" then head_points_at=`git-symbolic-ref HEAD` case "$head_points_at" in refs/heads/*) head_points_at=`expr "$head_points_at" : 'refs/heads/\(.*\)'` - mkdir -p .git/remotes && - echo >.git/remotes/origin \ + mkdir -p "$GIT_DIR/remotes" && + echo >"$GIT_DIR/remotes/origin" \ "URL: $repo Pull: $head_points_at:$origin" && git-update-ref "refs/heads/$origin" $(git-rev-parse HEAD) && - find .git/refs/heads -type f -print | + (cd "$GIT_DIR" && find "refs/heads" -type f -print) | while read ref do - head=`expr "$ref" : '.git/refs/heads/\(.*\)'` && + head=`expr "$ref" : 'refs/heads/\(.*\)'` && test "$head_points_at" = "$head" || test "$origin" = "$head" || echo "Pull: ${head}:${head}" - done >>.git/remotes/origin + done >>"$GIT_DIR/remotes/origin" esac case "$no_checkout" in