Merge branch 'master' of . 
diff --git a/Documentation/git-cvsimport-script.txt b/Documentation/git-cvsimport-script.txt
index d01a15d..9d8acfc 100644
--- a/Documentation/git-cvsimport-script.txt
+++ b/Documentation/git-cvsimport-script.txt
@@ -44,6 +44,9 @@
 	to avoid noisy changesets. Highly recommended, but off by default
 	to preserve compatibility with early imported trees. 
 
+-u::
+	Convert underscores in tag and branch names to dots.
+
 -o <branch-for-HEAD>::
 	The 'HEAD' branch from CVS is imported to the 'origin' branch within
 	the git repository, as 'HEAD' already has a special meaning for git.
diff --git a/Documentation/git-get-tar-commit-id.txt b/Documentation/git-get-tar-commit-id.txt
index f9c4140..0eb5e28 100644
--- a/Documentation/git-get-tar-commit-id.txt
+++ b/Documentation/git-get-tar-commit-id.txt
@@ -3,25 +3,24 @@
 
 NAME
 ----
-git-get-tar-commit-id - Some git command not yet documented.
+git-get-tar-commit-id - Extract commit ID from an archive created using git-tar-tree.
 
 
 SYNOPSIS
 --------
-'git-get-tar-commit-id' [ --option ] <args>...
+'git-get-tar-commit-id' < <tarfile>
+
 
 DESCRIPTION
 -----------
-Does something not yet documented.
+Acts as a filter, extracting the commit ID stored in archives created by
+git-tar-tree.  It reads only the first 1024 bytes of input, thus its
+runtime is not influenced by the size of <tarfile> very much.
 
-
-OPTIONS
--------
---option::
-	Some option not yet documented.
-
-<args>...::
-	Some argument not yet documented.
+If no commit ID is found, git-get-tar-commit-id quietly exists with a
+return code of 1.  This can happen if <tarfile> had not been created
+using git-tar-tree or if the first parameter of git-tar-tree had been
+a tree ID instead of a commit ID or tag.
 
 
 Author
diff --git a/Documentation/git-rename-script.txt b/Documentation/git-rename-script.txt
index 1abc68b..b110525 100644
--- a/Documentation/git-rename-script.txt
+++ b/Documentation/git-rename-script.txt
@@ -1,6 +1,5 @@
-
 git-rename-script(1)
-=====================
+====================
 v0.1, May 2005
 
 NAME
diff --git a/Documentation/git-repack-script.txt b/Documentation/git-repack-script.txt
index cd449bc..df94ec1 100644
--- a/Documentation/git-repack-script.txt
+++ b/Documentation/git-repack-script.txt
@@ -1,5 +1,5 @@
 git-repack-script(1)
-=====================
+====================
 v0.99.5, August 2005
 
 NAME
diff --git a/Documentation/git-send-email-script.txt b/Documentation/git-send-email-script.txt
index 9ad82cc..f79ad19 100644
--- a/Documentation/git-send-email-script.txt
+++ b/Documentation/git-send-email-script.txt
@@ -1,5 +1,5 @@
 git-send-email-script(1)
-=======================
+========================
 v0.1, July 2005
 
 NAME
diff --git a/Documentation/git.txt b/Documentation/git.txt
index 0bcd990..b10edff 100644
--- a/Documentation/git.txt
+++ b/Documentation/git.txt
@@ -319,6 +319,8 @@
 link:git-send-email-script.html[git-send-email]::
 	Send patch e-mails out of "format-patch --mbox" output.
 
+link:git-get-tar-commit-id.html[git-get-tar-commit-id]::
+	Extract commit ID from an archive created using git-tar-tree.
 
 Commands not yet documented
 ---------------------------
@@ -338,9 +340,6 @@
 link:git-format-patch-script.html[git-format-patch-script]::
 	git-format-patch-script.
 
-link:git-get-tar-commit-id.html[git-get-tar-commit-id]::
-	git-get-tar-commit-id.
-
 link:git-request-pull-script.html[git-request-pull-script]::
 	git-request-pull-script.
 
