diff options
-rw-r--r-- | Documentation/git-cvsimport-script.txt | 6 | ||||
-rw-r--r-- | Documentation/glossary.txt | 198 | ||||
-rw-r--r-- | Documentation/tutorial.txt | 2 | ||||
-rw-r--r-- | README | 10 | ||||
-rw-r--r-- | apply.c | 8 | ||||
-rwxr-xr-x | git-branch-script | 25 | ||||
-rwxr-xr-x | git-commit-script | 11 | ||||
-rwxr-xr-x | git-cvsimport-script | 8 | ||||
-rwxr-xr-x | git-format-patch-script | 2 | ||||
-rwxr-xr-x | git-parse-remote | 2 | ||||
-rwxr-xr-x | git-show-branches-script | 24 | ||||
-rw-r--r-- | rev-parse.c | 30 | ||||
-rwxr-xr-x | t/t4102-apply-rename.sh | 37 |
13 files changed, 321 insertions, 42 deletions
diff --git a/Documentation/git-cvsimport-script.txt b/Documentation/git-cvsimport-script.txt index 61713d859c..ae46b2f072 100644 --- a/Documentation/git-cvsimport-script.txt +++ b/Documentation/git-cvsimport-script.txt @@ -11,7 +11,8 @@ SYNOPSIS -------- 'git-cvsimport-script' [ -o <branch-for-HEAD> ] [ -h ] [ -v ] [ -d <CVSROOT> ] [ -p <options-for-cvsps> ] - [ -C <GIT_repository> ] [ -i ] [ -k ] [ <CVS_module> ] + [ -C <GIT_repository> ] [ -i ] [ -k ] + [ -s <subst> ] [ <CVS_module> ] DESCRIPTION @@ -69,6 +70,9 @@ OPTIONS -z <fuzz>:: Pass the timestamp fuzz factor to cvsps. +-s <subst>:: + Substitute the character "/" in branch names with <subst> + OUTPUT ------ If '-v' is specified, the script reports what it is doing. diff --git a/Documentation/glossary.txt b/Documentation/glossary.txt new file mode 100644 index 0000000000..bac3c532fa --- /dev/null +++ b/Documentation/glossary.txt @@ -0,0 +1,198 @@ +object:: + The unit of storage in GIT. It is uniquely identified by + the SHA1 of its contents. Consequently, an object can not + be changed. + +SHA1:: + A 20-byte sequence (or 41-byte file containing the hex + representation and a newline). It is calculated from the + contents of an object by the Secure Hash Algorithm 1. + +object database:: + Stores a set of "objects", and an individial object is identified + by its SHA1 (its ref). The objects are either stored as single + files, or live inside of packs. + +object name:: + Synonym for SHA1. + +blob object:: + Untyped object, i.e. the contents of a file. + +tree object:: + An object containing a list of blob and/or tree objects. + (A tree usually corresponds to a directory without + subdirectories). + +tree:: + Either a working tree, or a tree object together with the + dependent blob and tree objects (i.e. a stored representation + of a working tree). + +cache:: + A collection of files whose contents are stored as objects. + The cache is a stored version of your working tree. Well, can + also contain a second, and even a third version of a working + tree, which are used when merging. + +cache entry:: + The information regarding a particular file, stored in the index. + A cache entry can be unmerged, if a merge was started, but not + yet finished (i.e. if the cache contains multiple versions of + that file). + +index:: + Contains information about the cache contents, in particular + timestamps and mode flags ("stat information") for the files + stored in the cache. An unmerged index is an index which contains + unmerged cache entries. + +working tree:: + The set of files and directories currently being worked on. + Think "ls -laR" + +directory:: + The list you get with "ls" :-) + +checkout:: + The action of updating the working tree to a revision which was + stored in the object database. + +revision:: + A particular state of files and directories which was stored in + the object database. It is referenced by a commit object. + +commit:: + The action of storing the current state of the cache in the + object database. The result is a revision. + +commit object:: + An object which contains the information about a particular + revision, such as parents, committer, author, date and the + tree object which corresponds to the top directory of the + stored revision. + +changeset:: + BitKeeper/cvsps speak for "commit". Since git does not store + changes, but states, it really does not make sense to use + the term "changesets" with git. + +ent:: + Favorite synonym to "tree-ish" by some total geeks. + +clean:: + A working tree is clean, if it corresponds to the revision + referenced by the current head. + +dirty:: + A working tree is said to be dirty if it contains modifications + which have not been committed to the current branch. + +head:: + The top of a branch. It contains a ref to the corresponding + commit object. + +branch:: + A non-cyclical graph of revisions, i.e. the complete history of + a particular revision, which does not (yet) have children, which + is called the branch head. The branch heads are stored in + $GIT_DIR/refs/heads/. + +ref:: + A 40-byte hex representation of a SHA1 pointing to a particular + object. These are stored in $GIT_DIR/refs/. + +head ref:: + A ref pointing to a head. Often, this is abbreviated to "head". + Head refs are stored in $GIT_DIR/refs/heads/. + +tree-ish:: + A ref pointing to either a commit object, a tree object, or a + tag object pointing to a commit or tree object. + +tag object:: + An object containing a ref pointing to another object. It can + contain a (PGP) signature, in which case it is called "signed + tag object". + +tag:: + A ref pointing to a tag or commit object. In contrast to a head, + a tag is not changed by a commit. Tags (not tag objects) are + stored in $GIT_DIR/refs/tags/. A git tag has nothing to do with + a Lisp tag (which is called object type in git's context). + +merge:: + To merge branches means to try to accumulate the changes since a + common ancestor and apply them to the first branch. An automatic + merge uses heuristics to accomplish that. Evidently, an automatic + merge can fail. + +resolve:: + The action of fixing up manually what a failed automatic merge + left behind. + +repository:: + A collection of refs together with an object database containing + all objects, which are reachable from the refs. A repository can + share an object database with other repositories. + +alternate object database:: + Via the alternates mechanism, a repository can inherit part of its + object database from another object database, which is called + "alternate". + +reachable:: + An object is reachable from a ref/commit/tree/tag, if there is a + chain leading from the latter to the former. + +chain:: + A list of objects, where each object in the list contains a + reference to its successor (for example, the successor of a commit + could be one of its parents). + +parent:: + A commit object contains a (possibly empty) list of the logical + predecessor(s) in the line of development, i.e. its parents. + +fetch:: + Fetching a branch means to get the branch's head ref from a + remote repository, to find out which objects are missing from + the local object database, and to get them, too. + +pull:: + Pulling a branch means to fetch it and merge it. + +push:: + Pushing a branch means to get the branch's head ref from a remote + repository, find out if it is an ancestor to the branch's local + head ref is a direct, and in that case, putting all objects, which + are reachable from the local head ref, and which are missing from + the remote repository, into the remote object database, and updating + the remote head ref. If the remote head is not an ancestor to the + local head, the push fails. + +pack:: + A set of objects which have been compressed into one file (to save + space or to transmit them efficiently). + +pack index:: + Contains offsets into a pack, so the pack can be used instead of + the unpacked objects. + +plumbing:: + Cute name for core git. + +porcelain:: + Cute name for programs and program suites depending on core git, + presenting a high level access to core git. Porcelains expose + more of a SCM interface than the plumbing. + +object type: + One of the identifiers "commit","tree","tag" and "blob" describing + the type of an object. + +SCM:: + Source code management (tool). + +dircache:: + You are *waaaaay* behind. diff --git a/Documentation/tutorial.txt b/Documentation/tutorial.txt index 66b6e300a2..a2a7b7cd41 100644 --- a/Documentation/tutorial.txt +++ b/Documentation/tutorial.txt @@ -891,7 +891,7 @@ an empty directory: mkdir my-git.git Then, make that directory into a GIT repository by running -git-init-db, but this time, since it's name is not the usual +git-init-db, but this time, since its name is not the usual ".git", we do things slightly differently: GIT_DIR=my-git.git git-init-db @@ -98,12 +98,12 @@ contents"). In particular, since the blob is entirely defined by its data, if two files in a directory tree (or in multiple different versions of the repository) have the same contents, they will share the same blob -object. The object is totally independent of it's location in the +object. The object is totally independent of its location in the directory tree, and renaming a file does not change the object that file is associated with in any way. A blob is typically created when link:git-update-cache.html[git-update-cache] -is run, and it's data can be accessed by link:git-cat-file.html[git-cat-file]. +is run, and its data can be accessed by link:git-cat-file.html[git-cat-file]. Tree Object ~~~~~~~~~~~ @@ -142,7 +142,7 @@ noticing that the blob stayed the same. However, renames with data changes need a smarter "diff" implementation. A tree is created with link:git-write-tree.html[git-write-tree] and -it's data can be accessed by link:git-ls-tree.html[git-ls-tree] +its data can be accessed by link:git-ls-tree.html[git-ls-tree] Commit Object ~~~~~~~~~~~~~ @@ -167,7 +167,7 @@ of the parents), and describing that makes no sense in this idiotic file manager. A commit is created with link:git-commit-tree.html[git-commit-tree] and -it's data can be accessed by link:git-cat-file.html[git-cat-file] +its data can be accessed by link:git-cat-file.html[git-cat-file] Trust ~~~~~ @@ -213,7 +213,7 @@ integrity; the trust framework (and signature provision and verification) has to come from outside. A tag is created with link:git-mktag.html[git-mktag] and -it's data can be accessed by link:git-cat-file.html[git-cat-file] +its data can be accessed by link:git-cat-file.html[git-cat-file] The "index" aka "Current Directory Cache" @@ -1043,8 +1043,12 @@ static int check_patch(struct patch *patch) return error("%s: already exists in working directory", new_name); if (errno != ENOENT) return error("%s: %s", new_name, strerror(errno)); - if (!patch->new_mode) - patch->new_mode = S_IFREG | 0644; + if (!patch->new_mode) { + if (patch->is_new) + patch->new_mode = S_IFREG | 0644; + else + patch->new_mode = patch->old_mode; + } } if (new_name && old_name) { diff --git a/git-branch-script b/git-branch-script index 041ca515ae..a6dfeaf55f 100755 --- a/git-branch-script +++ b/git-branch-script @@ -2,16 +2,31 @@ . git-sh-setup-script || die "Not a git archive" -branchname="$1" -case "$2" in -'') +case "$#" in +0) + headref=$(readlink "$GIT_DIR/HEAD" | sed -e 's|^refs/heads/||') + git-rev-parse --symbolic --all | + sed -ne 's|^refs/heads/||p' | + sort | + while read ref + do + if test "$headref" = "$ref" + then + pfx='*' + else + pfx=' ' + fi + echo "$pfx $ref" + done + exit 0 ;; +1) head=HEAD ;; -*) +2) head="$2^0" ;; esac +branchname="$1" rev=$(git-rev-parse --revs-only --verify "$head") || exit -[ -z "$branchname" ] && die "git branch: I want a branch name" [ -e "$GIT_DIR/refs/heads/$branchname" ] && die "$branchname already exists" echo $rev > "$GIT_DIR/refs/heads/$branchname" diff --git a/git-commit-script b/git-commit-script index 790f07c08f..f6cd75f024 100755 --- a/git-commit-script +++ b/git-commit-script @@ -88,9 +88,14 @@ esac case "$all" in t) git-diff-files --name-only -z | - xargs -0 git-update-cache -q -- || exit 1 ;; -esac -git-update-cache -q --refresh -- "$@" || exit 1 + xargs -0 git-update-cache -q -- + ;; +*) + git-diff-files --name-only -z "$@" | + xargs -0 git-update-cache -q -- + ;; +esac || exit 1 +git-update-cache -q --refresh || exit 1 case "$verify" in t) diff --git a/git-cvsimport-script b/git-cvsimport-script index a6a6f0db39..2f39af33d9 100755 --- a/git-cvsimport-script +++ b/git-cvsimport-script @@ -28,19 +28,19 @@ use POSIX qw(strftime dup2); $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); +our($opt_h,$opt_o,$opt_v,$opt_k,$opt_d,$opt_p,$opt_C,$opt_z,$opt_i,$opt_s); 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 ] [ CVS_module ] + [ -i ] [ -k ] [-s subst] [ CVS_module ] END exit(1); } -getopts("hivko:d:p:C:z:") or usage(); +getopts("hivko:d:p:C:z:s:") or usage(); usage if $opt_h; @ARGV <= 1 or usage(); @@ -59,6 +59,7 @@ if($opt_d) { die "CVSROOT needs to be set"; } $opt_o ||= "origin"; +$opt_s ||= "-"; my $git_tree = $opt_C; $git_tree ||= "."; @@ -621,6 +622,7 @@ while(<CVS>) { $state = 4; } elsif($state == 4 and s/^Branch:\s+//) { s/\s+$//; + s/[\/]/$opt_s/g; $branch = $_; $state = 5; } elsif($state == 5 and s/^Ancestor branch:\s+//) { diff --git a/git-format-patch-script b/git-format-patch-script index 3c3413b76f..3565205426 100755 --- a/git-format-patch-script +++ b/git-format-patch-script @@ -146,7 +146,7 @@ do file=`printf '%04d-%stxt' $i "$title"` i=`expr "$i" - 1` - echo >&2 "* $file" + echo "* $file" { mailScript=' /./d diff --git a/git-parse-remote b/git-parse-remote index bfe7a906d9..53c5842ef3 100755 --- a/git-parse-remote +++ b/git-parse-remote @@ -71,8 +71,8 @@ tag) '') _remote_head=HEAD ;; *) - _remote_head="refs/heads/$_remote_head" _remote_name="head '$_remote_head' of $_remote_name" + _remote_head="refs/heads/$_remote_head" ;; esac ;; diff --git a/git-show-branches-script b/git-show-branches-script index 263025c476..90018a9e88 100755 --- a/git-show-branches-script +++ b/git-show-branches-script @@ -5,15 +5,23 @@ . git-sh-setup-script || die "Not a git repository" +usage () { + die "usage: $0 <ref>..." +} + headref=`readlink $GIT_DIR/HEAD` -case "$#" in -0) - set x `cd $GIT_DIR/refs && - find heads -type f -print | - sed -e 's|heads/||' | - sort` + +case "$(git-rev-parse --no-revs)" in '') ;; *) usage ;; esac +revs=$(git-rev-parse --revs-only --symbolic --no-flags "$@") +flags=$(git-rev-parse --revs-only --flags "$@") +case "$revs" in +'') + revs=$(git-rev-parse --symbolic --all | sed -ne 's|^refs/heads/||p' | + sort) shift ;; esac +set x $revs +shift hh= in= for ref @@ -22,7 +30,7 @@ do */"$ref") H='*' ;; *) H='!' ;; esac - h=`git-rev-parse --verify "$ref^0"` || exit + h=`git-rev-parse --verify "$ref^0" 2>/dev/null` || continue l=`git-log-script --max-count=1 --pretty=oneline "$h" | sed -e 's/^[^ ]* //'` hh="$hh $h" @@ -32,7 +40,7 @@ done set x $hh shift -git-rev-list --pretty=oneline "$@" | +git-rev-list --pretty=oneline $flags $@ | while read v l do in='' diff --git a/rev-parse.c b/rev-parse.c index 39cf63540e..f1f5163447 100644 --- a/rev-parse.c +++ b/rev-parse.c @@ -16,6 +16,7 @@ static int output_revs = 0; static int flags_only = 0; static int no_flags = 0; static int output_sq = 0; +static int symbolic = 0; #define NORMAL 0 #define REVERSED 1 @@ -69,17 +70,18 @@ static void show(const char *arg) puts(arg); } -static void show_rev(int type, const unsigned char *sha1) +static void show_rev(int type, const unsigned char *sha1, const char *name) { if (no_revs) return; output_revs++; - /* Hexadecimal string plus possibly a carret; - * this does not have to be quoted even under output_sq. - */ - printf("%s%s%c", type == show_type ? "" : "^", sha1_to_hex(sha1), - output_sq ? ' ' : '\n'); + if (type != show_type) + putchar('^'); + if (symbolic && name) + show(name); + else + show(sha1_to_hex(sha1)); } static void show_rev_arg(char *rev) @@ -117,7 +119,7 @@ static void show_default(void) def = NULL; if (!get_sha1(s, sha1)) { - show_rev(NORMAL, sha1); + show_rev(NORMAL, sha1, s); return; } show_arg(s); @@ -126,7 +128,7 @@ static void show_default(void) static int show_reference(const char *refname, const unsigned char *sha1) { - show_rev(NORMAL, sha1); + show_rev(NORMAL, sha1, refname); return 0; } @@ -186,6 +188,10 @@ int main(int argc, char **argv) show_type ^= REVERSED; continue; } + if (!strcmp(arg, "--symbolic")) { + symbolic = 1; + continue; + } if (!strcmp(arg, "--all")) { for_each_ref(show_reference); continue; @@ -209,8 +215,8 @@ int main(int argc, char **argv) if (no_revs) continue; def = NULL; - show_rev(NORMAL, end); - show_rev(REVERSED, sha1); + show_rev(NORMAL, end, n); + show_rev(REVERSED, sha1, arg); continue; } } @@ -220,14 +226,14 @@ int main(int argc, char **argv) if (no_revs) continue; def = NULL; - show_rev(NORMAL, sha1); + show_rev(NORMAL, sha1, arg); continue; } if (*arg == '^' && !get_sha1(arg+1, sha1)) { if (no_revs) continue; def = NULL; - show_rev(REVERSED, sha1); + show_rev(REVERSED, sha1, arg+1); continue; } show_default(); diff --git a/t/t4102-apply-rename.sh b/t/t4102-apply-rename.sh new file mode 100755 index 0000000000..f591a5681d --- /dev/null +++ b/t/t4102-apply-rename.sh @@ -0,0 +1,37 @@ +#!/bin/sh +# +# Copyright (c) 2005 Junio C Hamano +# + +test_description='git-apply handling copy/rename patch. + +' +. ./test-lib.sh + +# setup + +cat >test-patch <<\EOF +diff --git a/foo b/bar +similarity index 47% +copy from foo +copy to bar +--- a/foo ++++ b/bar +@@ -1 +1 @@ +-This is foo ++This is bar +EOF + +echo 'This is foo' >foo +chmod +x foo + +test_expect_success setup \ + 'git-update-cache --add foo' + +test_expect_success apply \ + 'git-apply --index --stat --summary --apply test-patch' + +test_expect_success validate \ + 'test -f bar && ls -l bar | grep "^-..x..x..x"' + +test_done |