Skip to content
Navigation Menu
Toggle navigation
Sign in
In this repository
All GitHub Enterprise
↵
Jump to
↵
No suggested jump to results
In this repository
All GitHub Enterprise
↵
Jump to
↵
In this organization
All GitHub Enterprise
↵
Jump to
↵
In this repository
All GitHub Enterprise
↵
Jump to
↵
Sign in
Reseting focus
You signed in with another tab or window.
Reload
to refresh your session.
You signed out in another tab or window.
Reload
to refresh your session.
You switched accounts on another tab or window.
Reload
to refresh your session.
Dismiss alert
{{ message }}
git-mirror
/
git
Public
Notifications
You must be signed in to change notification settings
Fork
0
Star
0
Code
Issues
0
Pull requests
0
Actions
Projects
0
Security
Insights
Additional navigation options
Code
Issues
Pull requests
Actions
Projects
Security
Insights
Files
3ea099d
Documentation
arm
compat
contrib
gitweb
mozilla-sha1
ppc
t
templates
xdiff
.gitignore
COPYING
GIT-VERSION-GEN
INSTALL
Makefile
README
alloc.c
archive-tar.c
archive-zip.c
archive.h
base85.c
blame.c
blob.c
blob.h
builtin-add.c
builtin-apply.c
builtin-archive.c
builtin-cat-file.c
builtin-check-ref-format.c
builtin-checkout-index.c
builtin-commit-tree.c
builtin-count-objects.c
builtin-diff-files.c
builtin-diff-index.c
builtin-diff-stages.c
builtin-diff-tree.c
builtin-diff.c
builtin-fmt-merge-msg.c
builtin-grep.c
builtin-init-db.c
builtin-log.c
builtin-ls-files.c
builtin-ls-tree.c
builtin-mailinfo.c
builtin-mailsplit.c
builtin-mv.c
builtin-name-rev.c
builtin-pack-objects.c
builtin-prune-packed.c
builtin-prune.c
builtin-push.c
builtin-read-tree.c
builtin-repo-config.c
builtin-rev-list.c
builtin-rev-parse.c
builtin-rm.c
builtin-runstatus.c
builtin-show-branch.c
builtin-stripspace.c
builtin-symbolic-ref.c
builtin-tar-tree.c
builtin-unpack-objects.c
builtin-update-index.c
builtin-update-ref.c
builtin-upload-archive.c
builtin-verify-pack.c
builtin-write-tree.c
builtin.h
cache-tree.c
cache-tree.h
cache.h
check-racy.c
color.c
color.h
combine-diff.c
commit.c
commit.h
config.c
config.mak.in
configure.ac
connect.c
convert-objects.c
copy.c
csum-file.c
csum-file.h
ctype.c
daemon.c
date.c
delta.h
describe.c
diff-delta.c
diff-lib.c
diff.c
diff.h
diffcore-break.c
diffcore-delta.c
diffcore-order.c
diffcore-pickaxe.c
diffcore-rename.c
diffcore.h
dir.c
dir.h
dump-cache-tree.c
entry.c
environment.c
exec_cmd.c
exec_cmd.h
fetch-clone.c
fetch-pack.c
fetch.c
fetch.h
fsck-objects.c
generate-cmdlist.sh
git-am.sh
git-annotate.perl
git-applymbox.sh
git-applypatch.sh
git-archimport.perl
git-bisect.sh
git-branch.sh
git-checkout.sh
git-cherry.sh
git-clean.sh
git-clone.sh
git-commit.sh
git-compat-util.h
git-cvsexportcommit.perl
git-cvsimport.perl
git-cvsserver.perl
git-fetch.sh
git-instaweb.sh
git-lost-found.sh
git-ls-remote.sh
git-merge-octopus.sh
git-merge-one-file.sh
git-merge-ours.sh
git-merge-recursive-old.py
git-merge-resolve.sh
git-merge-stupid.sh
git-merge.sh
git-p4import.py
git-parse-remote.sh
git-pull.sh
git-quiltimport.sh
git-rebase.sh
git-relink.perl
git-repack.sh
git-request-pull.sh
git-rerere.perl
git-reset.sh
git-resolve.sh
git-revert.sh
git-send-email.perl
git-sh-setup.sh
git-shortlog.perl
git-svn.perl
git-svnimport.perl
git-tag.sh
git-verify-tag.sh
git.c
git.spec.in
gitMergeCommon.py
gitk
grep.c
grep.h
hash-object.c
help.c
http-fetch.c
http-push.c
http.c
http.h
ident.c
imap-send.c
index-pack.c
interpolate.c
interpolate.h
list-objects.c
list-objects.h
local-fetch.c
lockfile.c
log-tree.c
log-tree.h
merge-base.c
merge-file.c
merge-index.c
merge-recursive.c
merge-tree.c
mktag.c
mktree.c
object-refs.c
object.c
object.h
pack-check.c
pack-redundant.c
pack.h
pager.c
patch-delta.c
patch-id.c
path-list.c
path-list.h
path.c
peek-remote.c
pkt-line.c
pkt-line.h
quote.c
quote.h
read-cache.c
receive-pack.c
refs.c
refs.h
revision.c
revision.h
rsh.c
rsh.h
run-command.c
run-command.h
send-pack.c
server-info.c
setup.c
sha1_file.c
sha1_name.c
shell.c
show-index.c
sideband.c
sideband.h
ssh-fetch.c
ssh-pull.c
ssh-push.c
ssh-upload.c
strbuf.c
strbuf.h
tag.c
tag.h
tar.h
test-date.c
test-delta.c
test-sha1.c
test-sha1.sh
trace.c
tree-diff.c
tree-walk.c
tree-walk.h
tree.c
tree.h
unpack-file.c
unpack-trees.c
unpack-trees.h
update-server-info.c
upload-pack.c
usage.c
var.c
write_or_die.c
wt-status.c
wt-status.h
xdiff-interface.c
xdiff-interface.h
Breadcrumbs
git
/
git-clone.sh
Blame
Blame
Latest commit
History
History
executable file
·
423 lines (392 loc) · 10 KB
Breadcrumbs
git
/
git-clone.sh
Top
File metadata and controls
Code
Blame
executable file
·
423 lines (392 loc) · 10 KB
Raw
#!/bin/sh # # Copyright (c) 2005, Linus Torvalds # Copyright (c) 2005, Junio C Hamano # # Clone a repository into a different directory that does not yet exist. # See git-sh-setup why. unset CDPATH usage() { echo >&2 "Usage: $0 [--template=<template_directory>] [--use-separate-remote] [--reference <reference-repo>] [--bare] [-l [-s]] [-q] [-u <upload-pack>] [--origin <name>] [-n] <repo> [<dir>]" exit 1 } get_repo_base() { (cd "$1" && (cd .git ; pwd)) 2> /dev/null } if [ -n "$GIT_SSL_NO_VERIFY" ]; then curl_extra_args="-k" fi http_fetch () { # $1 = Remote, $2 = Local curl -nsfL $curl_extra_args "$1" >"$2" } clone_dumb_http () { # $1 - remote, $2 - local cd "$2" && clone_tmp="$GIT_DIR/clone-tmp" && mkdir -p "$clone_tmp" || exit 1 if [ -n "$GIT_CURL_FTP_NO_EPSV" -o \ "`git-repo-config --bool http.noEPSV`" = true ]; then curl_extra_args="${curl_extra_args} --disable-epsv" fi http_fetch "$1/info/refs" "$clone_tmp/refs" || { echo >&2 "Cannot get remote repository information. Perhaps git-update-server-info needs to be run there?" exit 1; } while read sha1 refname do name=`expr "z$refname" : 'zrefs/\(.*\)'` && case "$name" in *^*) continue;; esac if test -n "$use_separate_remote" && branch_name=`expr "z$name" : 'zheads/\(.*\)'` then tname="remotes/$origin/$branch_name" else tname=$name fi git-http-fetch -v -a -w "$tname" "$name" "$1/" || exit 1 done <"$clone_tmp/refs" rm -fr "$clone_tmp" http_fetch "$1/HEAD" "$GIT_DIR/REMOTE_HEAD" || rm -f "$GIT_DIR/REMOTE_HEAD" } # Read git-fetch-pack -k output and store the remote branches. copy_refs=' use File::Path qw(mkpath); use File::Basename qw(dirname); my $git_dir = $ARGV[0]; my $use_separate_remote = $ARGV[1]; my $origin = $ARGV[2]; my $branch_top = ($use_separate_remote ? "remotes/$origin" : "heads"); my $tag_top = "tags"; sub store { my ($sha1, $name, $top) = @_; $name = "$git_dir/refs/$top/$name"; mkpath(dirname($name)); open O, ">", "$name"; print O "$sha1\n"; close O; } open FH, "<", "$git_dir/CLONE_HEAD"; while (<FH>) { my ($sha1, $name) = /^([0-9a-f]{40})\s(.*)$/; next if ($name =~ /\^\173/); if ($name eq "HEAD") { open O, ">", "$git_dir/REMOTE_HEAD"; print O "$sha1\n"; close O; next; } if ($name =~ s/^refs\/heads\///) { store($sha1, $name, $branch_top); next; } if ($name =~ s/^refs\/tags\///) { store($sha1, $name, $tag_top); next; } } close FH; ' quiet= local=no use_local=no local_shared=no unset template no_checkout= upload_pack= bare= reference= origin= origin_override= use_separate_remote= while case "$#,$1" in 0,*) break ;; *,-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 ;; 1,--template) usage ;; *,--template) shift; template="--template=$1" ;; *,--template=*) template="$1" ;; *,-q|*,--quiet) quiet=-q ;; *,--use-separate-remote) use_separate_remote=t ;; 1,--reference) usage ;; *,--reference) shift; reference="$1" ;; *,--reference=*) reference=`expr "z$1" : 'z--reference=\(.*\)'` ;; *,-o|*,--or|*,--ori|*,--orig|*,--origi|*,--origin) case "$2" in '') usage ;; */*) echo >&2 "'$2' is not suitable for an origin name" exit 1 esac git-check-ref-format "heads/$2" || { echo >&2 "'$2' is not suitable for a branch name" exit 1 } test -z "$origin_override" || { echo >&2 "Do not give more than one --origin options." exit 1 } origin_override=yes origin="$2"; shift ;; 1,-u|1,--upload-pack) usage ;; *,-u|*,--upload-pack) shift upload_pack="--exec=$1" ;; *,-*) usage ;; *) break ;; esac do shift done repo="$1" if test -z "$repo" then echo >&2 'you must specify a repository to clone.' exit 1 fi # --bare implies --no-checkout if test yes = "$bare" then if test yes = "$origin_override" then echo >&2 '--bare and --origin $origin options are incompatible.' exit 1 fi if test t = "$use_separate_remote" then echo >&2 '--bare and --use-separate-remote options are incompatible.' exit 1 fi no_checkout=yes fi if test -z "$origin" then origin=origin fi # Turn the source into an absolute path if # it is local if base=$(get_repo_base "$repo"); then repo="$base" local=yes fi 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') [ -e "$dir" ] && echo "$dir already exists." && usage mkdir -p "$dir" && D=$(cd "$dir" && pwd) && trap 'err=$?; cd ..; rm -rf "$D"; exit $err' 0 case "$bare" in yes) GIT_DIR="$D" ;; *) GIT_DIR="$D/.git" ;; esac && export GIT_DIR && git-init-db ${template+"$template"} || usage if test -n "$reference" then if test -d "$reference" then if test -d "$reference/.git/objects" then reference="$reference/.git" fi reference=$(cd "$reference" && pwd) echo "$reference/objects" >"$GIT_DIR/objects/info/alternates" (cd "$reference" && tar cf - refs) | (cd "$GIT_DIR/refs" && mkdir reference-tmp && cd reference-tmp && tar xf -) else echo >&2 "$reference: not a local directory." && usage fi fi rm -f "$GIT_DIR/CLONE_HEAD" # We do local magic only when the user tells us to. case "$local,$use_local" in yes,yes) ( cd "$repo/objects" ) || { echo >&2 "-l flag seen but $repo is not local." exit 1 } case "$local_shared" in no) # See if we can hardlink and drop "l" if not. sample_file=$(cd "$repo" && \ find objects -type f -print | sed -e 1q) # objects directory should not be empty since we are cloning! test -f "$repo/$sample_file" || exit l= if ln "$repo/$sample_file" "$GIT_DIR/objects/sample" 2>/dev/null then l=l fi && rm -f "$GIT_DIR/objects/sample" && cd "$repo" && find objects -depth -print | cpio -pumd$l "$GIT_DIR/" || exit 1 ;; yes) mkdir -p "$GIT_DIR/objects/info" echo "$repo/objects" >> "$GIT_DIR/objects/info/alternates" ;; esac git-ls-remote "$repo" >"$GIT_DIR/CLONE_HEAD" || exit 1 ;; *) case "$repo" in rsync://*) rsync $quiet -av --ignore-existing \ --exclude info "$repo/objects/" "$GIT_DIR/objects/" || 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" \ "$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_DIR/TMP_ALT" ) | while read alt do case "$alt" in 'bad alternate: '*) die "$alt";; esac case "$quiet" in '') echo >&2 "Getting alternate: $alt" ;; esac rsync $quiet -av --ignore-existing \ --exclude info "$alt" "$GIT_DIR/objects" || exit done rm -f "$GIT_DIR/TMP_ALT" fi git-ls-remote "$repo" >"$GIT_DIR/CLONE_HEAD" || exit 1 ;; https://*|http://*|ftp://*) 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 '') git-fetch-pack --all -k $quiet "$repo" ;; *) git-fetch-pack --all -k $quiet "$upload_pack" "$repo" ;; esac >"$GIT_DIR/CLONE_HEAD" || { echo >&2 "fetch-pack from '$repo' failed." exit 1 } ;; esac ;; esac test -d "$GIT_DIR/refs/reference-tmp" && rm -fr "$GIT_DIR/refs/reference-tmp" if test -f "$GIT_DIR/CLONE_HEAD" then # Read git-fetch-pack -k output and store the remote branches. @@PERL@@ -e "$copy_refs" "$GIT_DIR" "$use_separate_remote" "$origin" || exit fi cd "$D" || exit if test -z "$bare" && test -f "$GIT_DIR/REMOTE_HEAD" then # Figure out which remote branch HEAD points at. case "$use_separate_remote" in '') remote_top=refs/heads ;; *) remote_top="refs/remotes/$origin" ;; esac head_sha1=`cat "$GIT_DIR/REMOTE_HEAD"` case "$head_sha1" in 'ref: refs/'*) # Uh-oh, the remote told us (http transport done against # new style repository with a symref HEAD). # Ideally we should skip the guesswork but for now # opt for minimum change. head_sha1=`expr "z$head_sha1" : 'zref: refs/heads/\(.*\)'` head_sha1=`cat "$GIT_DIR/$remote_top/$head_sha1"` ;; esac # The name under $remote_top the remote HEAD seems to point at. head_points_at=$( ( echo "master" cd "$GIT_DIR/$remote_top" && find . -type f -print | sed -e 's/^\.\///' ) | ( done=f while read name do test t = $done && continue branch_tip=`cat "$GIT_DIR/$remote_top/$name"` if test "$head_sha1" = "$branch_tip" then echo "$name" done=t fi done ) ) # Write out remotes/$origin file, and update our "$head_points_at". case "$head_points_at" in ?*) mkdir -p "$GIT_DIR/remotes" && git-symbolic-ref HEAD "refs/heads/$head_points_at" && case "$use_separate_remote" in t) origin_track="$remote_top/$head_points_at" git-update-ref HEAD "$head_sha1" ;; *) origin_track="$remote_top/$origin" git-update-ref "refs/heads/$origin" "$head_sha1" ;; esac && echo >"$GIT_DIR/remotes/$origin" \ "URL: $repo Pull: refs/heads/$head_points_at:$origin_track" && (cd "$GIT_DIR/$remote_top" && find . -type f -print) | while read dotslref do name=`expr "$dotslref" : './\(.*\)'` if test "z$head_points_at" = "z$name" then continue fi if test "$use_separate_remote" = '' && test "z$origin" = "z$name" then continue fi echo "Pull: refs/heads/${name}:$remote_top/${name}" done >>"$GIT_DIR/remotes/$origin" && case "$use_separate_remote" in t) rm -f "refs/remotes/$origin/HEAD" git-symbolic-ref "refs/remotes/$origin/HEAD" \ "refs/remotes/$origin/$head_points_at" esac esac case "$no_checkout" in '') git-read-tree -m -u -v HEAD HEAD esac fi rm -f "$GIT_DIR/CLONE_HEAD" "$GIT_DIR/REMOTE_HEAD" trap - 0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
You can’t perform that action at this time.