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>
This commit is contained in:
parent
9e9b26751a
commit
8a1a120c55
@ -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
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…
Reference in New Issue
Block a user