diff --git a/get-tar-commit-id.c b/get-tar-commit-id.c
index a1a17e5..4166290 100644
--- a/get-tar-commit-id.c
+++ b/get-tar-commit-id.c
@@ -1,3 +1,6 @@
+/*
+ * Copyright (C) 2005 Rene Scharfe
+ */
 #include <stdio.h>
 #include <string.h>
 #include <unistd.h>
diff --git a/git-cvsimport-script b/git-cvsimport-script
index e3a8e58..5079c79 100755
--- a/git-cvsimport-script
+++ b/git-cvsimport-script
@@ -24,23 +24,24 @@
 use IO::Socket;
 use IO::Pipe;
 use POSIX qw(strftime dup2);
+use IPC::Open2;
 
 $SIG{'PIPE'}="IGNORE";
 $ENV{'TZ'}="UTC";
 
-our($opt_h,$opt_o,$opt_v,$opt_k,$opt_d,$opt_p,$opt_C,$opt_z,$opt_i,$opt_s,$opt_m,$opt_M);
+our($opt_h,$opt_o,$opt_v,$opt_k,$opt_u,$opt_d,$opt_p,$opt_C,$opt_z,$opt_i,$opt_s,$opt_m,$opt_M);
 
 sub usage() {
 	print STDERR <<END;
 Usage: ${\basename $0}     # fetch/update GIT from CVS
-       [ -o branch-for-HEAD ] [ -h ] [ -v ] [ -d CVSROOT ]
-       [ -p opts-for-cvsps ] [ -C GIT_repository ] [ -z fuzz ]
-       [ -i ] [ -k ] [-s subst] [ -m ] [ -M regex] [ CVS_module ]
+       [-o branch-for-HEAD] [-h] [-v] [-d CVSROOT]
+       [-p opts-for-cvsps] [-C GIT_repository] [-z fuzz]
+       [-i] [-k] [-u] [-s subst] [-m] [-M regex] [CVS_module]
 END
 	exit(1);
 }
 
-getopts("hivmko:d:p:C:z:s:M:") or usage();
+getopts("hivmkuo:d:p:C:z:s:M:") or usage();
 usage if $opt_h;
 
 @ARGV <= 1 or usage();
@@ -628,13 +629,37 @@
 		or die "Cannot write branch $branch for update: $!\n";
 
 	if($tag) {
-		open(C,">$git_dir/refs/tags/$tag")
-			or die "Cannot create tag $tag: $!\n";
-		print C "$cid\n"
-			or die "Cannot write tag $branch: $!\n";
+		my($in, $out) = ('','');
+	        my($xtag) = $tag;
+		$xtag =~ s/\s+\*\*.*$//; # Remove stuff like ** INVALID ** and ** FUNKY **
+		$xtag =~ tr/_/\./ if ( $opt_u );
+		
+		my $pid = open2($in, $out, 'git-mktag');
+		print $out "object $cid\n".
+		    "type commit\n".
+		    "tag $xtag\n".
+		    "tagger $author <$author>\n"
+		    or die "Cannot create tag object $xtag: $!\n";
+		close($out)
+		    or die "Cannot create tag object $xtag: $!\n";
+
+		my $tagobj = <$in>;
+		chomp $tagobj;
+
+		if ( !close($in) or waitpid($pid, 0) != $pid or
+		     $? != 0 or $tagobj !~ /^[0123456789abcdef]{40}$/ ) {
+		    die "Cannot create tag object $xtag: $!\n";
+	        }
+		
+
+		open(C,">$git_dir/refs/tags/$xtag")
+			or die "Cannot create tag $xtag: $!\n";
+		print C "$tagobj\n"
+			or die "Cannot write tag $xtag: $!\n";
 		close(C)
-			or die "Cannot write tag $branch: $!\n";
-		print "Created tag '$tag' on '$branch'\n" if $opt_v;
+			or die "Cannot write tag $xtag: $!\n";
+
+		print "Created tag '$xtag' on '$branch'\n" if $opt_v;
 	}
 };