projects
/
git.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
commit-tree: check return value from write_sha1_file()
[git.git]
/
git-clone.sh
diff --git
a/git-clone.sh
b/git-clone.sh
index
377d59e
..
4ed861d
100755
(executable)
--- a/
git-clone.sh
+++ b/
git-clone.sh
@@
-9,7
+9,7
@@
unset CDPATH
usage() {
unset CDPATH
usage() {
- echo >&2 "Usage: $0 [-l [-s]] [-q] [-u <upload-pack>] [-o <name>] [-n] <repo> [<dir>]"
+ echo >&2 "Usage: $0 [-
-bare] [-
l [-s]] [-q] [-u <upload-pack>] [-o <name>] [-n] <repo> [<dir>]"
exit 1
}
exit 1
}
@@
-53,11
+53,17
@@
use_local=no
local_shared=no
no_checkout=
upload_pack=
local_shared=no
no_checkout=
upload_pack=
+bare=
origin=origin
origin=origin
+origin_override=
while
case "$#,$1" in
0,*) break ;;
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|\
+ *,-b|*,--b|*,--ba|*,--bar|*,--bare) bare=yes ;;
*,-l|*,--l|*,--lo|*,--loc|*,--loca|*,--local) use_local=yes ;;
*,-s|*,--s|*,--sh|*,--sha|*,--shar|*,--share|*,--shared)
local_shared=yes; use_local=yes ;;
*,-l|*,--l|*,--lo|*,--loc|*,--loca|*,--local) use_local=yes ;;
*,-s|*,--s|*,--sh|*,--sha|*,--shar|*,--share|*,--shared)
local_shared=yes; use_local=yes ;;
@@
-68,6
+74,11
@@
while
echo >&2 "'$2' is not suitable for a branch name"
exit 1
}
echo >&2 "'$2' is not suitable for a branch name"
exit 1
}
+ test -z "$origin_override" || {
+ echo >&2 "Do not give more than one -o options."
+ exit 1
+ }
+ origin_override=yes
origin="$2"; shift
;;
1,-u|1,--upload-pack) usage ;;
origin="$2"; shift
;;
1,-u|1,--upload-pack) usage ;;
@@
-81,6
+92,17
@@
do
shift
done
shift
done
+# --bare implies --no-checkout
+if test yes = "$bare"
+then
+ if test yes = "$origin_override"
+ then
+ echo >&2 '--bare and -o $origin options are incompatible.'
+ exit 1
+ fi
+ no_checkout=yes
+fi
+
# Turn the source into an absolute path if
# it is local
repo="$1"
# Turn the source into an absolute path if
# it is local
repo="$1"
@@
-92,13
+114,21
@@
fi
dir="$2"
# Try using "humanish" part of source repo if user didn't specify one
dir="$2"
# Try using "humanish" part of source repo if user didn't specify one
-[ -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
mkdir -p "$dir" &&
[ -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) &&
+trap 'err=$?; cd ..; rm -r "$D"; exit $err' exit
+case "$bare" in
+yes) GIT_DIR="$D" ;;
+*) GIT_DIR="$D/.git" ;;
+esac && export GIT_DIR && git-init-db || usage
+case "$bare" 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
# We do local magic only when the user tells us to.
case "$local,$use_local" in
@@
-118,21
+148,21
@@
yes,yes)
test -f "$repo/$sample_file" || exit
l=
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 &&
then
l=l
fi &&
- rm -f "$
D/.git
/objects/sample" &&
+ rm -f "$
GIT_DIR
/objects/sample" &&
cd "$repo" &&
cd "$repo" &&
- find objects -depth -print | cpio -pu
amd$l "$D/.git
/" || exit 1
+ find objects -depth -print | cpio -pu
md$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" &&
cat "$repo/objects/info/alternates";
echo "$repo/objects"
{
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
;;
esac
@@
-143,27
+173,27
@@
yes,yes)
HEAD=HEAD
fi
(cd "$repo" && tar cf - refs $HEAD) |
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 \
;;
*)
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 \
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" \
# 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 &&
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
while read alt
do
case "$alt" in 'bad alternate: '*) die "$alt";; esac
@@
-171,13
+201,19
@@
yes,yes)
'') echo >&2 "Getting alternate: $alt" ;;
esac
rsync $quiet -av --ignore-existing \
'') 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
done
- rm -f "$
D/.git
/TMP_ALT"
+ rm -f "$
GIT_DIR
/TMP_ALT"
fi
;;
http://*)
fi
;;
http://*)
- clone_dumb_http "$repo" "$D"
+ if test -z "@@NO_CURL@@"
+ then
+ clone_dumb_http "$repo" "$D"
+ else
+ echo >&2 "http transport not supported, rebuild Git with curl support"
+ exit 1
+ fi
;;
*)
cd "$D" && case "$upload_pack" in
;;
*)
cd "$D" && case "$upload_pack" in
@@
-194,29
+230,32
@@
esac
cd "$D" || exit
cd "$D" || exit
-if test -f "
.git/HEAD
"
+if test -f "
$GIT_DIR/HEAD" && test -z "$bare
"
then
head_points_at=`git-symbolic-ref HEAD`
case "$head_points_at" in
refs/heads/*)
head_points_at=`expr "$head_points_at" : 'refs/heads/\(.*\)'`
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) &&
"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
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}"
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
'')
esac
case "$no_checkout" in
'')
- git
checkout
+ git
-read-tree -m -u -v HEAD HEAD
esac
fi
esac
fi
+
+trap - exit
+