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
684f674
Documentation
arm
compat
contrib
git-gui
gitweb
mozilla-sha1
perl
ppc
t
templates
xdiff
.gitignore
.mailmap
COPYING
GIT-VERSION-GEN
INSTALL
Makefile
README
RelNotes
alloc.c
archive-tar.c
archive-zip.c
archive.h
attr.c
attr.h
base85.c
blob.c
blob.h
builtin-add.c
builtin-annotate.c
builtin-apply.c
builtin-archive.c
builtin-blame.c
builtin-branch.c
builtin-bundle.c
builtin-cat-file.c
builtin-check-attr.c
builtin-check-ref-format.c
builtin-checkout-index.c
builtin-commit-tree.c
builtin-config.c
builtin-count-objects.c
builtin-describe.c
builtin-diff-files.c
builtin-diff-index.c
builtin-diff-tree.c
builtin-diff.c
builtin-fetch--tool.c
builtin-fmt-merge-msg.c
builtin-for-each-ref.c
builtin-fsck.c
builtin-gc.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-merge-base.c
builtin-merge-file.c
builtin-mv.c
builtin-name-rev.c
builtin-pack-objects.c
builtin-pack-refs.c
builtin-prune-packed.c
builtin-prune.c
builtin-push.c
builtin-read-tree.c
builtin-reflog.c
builtin-rerere.c
builtin-rev-list.c
builtin-rev-parse.c
builtin-revert.c
builtin-rm.c
builtin-runstatus.c
builtin-shortlog.c
builtin-show-branch.c
builtin-show-ref.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-builtins.sh
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
convert.c
copy.c
csum-file.c
csum-file.h
ctype.c
daemon.c
date.c
decorate.c
decorate.h
delta.h
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
fast-import.c
fetch-pack.c
fetch.c
fetch.h
generate-cmdlist.sh
git-add--interactive.perl
git-am.sh
git-applymbox.sh
git-applypatch.sh
git-archimport.perl
git-bisect.sh
git-checkout.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-resolve.sh
git-merge-stupid.sh
git-merge.sh
git-mergetool.sh
git-p4import.py
git-parse-remote.sh
git-pull.sh
git-quiltimport.sh
git-rebase.sh
git-relink.perl
git-remote.perl
git-repack.sh
git-request-pull.sh
git-reset.sh
git-send-email.perl
git-sh-setup.sh
git-svn.perl
git-svnimport.perl
git-tag.sh
git-verify-tag.sh
git.c
git.spec.in
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
mailmap.c
mailmap.h
match-trees.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-write.c
pack.h
pager.c
patch-delta.c
patch-id.c
patch-ids.c
patch-ids.h
path-list.c
path-list.h
path.c
peek-remote.c
pkt-line.c
pkt-line.h
progress.c
progress.h
quote.c
quote.h
reachable.c
reachable.h
read-cache.c
receive-pack.c
reflog-walk.c
reflog-walk.h
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
shallow.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
symlinks.c
tag.c
tag.h
tar.h
test-chmtime.c
test-date.c
test-delta.c
test-genrandom.c
test-match-trees.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
utf8.c
utf8.h
var.c
write_or_die.c
wt-status.c
wt-status.h
xdiff-interface.c
xdiff-interface.h
Breadcrumbs
git
/
git-fetch.sh
Blame
Blame
Latest commit
History
History
executable file
·
377 lines (342 loc) · 8.89 KB
Breadcrumbs
git
/
git-fetch.sh
Top
File metadata and controls
Code
Blame
executable file
·
377 lines (342 loc) · 8.89 KB
Raw
#!/bin/sh # USAGE='<fetch-options> <repository> <refspec>...' SUBDIRECTORY_OK=Yes . git-sh-setup set_reflog_action "fetch $*" cd_to_toplevel ;# probably unnecessary... . git-parse-remote _x40='[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]' _x40="$_x40$_x40$_x40$_x40$_x40$_x40$_x40$_x40" LF=' ' IFS="$LF" no_tags= tags= append= force= verbose= update_head_ok= exec= keep= shallow_depth= no_progress= test -t 1 || no_progress=--no-progress quiet= while case "$#" in 0) break ;; esac do case "$1" in -a|--a|--ap|--app|--appe|--appen|--append) append=t ;; --upl|--uplo|--uploa|--upload|--upload-|--upload-p|\ --upload-pa|--upload-pac|--upload-pack) shift exec="--upload-pack=$1" ;; --upl=*|--uplo=*|--uploa=*|--upload=*|\ --upload-=*|--upload-p=*|--upload-pa=*|--upload-pac=*|--upload-pack=*) exec=--upload-pack=$(expr "z$1" : 'z-[^=]*=\(.*\)') shift ;; -f|--f|--fo|--for|--forc|--force) force=t ;; -t|--t|--ta|--tag|--tags) tags=t ;; -n|--n|--no|--no-|--no-t|--no-ta|--no-tag|--no-tags) no_tags=t ;; -u|--u|--up|--upd|--upda|--updat|--update|--update-|--update-h|\ --update-he|--update-hea|--update-head|--update-head-|\ --update-head-o|--update-head-ok) update_head_ok=t ;; -q|--q|--qu|--qui|--quie|--quiet) quiet=--quiet ;; -v|--verbose) verbose="$verbose"Yes ;; -k|--k|--ke|--kee|--keep) keep='-k -k' ;; --depth=*) shallow_depth="--depth=`expr "z$1" : 'z-[^=]*=\(.*\)'`" ;; --depth) shift shallow_depth="--depth=$1" ;; -*) usage ;; *) break ;; esac shift done case "$#" in 0) origin=$(get_default_remote) test -n "$(get_remote_url ${origin})" || die "Where do you want to fetch from today?" set x $origin ; shift ;; esac if test -z "$exec" then # No command line override and we have configuration for the remote. exec="--upload-pack=$(get_uploadpack $1)" fi remote_nick="$1" remote=$(get_remote_url "$@") refs= rref= rsync_slurped_objects= if test "" = "$append" then : >"$GIT_DIR/FETCH_HEAD" fi # Global that is reused later ls_remote_result=$(git ls-remote $exec "$remote") || die "Cannot get the repository state from $remote" append_fetch_head () { flags= test -n "$verbose" && flags="$flags$LF-v" test -n "$force$single_force" && flags="$flags$LF-f" GIT_REFLOG_ACTION="$GIT_REFLOG_ACTION" \ git-fetch--tool $flags append-fetch-head "$@" } # updating the current HEAD with git-fetch in a bare # repository is always fine. if test -z "$update_head_ok" && test $(is_bare_repository) = false then orig_head=$(git-rev-parse --verify HEAD 2>/dev/null) fi # Allow --notags from remote.$1.tagopt case "$tags$no_tags" in '') case "$(git-config --get "remote.$1.tagopt")" in --no-tags) no_tags=t ;; esac esac # If --tags (and later --heads or --all) is specified, then we are # not talking about defaults stored in Pull: line of remotes or # branches file, and just fetch those and refspecs explicitly given. # Otherwise we do what we always did. reflist=$(get_remote_refs_for_fetch "$@") if test "$tags" then taglist=`IFS=' ' && echo "$ls_remote_result" | git-show-ref --exclude-existing=refs/tags/ | while read sha1 name do echo ".${name}:${name}" done` || exit if test "$#" -gt 1 then # remote URL plus explicit refspecs; we need to merge them. reflist="$reflist$LF$taglist" else # No explicit refspecs; fetch tags only. reflist=$taglist fi fi fetch_all_at_once () { eval=$(echo "$1" | git-fetch--tool parse-reflist "-") eval "$eval" ( : subshell because we muck with IFS IFS=" $LF" ( if test "$remote" = . ; then git-show-ref $rref || echo failed "$remote" elif test -f "$remote" ; then test -n "$shallow_depth" && die "shallow clone with bundle is not supported" git-bundle unbundle "$remote" $rref || echo failed "$remote" else if test -d "$remote" && # The remote might be our alternate. With # this optimization we will bypass fetch-pack # altogether, which means we cannot be doing # the shallow stuff at all. test ! -f "$GIT_DIR/shallow" && test -z "$shallow_depth" && # See if all of what we are going to fetch are # connected to our repository's tips, in which # case we do not have to do any fetch. theirs=$(echo "$ls_remote_result" | \ git-fetch--tool -s pick-rref "$rref" "-") && # This will barf when $theirs reach an object that # we do not have in our repository. Otherwise, # we already have everything the fetch would bring in. git-rev-list --objects $theirs --not --all \ >/dev/null 2>/dev/null then echo "$ls_remote_result" | \ git-fetch--tool pick-rref "$rref" "-" else flags= case $verbose in YesYes*) flags="-v" ;; esac git-fetch-pack --thin $exec $keep $shallow_depth \ $quiet $no_progress $flags "$remote" $rref || echo failed "$remote" fi fi ) | ( flags= test -n "$verbose" && flags="$flags -v" test -n "$force" && flags="$flags -f" GIT_REFLOG_ACTION="$GIT_REFLOG_ACTION" \ git-fetch--tool $flags native-store \ "$remote" "$remote_nick" "$refs" ) ) || exit } fetch_per_ref () { reflist="$1" refs= rref= for ref in $reflist do refs="$refs$LF$ref" # These are relative path from $GIT_DIR, typically starting at refs/ # but may be HEAD if expr "z$ref" : 'z\.' >/dev/null then not_for_merge=t ref=$(expr "z$ref" : 'z\.\(.*\)') else not_for_merge= fi if expr "z$ref" : 'z+' >/dev/null then single_force=t ref=$(expr "z$ref" : 'z+\(.*\)') else single_force= fi remote_name=$(expr "z$ref" : 'z\([^:]*\):') local_name=$(expr "z$ref" : 'z[^:]*:\(.*\)') rref="$rref$LF$remote_name" # There are transports that can fetch only one head at a time... case "$remote" in http://* | https://* | ftp://*) test -n "$shallow_depth" && die "shallow clone with http not supported" proto=`expr "$remote" : '\([^:]*\):'` if [ -n "$GIT_SSL_NO_VERIFY" ]; then curl_extra_args="-k" fi if [ -n "$GIT_CURL_FTP_NO_EPSV" -o \ "`git-config --bool http.noEPSV`" = true ]; then noepsv_opt="--disable-epsv" fi # Find $remote_name from ls-remote output. head=$(echo "$ls_remote_result" | \ git-fetch--tool -s pick-rref "$remote_name" "-") expr "z$head" : "z$_x40\$" >/dev/null || die "No such ref $remote_name at $remote" echo >&2 "Fetching $remote_name from $remote using $proto" case "$quiet" in '') v=-v ;; *) v= ;; esac git-http-fetch $v -a "$head" "$remote" || exit ;; rsync://*) test -n "$shallow_depth" && die "shallow clone with rsync not supported" TMP_HEAD="$GIT_DIR/TMP_HEAD" rsync -L -q "$remote/$remote_name" "$TMP_HEAD" || exit 1 head=$(git-rev-parse --verify TMP_HEAD) rm -f "$TMP_HEAD" case "$quiet" in '') v=-v ;; *) v= ;; esac test "$rsync_slurped_objects" || { rsync -a $v --ignore-existing --exclude info \ "$remote/objects/" "$GIT_OBJECT_DIRECTORY/" || 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 "$remote/objects/info/alternates" \ "$GIT_DIR/TMP_ALT" 2>/dev/null || rm -f "$GIT_DIR/TMP_ALT" if test -f "$GIT_DIR/TMP_ALT" then resolve_alternates "$remote" <"$GIT_DIR/TMP_ALT" | while read alt do case "$alt" in 'bad alternate: '*) die "$alt";; esac echo >&2 "Getting alternate: $alt" rsync -av --ignore-existing --exclude info \ "$alt" "$GIT_OBJECT_DIRECTORY/" || exit done rm -f "$GIT_DIR/TMP_ALT" fi rsync_slurped_objects=t } ;; esac append_fetch_head "$head" "$remote" \ "$remote_name" "$remote_nick" "$local_name" "$not_for_merge" || exit done } fetch_main () { case "$remote" in http://* | https://* | ftp://* | rsync://* ) fetch_per_ref "$@" ;; *) fetch_all_at_once "$@" ;; esac } fetch_main "$reflist" || exit # automated tag following case "$no_tags$tags" in '') case "$reflist" in *:refs/*) # effective only when we are following remote branch # using local tracking branch. taglist=$(IFS=' ' && echo "$ls_remote_result" | git-show-ref --exclude-existing=refs/tags/ | while read sha1 name do git-cat-file -t "$sha1" >/dev/null 2>&1 || continue echo >&2 "Auto-following $name" echo ".${name}:${name}" done) esac case "$taglist" in '') ;; ?*) # do not deepen a shallow tree when following tags shallow_depth= fetch_main "$taglist" || exit ;; esac esac # If the original head was empty (i.e. no "master" yet), or # if we were told not to worry, we do not have to check. case "$orig_head" in '') ;; ?*) curr_head=$(git-rev-parse --verify HEAD 2>/dev/null) if test "$curr_head" != "$orig_head" then git-update-ref \ -m "$GIT_REFLOG_ACTION: Undoing incorrectly fetched HEAD." \ HEAD "$orig_head" die "Cannot fetch into the current branch." fi ;; esac
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
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
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
You can’t perform that action at this time.