Code

Merge branch 'jl/submodule-add-relurl-wo-upstream' into maint
[git.git] / git-submodule.sh
1 #!/bin/sh
2 #
3 # git-submodules.sh: add, init, update or list git submodules
4 #
5 # Copyright (c) 2007 Lars Hjemli
7 dashless=$(basename "$0" | sed -e 's/-/ /')
8 USAGE="[--quiet] add [-b branch] [-f|--force] [--reference <repository>] [--] <repository> [<path>]
9    or: $dashless [--quiet] status [--cached] [--recursive] [--] [<path>...]
10    or: $dashless [--quiet] init [--] [<path>...]
11    or: $dashless [--quiet] update [--init] [-N|--no-fetch] [-f|--force] [--rebase] [--reference <repository>] [--merge] [--recursive] [--] [<path>...]
12    or: $dashless [--quiet] summary [--cached|--files] [--summary-limit <n>] [commit] [--] [<path>...]
13    or: $dashless [--quiet] foreach [--recursive] <command>
14    or: $dashless [--quiet] sync [--] [<path>...]"
15 OPTIONS_SPEC=
16 . git-sh-setup
17 . git-parse-remote
18 require_work_tree
20 command=
21 branch=
22 force=
23 reference=
24 cached=
25 recursive=
26 init=
27 files=
28 nofetch=
29 update=
30 prefix=
32 # Resolve relative url by appending to parent's url
33 resolve_relative_url ()
34 {
35         remote=$(get_default_remote)
36         remoteurl=$(git config "remote.$remote.url") ||
37                 remoteurl=$(pwd) # the repository is its own authoritative upstream
38         url="$1"
39         remoteurl=${remoteurl%/}
40         sep=/
41         while test -n "$url"
42         do
43                 case "$url" in
44                 ../*)
45                         url="${url#../}"
46                         case "$remoteurl" in
47                         */*)
48                                 remoteurl="${remoteurl%/*}"
49                                 ;;
50                         *:*)
51                                 remoteurl="${remoteurl%:*}"
52                                 sep=:
53                                 ;;
54                         *)
55                                 die "cannot strip one component off url '$remoteurl'"
56                                 ;;
57                         esac
58                         ;;
59                 ./*)
60                         url="${url#./}"
61                         ;;
62                 *)
63                         break;;
64                 esac
65         done
66         echo "$remoteurl$sep${url%/}"
67 }
69 #
70 # Get submodule info for registered submodules
71 # $@ = path to limit submodule list
72 #
73 module_list()
74 {
75         git ls-files --error-unmatch --stage -- "$@" |
76         perl -e '
77         my %unmerged = ();
78         my ($null_sha1) = ("0" x 40);
79         while (<STDIN>) {
80                 chomp;
81                 my ($mode, $sha1, $stage, $path) =
82                         /^([0-7]+) ([0-9a-f]{40}) ([0-3])\t(.*)$/;
83                 next unless $mode eq "160000";
84                 if ($stage ne "0") {
85                         if (!$unmerged{$path}++) {
86                                 print "$mode $null_sha1 U\t$path\n";
87                         }
88                         next;
89                 }
90                 print "$_\n";
91         }
92         '
93 }
95 #
96 # Map submodule path to submodule name
97 #
98 # $1 = path
99 #
100 module_name()
102         # Do we have "submodule.<something>.path = $1" defined in .gitmodules file?
103         re=$(printf '%s\n' "$1" | sed -e 's/[].[^$\\*]/\\&/g')
104         name=$( git config -f .gitmodules --get-regexp '^submodule\..*\.path$' |
105                 sed -n -e 's|^submodule\.\(.*\)\.path '"$re"'$|\1|p' )
106        test -z "$name" &&
107        die "No submodule mapping found in .gitmodules for path '$path'"
108        echo "$name"
112 # Clone a submodule
114 # Prior to calling, cmd_update checks that a possibly existing
115 # path is not a git repository.
116 # Likewise, cmd_add checks that path does not exist at all,
117 # since it is the location of a new submodule.
119 module_clone()
121         path=$1
122         url=$2
123         reference="$3"
125         if test -n "$reference"
126         then
127                 git-clone "$reference" -n "$url" "$path"
128         else
129                 git-clone -n "$url" "$path"
130         fi ||
131         die "Clone of '$url' into submodule path '$path' failed"
135 # Add a new submodule to the working tree, .gitmodules and the index
137 # $@ = repo path
139 # optional branch is stored in global branch variable
141 cmd_add()
143         # parse $args after "submodule ... add".
144         while test $# -ne 0
145         do
146                 case "$1" in
147                 -b | --branch)
148                         case "$2" in '') usage ;; esac
149                         branch=$2
150                         shift
151                         ;;
152                 -f | --force)
153                         force=$1
154                         ;;
155                 -q|--quiet)
156                         GIT_QUIET=1
157                         ;;
158                 --reference)
159                         case "$2" in '') usage ;; esac
160                         reference="--reference=$2"
161                         shift
162                         ;;
163                 --reference=*)
164                         reference="$1"
165                         shift
166                         ;;
167                 --)
168                         shift
169                         break
170                         ;;
171                 -*)
172                         usage
173                         ;;
174                 *)
175                         break
176                         ;;
177                 esac
178                 shift
179         done
181         repo=$1
182         path=$2
184         if test -z "$path"; then
185                 path=$(echo "$repo" |
186                         sed -e 's|/$||' -e 's|:*/*\.git$||' -e 's|.*[/:]||g')
187         fi
189         if test -z "$repo" -o -z "$path"; then
190                 usage
191         fi
193         # assure repo is absolute or relative to parent
194         case "$repo" in
195         ./*|../*)
196                 # dereference source url relative to parent's url
197                 realrepo=$(resolve_relative_url "$repo") || exit
198                 ;;
199         *:*|/*)
200                 # absolute url
201                 realrepo=$repo
202                 ;;
203         *)
204                 die "repo URL: '$repo' must be absolute or begin with ./|../"
205         ;;
206         esac
208         # normalize path:
209         # multiple //; leading ./; /./; /../; trailing /
210         path=$(printf '%s/\n' "$path" |
211                 sed -e '
212                         s|//*|/|g
213                         s|^\(\./\)*||
214                         s|/\./|/|g
215                         :start
216                         s|\([^/]*\)/\.\./||
217                         tstart
218                         s|/*$||
219                 ')
220         git ls-files --error-unmatch "$path" > /dev/null 2>&1 &&
221         die "'$path' already exists in the index"
223         if test -z "$force" && ! git add --dry-run --ignore-missing "$path" > /dev/null 2>&1
224         then
225                 echo >&2 "The following path is ignored by one of your .gitignore files:" &&
226                 echo >&2 $path &&
227                 echo >&2 "Use -f if you really want to add it."
228                 exit 1
229         fi
231         # perhaps the path exists and is already a git repo, else clone it
232         if test -e "$path"
233         then
234                 if test -d "$path"/.git -o -f "$path"/.git
235                 then
236                         echo "Adding existing repo at '$path' to the index"
237                 else
238                         die "'$path' already exists and is not a valid git repo"
239                 fi
241         else
243                 module_clone "$path" "$realrepo" "$reference" || exit
244                 (
245                         clear_local_git_env
246                         cd "$path" &&
247                         # ash fails to wordsplit ${branch:+-b "$branch"...}
248                         case "$branch" in
249                         '') git checkout -f -q ;;
250                         ?*) git checkout -f -q -B "$branch" "origin/$branch" ;;
251                         esac
252                 ) || die "Unable to checkout submodule '$path'"
253         fi
254         git config submodule."$path".url "$realrepo"
256         git add $force "$path" ||
257         die "Failed to add submodule '$path'"
259         git config -f .gitmodules submodule."$path".path "$path" &&
260         git config -f .gitmodules submodule."$path".url "$repo" &&
261         git add --force .gitmodules ||
262         die "Failed to register submodule '$path'"
266 # Execute an arbitrary command sequence in each checked out
267 # submodule
269 # $@ = command to execute
271 cmd_foreach()
273         # parse $args after "submodule ... foreach".
274         while test $# -ne 0
275         do
276                 case "$1" in
277                 -q|--quiet)
278                         GIT_QUIET=1
279                         ;;
280                 --recursive)
281                         recursive=1
282                         ;;
283                 -*)
284                         usage
285                         ;;
286                 *)
287                         break
288                         ;;
289                 esac
290                 shift
291         done
293         toplevel=$(pwd)
295         # dup stdin so that it can be restored when running the external
296         # command in the subshell (and a recursive call to this function)
297         exec 3<&0
299         module_list |
300         while read mode sha1 stage path
301         do
302                 if test -e "$path"/.git
303                 then
304                         say "Entering '$prefix$path'"
305                         name=$(module_name "$path")
306                         (
307                                 prefix="$prefix$path/"
308                                 clear_local_git_env
309                                 cd "$path" &&
310                                 eval "$@" &&
311                                 if test -n "$recursive"
312                                 then
313                                         cmd_foreach "--recursive" "$@"
314                                 fi
315                         ) <&3 3<&- ||
316                         die "Stopping at '$path'; script returned non-zero status."
317                 fi
318         done
322 # Register submodules in .git/config
324 # $@ = requested paths (default to all)
326 cmd_init()
328         # parse $args after "submodule ... init".
329         while test $# -ne 0
330         do
331                 case "$1" in
332                 -q|--quiet)
333                         GIT_QUIET=1
334                         ;;
335                 --)
336                         shift
337                         break
338                         ;;
339                 -*)
340                         usage
341                         ;;
342                 *)
343                         break
344                         ;;
345                 esac
346                 shift
347         done
349         module_list "$@" |
350         while read mode sha1 stage path
351         do
352                 # Skip already registered paths
353                 name=$(module_name "$path") || exit
354                 if test -z "$(git config "submodule.$name.url")"
355                 then
356                         url=$(git config -f .gitmodules submodule."$name".url)
357                         test -z "$url" &&
358                         die "No url found for submodule path '$path' in .gitmodules"
360                         # Possibly a url relative to parent
361                         case "$url" in
362                         ./*|../*)
363                                 url=$(resolve_relative_url "$url") || exit
364                                 ;;
365                         esac
366                         git config submodule."$name".url "$url" ||
367                         die "Failed to register url for submodule path '$path'"
368                 fi
370                 # Copy "update" setting when it is not set yet
371                 upd="$(git config -f .gitmodules submodule."$name".update)"
372                 test -z "$upd" ||
373                 test -n "$(git config submodule."$name".update)" ||
374                 git config submodule."$name".update "$upd" ||
375                 die "Failed to register update mode for submodule path '$path'"
377                 say "Submodule '$name' ($url) registered for path '$path'"
378         done
382 # Update each submodule path to correct revision, using clone and checkout as needed
384 # $@ = requested paths (default to all)
386 cmd_update()
388         # parse $args after "submodule ... update".
389         orig_flags=
390         while test $# -ne 0
391         do
392                 case "$1" in
393                 -q|--quiet)
394                         GIT_QUIET=1
395                         ;;
396                 -i|--init)
397                         init=1
398                         ;;
399                 -N|--no-fetch)
400                         nofetch=1
401                         ;;
402                 -f|--force)
403                         force=$1
404                         ;;
405                 -r|--rebase)
406                         update="rebase"
407                         ;;
408                 --reference)
409                         case "$2" in '') usage ;; esac
410                         reference="--reference=$2"
411                         orig_flags="$orig_flags $(git rev-parse --sq-quote "$1")"
412                         shift
413                         ;;
414                 --reference=*)
415                         reference="$1"
416                         ;;
417                 -m|--merge)
418                         update="merge"
419                         ;;
420                 --recursive)
421                         recursive=1
422                         ;;
423                 --)
424                         shift
425                         break
426                         ;;
427                 -*)
428                         usage
429                         ;;
430                 *)
431                         break
432                         ;;
433                 esac
434                 orig_flags="$orig_flags $(git rev-parse --sq-quote "$1")"
435                 shift
436         done
438         if test -n "$init"
439         then
440                 cmd_init "--" "$@" || return
441         fi
443         cloned_modules=
444         module_list "$@" |
445         while read mode sha1 stage path
446         do
447                 if test "$stage" = U
448                 then
449                         echo >&2 "Skipping unmerged submodule $path"
450                         continue
451                 fi
452                 name=$(module_name "$path") || exit
453                 url=$(git config submodule."$name".url)
454                 update_module=$(git config submodule."$name".update)
455                 if test -z "$url"
456                 then
457                         # Only mention uninitialized submodules when its
458                         # path have been specified
459                         test "$#" != "0" &&
460                         say "Submodule path '$path' not initialized" &&
461                         say "Maybe you want to use 'update --init'?"
462                         continue
463                 fi
465                 if ! test -d "$path"/.git -o -f "$path"/.git
466                 then
467                         module_clone "$path" "$url" "$reference"|| exit
468                         cloned_modules="$cloned_modules;$name"
469                         subsha1=
470                 else
471                         subsha1=$(clear_local_git_env; cd "$path" &&
472                                 git rev-parse --verify HEAD) ||
473                         die "Unable to find current revision in submodule path '$path'"
474                 fi
476                 if ! test -z "$update"
477                 then
478                         update_module=$update
479                 fi
481                 if test "$subsha1" != "$sha1"
482                 then
483                         subforce=$force
484                         # If we don't already have a -f flag and the submodule has never been checked out
485                         if test -z "$subsha1" -a -z "$force"
486                         then
487                                 subforce="-f"
488                         fi
490                         if test -z "$nofetch"
491                         then
492                                 # Run fetch only if $sha1 isn't present or it
493                                 # is not reachable from a ref.
494                                 (clear_local_git_env; cd "$path" &&
495                                         ( (rev=$(git rev-list -n 1 $sha1 --not --all 2>/dev/null) &&
496                                          test -z "$rev") || git-fetch)) ||
497                                 die "Unable to fetch in submodule path '$path'"
498                         fi
500                         # Is this something we just cloned?
501                         case ";$cloned_modules;" in
502                         *";$name;"*)
503                                 # then there is no local change to integrate
504                                 update_module= ;;
505                         esac
507                         case "$update_module" in
508                         rebase)
509                                 command="git rebase"
510                                 action="rebase"
511                                 msg="rebased onto"
512                                 ;;
513                         merge)
514                                 command="git merge"
515                                 action="merge"
516                                 msg="merged in"
517                                 ;;
518                         *)
519                                 command="git checkout $subforce -q"
520                                 action="checkout"
521                                 msg="checked out"
522                                 ;;
523                         esac
525                         (clear_local_git_env; cd "$path" && $command "$sha1") ||
526                         die "Unable to $action '$sha1' in submodule path '$path'"
527                         say "Submodule path '$path': $msg '$sha1'"
528                 fi
530                 if test -n "$recursive"
531                 then
532                         (clear_local_git_env; cd "$path" && eval cmd_update "$orig_flags") ||
533                         die "Failed to recurse into submodule path '$path'"
534                 fi
535         done
538 set_name_rev () {
539         revname=$( (
540                 clear_local_git_env
541                 cd "$1" && {
542                         git describe "$2" 2>/dev/null ||
543                         git describe --tags "$2" 2>/dev/null ||
544                         git describe --contains "$2" 2>/dev/null ||
545                         git describe --all --always "$2"
546                 }
547         ) )
548         test -z "$revname" || revname=" ($revname)"
551 # Show commit summary for submodules in index or working tree
553 # If '--cached' is given, show summary between index and given commit,
554 # or between working tree and given commit
556 # $@ = [commit (default 'HEAD'),] requested paths (default all)
558 cmd_summary() {
559         summary_limit=-1
560         for_status=
561         diff_cmd=diff-index
563         # parse $args after "submodule ... summary".
564         while test $# -ne 0
565         do
566                 case "$1" in
567                 --cached)
568                         cached="$1"
569                         ;;
570                 --files)
571                         files="$1"
572                         ;;
573                 --for-status)
574                         for_status="$1"
575                         ;;
576                 -n|--summary-limit)
577                         if summary_limit=$(($2 + 0)) 2>/dev/null && test "$summary_limit" = "$2"
578                         then
579                                 :
580                         else
581                                 usage
582                         fi
583                         shift
584                         ;;
585                 --)
586                         shift
587                         break
588                         ;;
589                 -*)
590                         usage
591                         ;;
592                 *)
593                         break
594                         ;;
595                 esac
596                 shift
597         done
599         test $summary_limit = 0 && return
601         if rev=$(git rev-parse -q --verify --default HEAD ${1+"$1"})
602         then
603                 head=$rev
604                 test $# = 0 || shift
605         elif test -z "$1" -o "$1" = "HEAD"
606         then
607                 # before the first commit: compare with an empty tree
608                 head=$(git hash-object -w -t tree --stdin </dev/null)
609                 test -z "$1" || shift
610         else
611                 head="HEAD"
612         fi
614         if [ -n "$files" ]
615         then
616                 test -n "$cached" &&
617                 die "--cached cannot be used with --files"
618                 diff_cmd=diff-files
619                 head=
620         fi
622         cd_to_toplevel
623         # Get modified modules cared by user
624         modules=$(git $diff_cmd $cached --ignore-submodules=dirty --raw $head -- "$@" |
625                 sane_egrep '^:([0-7]* )?160000' |
626                 while read mod_src mod_dst sha1_src sha1_dst status name
627                 do
628                         # Always show modules deleted or type-changed (blob<->module)
629                         test $status = D -o $status = T && echo "$name" && continue
630                         # Also show added or modified modules which are checked out
631                         GIT_DIR="$name/.git" git-rev-parse --git-dir >/dev/null 2>&1 &&
632                         echo "$name"
633                 done
634         )
636         test -z "$modules" && return
638         git $diff_cmd $cached --ignore-submodules=dirty --raw $head -- $modules |
639         sane_egrep '^:([0-7]* )?160000' |
640         cut -c2- |
641         while read mod_src mod_dst sha1_src sha1_dst status name
642         do
643                 if test -z "$cached" &&
644                         test $sha1_dst = 0000000000000000000000000000000000000000
645                 then
646                         case "$mod_dst" in
647                         160000)
648                                 sha1_dst=$(GIT_DIR="$name/.git" git rev-parse HEAD)
649                                 ;;
650                         100644 | 100755 | 120000)
651                                 sha1_dst=$(git hash-object $name)
652                                 ;;
653                         000000)
654                                 ;; # removed
655                         *)
656                                 # unexpected type
657                                 echo >&2 "unexpected mode $mod_dst"
658                                 continue ;;
659                         esac
660                 fi
661                 missing_src=
662                 missing_dst=
664                 test $mod_src = 160000 &&
665                 ! GIT_DIR="$name/.git" git-rev-parse -q --verify $sha1_src^0 >/dev/null &&
666                 missing_src=t
668                 test $mod_dst = 160000 &&
669                 ! GIT_DIR="$name/.git" git-rev-parse -q --verify $sha1_dst^0 >/dev/null &&
670                 missing_dst=t
672                 total_commits=
673                 case "$missing_src,$missing_dst" in
674                 t,)
675                         errmsg="  Warn: $name doesn't contain commit $sha1_src"
676                         ;;
677                 ,t)
678                         errmsg="  Warn: $name doesn't contain commit $sha1_dst"
679                         ;;
680                 t,t)
681                         errmsg="  Warn: $name doesn't contain commits $sha1_src and $sha1_dst"
682                         ;;
683                 *)
684                         errmsg=
685                         total_commits=$(
686                         if test $mod_src = 160000 -a $mod_dst = 160000
687                         then
688                                 range="$sha1_src...$sha1_dst"
689                         elif test $mod_src = 160000
690                         then
691                                 range=$sha1_src
692                         else
693                                 range=$sha1_dst
694                         fi
695                         GIT_DIR="$name/.git" \
696                         git rev-list --first-parent $range -- | wc -l
697                         )
698                         total_commits=" ($(($total_commits + 0)))"
699                         ;;
700                 esac
702                 sha1_abbr_src=$(echo $sha1_src | cut -c1-7)
703                 sha1_abbr_dst=$(echo $sha1_dst | cut -c1-7)
704                 if test $status = T
705                 then
706                         if test $mod_dst = 160000
707                         then
708                                 echo "* $name $sha1_abbr_src(blob)->$sha1_abbr_dst(submodule)$total_commits:"
709                         else
710                                 echo "* $name $sha1_abbr_src(submodule)->$sha1_abbr_dst(blob)$total_commits:"
711                         fi
712                 else
713                         echo "* $name $sha1_abbr_src...$sha1_abbr_dst$total_commits:"
714                 fi
715                 if test -n "$errmsg"
716                 then
717                         # Don't give error msg for modification whose dst is not submodule
718                         # i.e. deleted or changed to blob
719                         test $mod_dst = 160000 && echo "$errmsg"
720                 else
721                         if test $mod_src = 160000 -a $mod_dst = 160000
722                         then
723                                 limit=
724                                 test $summary_limit -gt 0 && limit="-$summary_limit"
725                                 GIT_DIR="$name/.git" \
726                                 git log $limit --pretty='format:  %m %s' \
727                                 --first-parent $sha1_src...$sha1_dst
728                         elif test $mod_dst = 160000
729                         then
730                                 GIT_DIR="$name/.git" \
731                                 git log --pretty='format:  > %s' -1 $sha1_dst
732                         else
733                                 GIT_DIR="$name/.git" \
734                                 git log --pretty='format:  < %s' -1 $sha1_src
735                         fi
736                         echo
737                 fi
738                 echo
739         done |
740         if test -n "$for_status"; then
741                 if [ -n "$files" ]; then
742                         echo "# Submodules changed but not updated:"
743                 else
744                         echo "# Submodule changes to be committed:"
745                 fi
746                 echo "#"
747                 sed -e 's|^|# |' -e 's|^# $|#|'
748         else
749                 cat
750         fi
753 # List all submodules, prefixed with:
754 #  - submodule not initialized
755 #  + different revision checked out
757 # If --cached was specified the revision in the index will be printed
758 # instead of the currently checked out revision.
760 # $@ = requested paths (default to all)
762 cmd_status()
764         # parse $args after "submodule ... status".
765         orig_flags=
766         while test $# -ne 0
767         do
768                 case "$1" in
769                 -q|--quiet)
770                         GIT_QUIET=1
771                         ;;
772                 --cached)
773                         cached=1
774                         ;;
775                 --recursive)
776                         recursive=1
777                         ;;
778                 --)
779                         shift
780                         break
781                         ;;
782                 -*)
783                         usage
784                         ;;
785                 *)
786                         break
787                         ;;
788                 esac
789                 orig_flags="$orig_flags $(git rev-parse --sq-quote "$1")"
790                 shift
791         done
793         module_list "$@" |
794         while read mode sha1 stage path
795         do
796                 name=$(module_name "$path") || exit
797                 url=$(git config submodule."$name".url)
798                 displaypath="$prefix$path"
799                 if test "$stage" = U
800                 then
801                         say "U$sha1 $displaypath"
802                         continue
803                 fi
804                 if test -z "$url" || ! test -d "$path"/.git -o -f "$path"/.git
805                 then
806                         say "-$sha1 $displaypath"
807                         continue;
808                 fi
809                 set_name_rev "$path" "$sha1"
810                 if git diff-files --ignore-submodules=dirty --quiet -- "$path"
811                 then
812                         say " $sha1 $displaypath$revname"
813                 else
814                         if test -z "$cached"
815                         then
816                                 sha1=$(clear_local_git_env; cd "$path" && git rev-parse --verify HEAD)
817                                 set_name_rev "$path" "$sha1"
818                         fi
819                         say "+$sha1 $displaypath$revname"
820                 fi
822                 if test -n "$recursive"
823                 then
824                         (
825                                 prefix="$displaypath/"
826                                 clear_local_git_env
827                                 cd "$path" &&
828                                 eval cmd_status "$orig_args"
829                         ) ||
830                         die "Failed to recurse into submodule path '$path'"
831                 fi
832         done
835 # Sync remote urls for submodules
836 # This makes the value for remote.$remote.url match the value
837 # specified in .gitmodules.
839 cmd_sync()
841         while test $# -ne 0
842         do
843                 case "$1" in
844                 -q|--quiet)
845                         GIT_QUIET=1
846                         shift
847                         ;;
848                 --)
849                         shift
850                         break
851                         ;;
852                 -*)
853                         usage
854                         ;;
855                 *)
856                         break
857                         ;;
858                 esac
859         done
860         cd_to_toplevel
861         module_list "$@" |
862         while read mode sha1 stage path
863         do
864                 name=$(module_name "$path")
865                 url=$(git config -f .gitmodules --get submodule."$name".url)
867                 # Possibly a url relative to parent
868                 case "$url" in
869                 ./*|../*)
870                         url=$(resolve_relative_url "$url") || exit
871                         ;;
872                 esac
874                 if git config "submodule.$name.url" >/dev/null 2>/dev/null
875                 then
876                         say "Synchronizing submodule url for '$name'"
877                         git config submodule."$name".url "$url"
879                         if test -e "$path"/.git
880                         then
881                         (
882                                 clear_local_git_env
883                                 cd "$path"
884                                 remote=$(get_default_remote)
885                                 git config remote."$remote".url "$url"
886                         )
887                         fi
888                 fi
889         done
892 # This loop parses the command line arguments to find the
893 # subcommand name to dispatch.  Parsing of the subcommand specific
894 # options are primarily done by the subcommand implementations.
895 # Subcommand specific options such as --branch and --cached are
896 # parsed here as well, for backward compatibility.
898 while test $# != 0 && test -z "$command"
899 do
900         case "$1" in
901         add | foreach | init | update | status | summary | sync)
902                 command=$1
903                 ;;
904         -q|--quiet)
905                 GIT_QUIET=1
906                 ;;
907         -b|--branch)
908                 case "$2" in
909                 '')
910                         usage
911                         ;;
912                 esac
913                 branch="$2"; shift
914                 ;;
915         --cached)
916                 cached="$1"
917                 ;;
918         --)
919                 break
920                 ;;
921         -*)
922                 usage
923                 ;;
924         *)
925                 break
926                 ;;
927         esac
928         shift
929 done
931 # No command word defaults to "status"
932 test -n "$command" || command=status
934 # "-b branch" is accepted only by "add"
935 if test -n "$branch" && test "$command" != add
936 then
937         usage
938 fi
940 # "--cached" is accepted only by "status" and "summary"
941 if test -n "$cached" && test "$command" != status -a "$command" != summary
942 then
943         usage
944 fi
946 "cmd_$command" "$@"