diff options
-rw-r--r-- | Documentation/git-clone.txt | 24 | ||||
-rwxr-xr-x | git-checkout.sh | 3 | ||||
-rwxr-xr-x | git-clone.sh | 66 | ||||
-rwxr-xr-x | git-format-patch.sh | 141 | ||||
-rwxr-xr-x | git-merge-octopus.sh | 20 |
5 files changed, 154 insertions, 100 deletions
diff --git a/Documentation/git-clone.txt b/Documentation/git-clone.txt index 790b87b23..8488202e3 100644 --- a/Documentation/git-clone.txt +++ b/Documentation/git-clone.txt @@ -9,7 +9,7 @@ git-clone - Clones a repository. SYNOPSIS -------- [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>] DESCRIPTION @@ -58,6 +58,12 @@ OPTIONS -n:: 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>:: Instead of using the branch name 'origin' to keep track of the upstream repository, use <name> instead. Note @@ -103,6 +109,22 @@ $ cd copy $ 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 ------ Written by Linus Torvalds <torvalds@osdl.org> diff --git a/git-checkout.sh b/git-checkout.sh index bd7f00730..d99688fbf 100755 --- a/git-checkout.sh +++ b/git-checkout.sh @@ -164,6 +164,9 @@ else esac exit 0 ) + saved_err=$? + git diff-files --name-status + (exit $saved_err) fi # diff --git a/git-clone.sh b/git-clone.sh index 377d59e62..168eb963b 100755 --- a/git-clone.sh +++ b/git-clone.sh @@ -9,7 +9,7 @@ unset CDPATH 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 } @@ -53,11 +53,15 @@ use_local=no local_shared=no no_checkout= upload_pack= +naked= origin=origin 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) naked=yes ;; *,-l|*,--l|*,--lo|*,--loc|*,--loca|*,--local) use_local=yes ;; *,-s|*,--s|*,--sh|*,--sha|*,--shar|*,--share|*,--shared) local_shared=yes; use_local=yes ;; @@ -81,6 +85,9 @@ do shift done +# --naked implies --no-checkout +test -z "$naked" || no_checkout=yes + # Turn the source into an absolute path if # it is local repo="$1" @@ -95,10 +102,17 @@ dir="$2" [ -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" && git-init-db && pwd) -) && -test -d "$D" || usage +D=$(cd "$dir" && pwd) && +case "$naked" in +yes) GIT_DIR="$D" ;; +*) 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. case "$local,$use_local" in @@ -118,21 +132,21 @@ yes,yes) 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 && - rm -f "$D/.git/objects/sample" && + rm -f "$GIT_DIR/objects/sample" && 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) - 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" - } >"$D/.git/objects/info/alternates" + } >"$GIT_DIR/objects/info/alternates" ;; esac @@ -143,27 +157,27 @@ yes,yes) 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 \ - --exclude info "$repo/objects/" "$D/.git/objects/" && + --exclude info "$repo/objects/" "$GIT_DIR/objects/" && 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" \ - "$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 && - 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 @@ -171,9 +185,9 @@ yes,yes) '') 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 - rm -f "$D/.git/TMP_ALT" + rm -f "$GIT_DIR/TMP_ALT" fi ;; http://*) @@ -194,25 +208,25 @@ esac cd "$D" || exit -if test -f ".git/HEAD" +if test -f "$GIT_DIR/HEAD" 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) && - find .git/refs/heads -type f -print | + (cd "$GIT_DIR" && find "refs/heads" -type f -print) | 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}" - done >>.git/remotes/origin + done >>"$GIT_DIR/remotes/origin" esac case "$no_checkout" in diff --git a/git-format-patch.sh b/git-format-patch.sh index d3979d763..7e67c4e40 100755 --- a/git-format-patch.sh +++ b/git-format-patch.sh @@ -34,14 +34,12 @@ outdir=./ while case "$#" in 0) break;; esac do case "$1" in - -a|--a|--au|--aut|--auth|--autho|--author) - author=t ;; -c|--c|--ch|--che|--chec|--check) check=t ;; - -d|--d|--da|--dat|--date) - date=t ;; - -m|--m|--mb|--mbo|--mbox) - date=t author=t mbox=t ;; + -a|--a|--au|--aut|--auth|--autho|--author|\ + -d|--d|--da|--dat|--date|\ + -m|--m|--mb|--mbo|--mbox) # now noop + ;; -k|--k|--ke|--kee|--keep|--keep-|--keep-s|--keep-su|--keep-sub|\ --keep-subj|--keep-subje|--keep-subjec|--keep-subject) keep_subject=t ;; @@ -173,80 +171,89 @@ titleScript=' q ' -whosepatchScript=' -/^author /{ - s/'\''/'\''\\'\'\''/g - s/author \(.*>\) \(.*\)$/au='\''\1'\'' ad='\''\2'\''/p - q -}' - process_one () { - mailScript=' - /./d - /^$/n' - case "$keep_subject" in - t) ;; - *) - mailScript="$mailScript"' - s|^\[PATCH[^]]*\] *|| - s|^|[PATCH'"$num"'] |' - ;; - esac - mailScript="$mailScript"' - s|^|Subject: |' - case "$mbox" in - t) - echo 'From nobody Mon Sep 17 00:00:00 2001' ;# UNIX "From" line - ;; - esac + perl -w -e ' +my ($keep_subject, $num, $signoff, $commsg) = @ARGV; +my ($signoff_pattern, $done_header, $done_subject, $signoff_seen, + $last_was_signoff); - eval "$(sed -ne "$whosepatchScript" $commsg)" - test "$author,$au" = ",$me" || { - mailScript="$mailScript"' - a\ -From: '"$au" - } - test "$date,$au" = ",$me" || { - mailScript="$mailScript"' - a\ -Date: '"$ad" - } +if ($signoff) { + $signoff = `git-var GIT_COMMITTER_IDENT`; + $signoff =~ s/>.*/>/; + $signoff_pattern = quotemeta($signoff); +} - mailScript="$mailScript"' - a\ +my @weekday_names = qw(Sun Mon Tue Wed Thu Fri Sat); +my @month_names = qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec); - : body - p - n - b body' +sub show_date { + my ($time, $tz) = @_; + my $minutes = abs($tz); + $minutes = ($minutes / 100) * 60 + ($minutes % 100); + if ($tz < 0) { + $minutes = -$minutes; + } + my $t = $time + $minutes * 60; + my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday) = gmtime($t); + return sprintf("%s %s %d %02d:%02d:%02d %d %+05d", + $weekday_names[$wday], + $month_names[$mon], + $mday, $hour, $min, $sec, + $year+1900, $tz); +} - (cat $commsg ; echo; echo) | - sed -ne "$mailScript" | - git-stripspace +print "From nobody Mon Sep 17 00:00:00 2001\n"; +open FH, "git stripspace <$commsg |" or die "open $commsg pipe"; +while (<FH>) { + unless ($done_header) { + if (/^$/) { + $done_header = 1; + } + elsif (/^author (.*>) (.*)$/) { + my ($author_ident, $author_date) = ($1, $2); + my ($utc, $off) = ($author_date =~ /^(\d+) ([-+]?\d+)$/); + $author_date = show_date($utc, $off); - test "$signoff" = "t" && { - offsigner=`git-var GIT_COMMITTER_IDENT | sed -e 's/>.*/>/'` - line="Signed-off-by: $offsigner" - grep -q "^$line\$" $commsg || { - echo - echo "$line" - echo - } + print "From: $author_ident\n"; + print "Date: $author_date\n"; } - echo - echo '---' - echo + next; + } + unless ($done_subject) { + unless ($keep_subject) { + s/^\[PATCH[^]]*\]\s*//; + s/^/[PATCH$num] /; + } + print "Subject: $_"; + $done_subject = 1; + next; + } + + $last_was_signoff = 0; + if (/Signed-off-by:/i) { + if ($signoff ne "" && /Signed-off-by:\s*$signoff_pattern$/i) { + $signoff_seen = 1; + } + } + print $_; +} +if (!$signoff_seen && $signoff ne "") { + if (!$last_was_signoff) { + print "\n"; + } + print "$signoff\n"; +} +print "\n---\n\n"; +close FH or die "close $commsg pipe"; +' "$keep_subject" "$num" "$signoff" $commsg + git-diff-tree -p $diff_opts "$commit" | git-apply --stat --summary echo git-diff-tree -p $diff_opts "$commit" echo "-- " echo "@@GIT_VERSION@@" - case "$mbox" in - t) - echo - ;; - esac + echo } total=`wc -l <$series | tr -dc "[0-9]"` diff --git a/git-merge-octopus.sh b/git-merge-octopus.sh index d1f9f3d2d..eb74f96e8 100755 --- a/git-merge-octopus.sh +++ b/git-merge-octopus.sh @@ -48,8 +48,19 @@ MRC=$head MSG= PARENT="-p $head" MRT=$(git-write-tree) CNT=1 ;# counting our head NON_FF_MERGE=0 +OCTOPUS_FAILURE=0 for SHA1 in $remotes do + case "$OCTOPUS_FAILURE" in + 1) + # We allow only last one to have a hand-resolvable + # conflicts. Last round failed and we still had + # a head to merge. + echo "Automated merge did not work." + echo "Should not be doing an Octopus." + exit 2 + esac + common=$(git-merge-base --all $MRC $SHA1) || die "Unable to find common commit with $SHA1" @@ -84,11 +95,8 @@ do if test $? -ne 0 then echo "Simple merge did not work, trying automatic merge." - git-merge-index -o git-merge-one-file -a || { - echo "Not trivially merged." - echo "Should not be doing an Octopus." - exit 2 - } + git-merge-index -o git-merge-one-file -a || + OCTOPUS_FAILURE=1 next=$(git-write-tree 2>/dev/null) fi @@ -103,4 +111,4 @@ do MRT=$next done -exit 0 +exit "$OCTOPUS_FAILURE" |