Browse Source

clone: --naked option.

The new option --naked is to help creating a naked repository
for public consumption.

	$ git clone -l -s --naked \
	  /pub/scm/.../torvalds/linux-2.6.git subproj-2.6.git

is equivalent to this sequence:

	$ git clone -l -s -n /pub/scm/.../torvalds/linux-2.6.git temp
	$ mv temp/.git subproj-2.6.git
	$ rmdir temp

Signed-off-by: Junio C Hamano <junkio@cox.net>
maint
Junio C Hamano 19 years ago
parent
commit
8a1a120c55
  1. 24
      Documentation/git-clone.txt
  2. 66
      git-clone.sh

24
Documentation/git-clone.txt

@ -9,7 +9,7 @@ git-clone - Clones a repository.
SYNOPSIS SYNOPSIS
-------- --------
[verse] [verse]
'git-clone' [-l [-s]] [-q] [-n] [-o <name>] [-u <upload-pack>] 'git-clone' [-l [-s]] [-q] [-n] [--naked] [-o <name>] [-u <upload-pack>]
<repository> [<directory>] <repository> [<directory>]


DESCRIPTION DESCRIPTION
@ -58,6 +58,12 @@ OPTIONS
-n:: -n::
No checkout of HEAD is performed after the clone is complete. No checkout of HEAD is performed after the clone is complete.


--naked::
Make a 'naked' GIT repository. That is, instead of
creating `<directory>` and placing the administrative
files in `<directory>/.git`, make the `<directory>`
itself the `$GIT_DIR`. This implies `-n` option.

-o <name>:: -o <name>::
Instead of using the branch name 'origin' to keep track Instead of using the branch name 'origin' to keep track
of the upstream repository, use <name> instead. Note of the upstream repository, use <name> instead. Note
@ -103,6 +109,22 @@ $ cd copy
$ git show-branch $ 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 Author
------ ------
Written by Linus Torvalds <torvalds@osdl.org> Written by Linus Torvalds <torvalds@osdl.org>

66
git-clone.sh

@ -9,7 +9,7 @@
unset CDPATH unset CDPATH


usage() { usage() {
echo >&2 "Usage: $0 [-l [-s]] [-q] [-u <upload-pack>] [-o <name>] [-n] <repo> [<dir>]" echo >&2 "Usage: $0 [--naked] [-l [-s]] [-q] [-u <upload-pack>] [-o <name>] [-n] <repo> [<dir>]"
exit 1 exit 1
} }


@ -53,11 +53,15 @@ use_local=no
local_shared=no local_shared=no
no_checkout= no_checkout=
upload_pack= upload_pack=
naked=
origin=origin origin=origin
while while
case "$#,$1" in case "$#,$1" in
0,*) break ;; 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 ;; *,-l|*,--l|*,--lo|*,--loc|*,--loca|*,--local) use_local=yes ;;
*,-s|*,--s|*,--sh|*,--sha|*,--shar|*,--share|*,--shared) *,-s|*,--s|*,--sh|*,--sha|*,--shar|*,--share|*,--shared)
local_shared=yes; use_local=yes ;; local_shared=yes; use_local=yes ;;
@ -81,6 +85,9 @@ do
shift shift
done done


# --naked implies --no-checkout
test -z "$naked" || no_checkout=yes

# Turn the source into an absolute path if # Turn the source into an absolute path if
# it is local # it is local
repo="$1" repo="$1"
@ -95,10 +102,17 @@ dir="$2"
[ -z "$dir" ] && dir=$(echo "$repo" | sed -e 's|/$||' -e 's|:*/*\.git$||' -e 's|.*/||g') [ -z "$dir" ] && dir=$(echo "$repo" | sed -e 's|/$||' -e 's|:*/*\.git$||' -e 's|.*/||g')
[ -e "$dir" ] && echo "$dir already exists." && usage [ -e "$dir" ] && echo "$dir already exists." && usage
mkdir -p "$dir" && mkdir -p "$dir" &&
D=$( D=$(cd "$dir" && pwd) &&
(cd "$dir" && git-init-db && pwd) case "$naked" in
) && yes) GIT_DIR="$D" ;;
test -d "$D" || usage *) 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. # We do local magic only when the user tells us to.
case "$local,$use_local" in case "$local,$use_local" in
@ -118,21 +132,21 @@ yes,yes)
test -f "$repo/$sample_file" || exit test -f "$repo/$sample_file" || exit


