aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Documentation/git-clone.txt24
-rwxr-xr-xgit-checkout.sh3
-rwxr-xr-xgit-clone.sh66
-rwxr-xr-xgit-format-patch.sh141
-rwxr-xr-xgit-merge-octopus.sh20
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"