l= 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 then
l=l l=l
fi && fi &&
rm -f "$D/.git/objects/sample" && rm -f "$GIT_DIR/objects/sample" &&
cd "$repo" && 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) yes)
mkdir -p "$D/.git/objects/info" mkdir -p "$GIT_DIR/objects/info"
{ {
test -f "$repo/objects/info/alternates" && test -f "$repo/objects/info/alternates" &&
cat "$repo/objects/info/alternates"; cat "$repo/objects/info/alternates";
echo "$repo/objects" echo "$repo/objects"
} >"$D/.git/objects/info/alternates" } >"$GIT_DIR/objects/info/alternates"
;; ;;
esac esac


@ -143,27 +157,27 @@ yes,yes)
HEAD=HEAD HEAD=HEAD
fi fi
(cd "$repo" && tar cf - refs $HEAD) | (cd "$repo" && tar cf - refs $HEAD) |
(cd "$D/.git" && tar xf -) || exit 1 (cd "$GIT_DIR" && tar xf -) || exit 1
;; ;;
*) *)
case "$repo" in case "$repo" in
rsync://*) rsync://*)
rsync $quiet -av --ignore-existing \ rsync $quiet -av --ignore-existing \
--exclude info "$repo/objects/" "$D/.git/objects/" && --exclude info "$repo/objects/" "$GIT_DIR/objects/" &&
rsync $quiet -av --ignore-existing \ 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 # Look at objects/info/alternates for rsync -- http will
# support it natively and git native ones will do it on the # support it natively and git native ones will do it on the
# remote end. Not having that file is not a crime. # remote end. Not having that file is not a crime.
rsync -q "$repo/objects/info/alternates" \ rsync -q "$repo/objects/info/alternates" \
"$D/.git/TMP_ALT" 2>/dev/null || "$GIT_DIR/TMP_ALT" 2>/dev/null ||
rm -f "$D/.git/TMP_ALT" rm -f "$GIT_DIR/TMP_ALT"
if test -f "$D/.git/TMP_ALT" if test -f "$GIT_DIR/TMP_ALT"
then then
( cd "$D" && ( cd "$D" &&
. git-parse-remote && . git-parse-remote &&
resolve_alternates "$repo" <"./.git/TMP_ALT" ) | resolve_alternates "$repo" <"$GIT_DIR/TMP_ALT" ) |
while read alt while read alt
do do
case "$alt" in 'bad alternate: '*) die "$alt";; esac case "$alt" in 'bad alternate: '*) die "$alt";; esac
@ -171,9 +185,9 @@ yes,yes)
'') echo >&2 "Getting alternate: $alt" ;; '') echo >&2 "Getting alternate: $alt" ;;
esac esac
rsync $quiet -av --ignore-existing \ rsync $quiet -av --ignore-existing \
--exclude info "$alt" "$D/.git/objects" || exit --exclude info "$alt" "$GIT_DIR/objects" || exit
done done
rm -f "$D/.git/TMP_ALT" rm -f "$GIT_DIR/TMP_ALT"
fi fi
;; ;;
http://*) http://*)
@ -194,25 +208,25 @@ esac


cd "$D" || exit cd "$D" || exit


if test -f ".git/HEAD" if test -f "$GIT_DIR/HEAD"
then then
head_points_at=`git-symbolic-ref HEAD` head_points_at=`git-symbolic-ref HEAD`
case "$head_points_at" in case "$head_points_at" in
refs/heads/*) refs/heads/*)
head_points_at=`expr "$head_points_at" : 'refs/heads/\(.*\)'` head_points_at=`expr "$head_points_at" : 'refs/heads/\(.*\)'`
mkdir -p .git/remotes && mkdir -p "$GIT_DIR/remotes" &&
echo >.git/remotes/origin \ echo >"$GIT_DIR/remotes/origin" \
"URL: $repo "URL: $repo
Pull: $head_points_at:$origin" && Pull: $head_points_at:$origin" &&
git-update-ref "refs/heads/$origin" $(git-rev-parse HEAD) && 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 while read ref
do do
head=`expr "$ref" : '.git/refs/heads/\(.*\)'` && head=`expr "$ref" : 'refs/heads/\(.*\)'` &&
test "$head_points_at" = "$head" || test "$head_points_at" = "$head" ||
test "$origin" = "$head" || test "$origin" = "$head" ||
echo "Pull: ${head}:${head}" echo "Pull: ${head}:${head}"
done >>.git/remotes/origin done >>"$GIT_DIR/remotes/origin"
esac esac


case "$no_checkout" in case "$no_checkout" in

Loading…
Cancel
Save