1
0
Fork 0
mirror of https://github.com/git/git.git synced 2024-10-28 21:07:52 +01:00

Merge branch 'master' into np/dreflog

This is to resolve conflicts early in preparation for possible
inclusion of "reflog on detached HEAD" series by Nico, as having
it in 1.5.0 would really help us remove confusion between
detached and attached states.

Signed-off-by: Junio C Hamano <junkio@cox.net>
This commit is contained in:
Junio C Hamano 2007-02-03 22:14:40 -08:00
commit d77ee72662
123 changed files with 5104 additions and 921 deletions

2
.gitignore vendored
View file

@ -23,6 +23,7 @@ git-clean
git-clone
git-commit
git-commit-tree
git-config
git-convert-objects
git-count-objects
git-cvsexportcommit
@ -41,6 +42,7 @@ git-findtags
git-fmt-merge-msg
git-for-each-ref
git-format-patch
git-fsck
git-fsck-objects
git-gc
git-get-tar-commit-id

View file

@ -17,7 +17,7 @@ ARTICLES += hooks
ARTICLES += everyday
ARTICLES += git-tools
# with their own formatting rules.
SP_ARTICLES = glossary howto/revert-branch-rebase
SP_ARTICLES = glossary howto/revert-branch-rebase user-manual
DOC_HTML += $(patsubst %,%.html,$(ARTICLES) $(SP_ARTICLES))
@ -99,6 +99,12 @@ clean:
%.xml : %.txt
asciidoc -b docbook -d manpage -f asciidoc.conf $<
user-manual.xml: user-manual.txt user-manual.conf
asciidoc -b docbook -d book $<
user-manual.html: user-manual.xml
xmlto html-nochunks $<
glossary.html : glossary.txt sort_glossary.pl
cat $< | \
perl sort_glossary.pl | \

View file

@ -97,7 +97,7 @@ sub format_one {
git-fmt-merge-msg purehelpers
git-for-each-ref plumbinginterrogators
git-format-patch mainporcelain
git-fsck-objects ancillaryinterrogators
git-fsck ancillaryinterrogators
git-gc mainporcelain
git-get-tar-commit-id ancillaryinterrogators
git-grep mainporcelain
@ -144,7 +144,7 @@ sub format_one {
git-reflog ancillarymanipulators
git-relink ancillarymanipulators
git-repack ancillarymanipulators
git-repo-config ancillarymanipulators
git-config ancillarymanipulators
git-request-pull foreignscminterface
git-rerere ancillaryinterrogators
git-reset mainporcelain

View file

@ -39,7 +39,7 @@ in the section header, like in example below:
Subsection names can contain any characters except newline (doublequote
'`"`' and backslash have to be escaped as '`\"`' and '`\\`',
respecitvely) and are case sensitive. Section header cannot span multiple
respectively) and are case sensitive. Section header cannot span multiple
lines. Variables may belong directly to a section or to a given subsection.
You can have `[section]` if you have `[section "subsection"]`, but you
don't need to.
@ -62,7 +62,7 @@ The values following the equals sign in variable assign are all either
a string, an integer, or a boolean. Boolean values may be given as yes/no,
0/1 or true/false. Case is not significant in boolean values, when
converting value to the canonical form using '--bool' type specifier;
`git-repo-config` will ensure that the output is "true" or "false".
`git-config` will ensure that the output is "true" or "false".
String values may be entirely or partially enclosed in double quotes.
You need to enclose variable value in double quotes if you want to
@ -250,10 +250,15 @@ color.branch.<slot>::
Use customized color for branch coloration. `<slot>` is one of
`current` (the current branch), `local` (a local branch),
`remote` (a tracking branch in refs/remotes/), `plain` (other
refs), or `reset` (the normal terminal color). The value for
these configuration variables can be one of: `normal`, `bold`,
`dim`, `ul`, `blink`, `reverse`, `reset`, `black`, `red`,
`green`, `yellow`, `blue`, `magenta`, `cyan`, or `white`.
refs).
+
The value for these configuration variables is a list of colors (at most
two) and attributes (at most one), separated by spaces. The colors
accepted are `normal`, `black`, `red`, `green`, `yellow`, `blue`,
`magenta`, `cyan` and `white`; the attributes are `bold`, `dim`, `ul`,
`blink` and `reverse`. The first color given is the foreground; the
second is the background. The position of the attribute, if any,
doesn't matter.
color.diff::
When true (or `always`), always use colors in patch.
@ -261,12 +266,13 @@ color.diff::
colors only when the output is to the terminal.
color.diff.<slot>::
Use customized color for diff colorization. `<slot>`
specifies which part of the patch to use the specified
color, and is one of `plain` (context text), `meta`
(metainformation), `frag` (hunk header), `old` (removed
lines), or `new` (added lines). The values of these
variables may be specified as in color.branch.<slot>.
Use customized color for diff colorization. `<slot>` specifies
which part of the patch to use the specified color, and is one
of `plain` (context text), `meta` (metainformation), `frag`
(hunk header), `old` (removed lines), `new` (added lines),
`commit` (commit headers), or `whitespace` (highlighting dubious
whitespace). The values of these variables may be specified as
in color.branch.<slot>.
color.pager::
A boolean to enable/disable colored output when the pager is in

View file

@ -82,7 +82,7 @@ size> + <byte\0> + <binary object data>.
The structured objects can further have their structure and
connectivity to other objects verified. This is generally done with
the `git-fsck-objects` program, which generates a full dependency graph
the `git-fsck` program, which generates a full dependency graph
of all objects, and verifies their internal consistency (in addition
to just verifying their superficial consistency through the hash).

View file

@ -624,7 +624,7 @@ name for the state at that point.
Copying repositories
--------------------
git repositories are normally totally self-sufficient and relocatable
git repositories are normally totally self-sufficient and relocatable.
Unlike CVS, for example, there is no separate notion of
"repository" and "working tree". A git repository normally *is* the
working tree, with the local git information hidden in the `.git`
@ -1118,7 +1118,7 @@ You could do without using any branches at all, by
keeping as many local repositories as you would like to have
branches, and merging between them with `git pull`, just like
you merge between branches. The advantage of this approach is
that it lets you keep set of files for each `branch` checked
that it lets you keep a set of files for each `branch` checked
out and you may find it easier to switch back and forth if you
juggle multiple lines of development simultaneously. Of
course, you will pay the price of more disk usage to hold
@ -1130,7 +1130,7 @@ the remote repository URL in the local repository's config file
like this:
------------------------------------------------
$ git repo-config remote.linus.url http://www.kernel.org/pub/scm/git/git.git/
$ git config remote.linus.url http://www.kernel.org/pub/scm/git/git.git/
------------------------------------------------
and use the "linus" keyword with `git pull` instead of the full URL.
@ -1300,7 +1300,7 @@ differences since stage 2 (i.e. your version).
Publishing your work
--------------------
So we can use somebody else's work from a remote repository; but
So, we can use somebody else's work from a remote repository, but
how can *you* prepare a repository to let other people pull from
it?
@ -1469,8 +1469,8 @@ Working with Others
Although git is a truly distributed system, it is often
convenient to organize your project with an informal hierarchy
of developers. Linux kernel development is run this way. There
is a nice illustration (page 17, "Merges to Mainline") in Randy
Dunlap's presentation (`http://tinyurl.com/a2jdg`).
is a nice illustration (page 17, "Merges to Mainline") in
link:http://tinyurl.com/a2jdg[Randy Dunlap's presentation].
It should be stressed that this hierarchy is purely *informal*.
There is nothing fundamental in git that enforces the "chain of

View file

@ -36,7 +36,7 @@ them first before running git pull.
================================
The `pull` command knows where to get updates from because of certain
configuration variables that were set by the first `git clone`
command; see `git repo-config -l` and the gitlink:git-repo-config[1] man
command; see `git config -l` and the gitlink:git-config[1] man
page for details.
================================

View file

@ -159,7 +159,7 @@ or like this (when '--cc' option is used):
deleted file mode <mode>,<mode>
+
The `mode <mode>,<mode>..<mode>` line appears only if at least one of
the <mode> is diferent from the rest. Extended headers with
the <mode> is different from the rest. Extended headers with
information about detected contents movement (renames and
copying detection) are designed to work with diff of two
<tree-ish> and are not used by combined diff format.

View file

@ -0,0 +1,286 @@
/*
CSS stylesheet for XHTML produced by DocBook XSL stylesheets.
Tested with XSL stylesheets 1.61.2, 1.67.2
*/
span.strong {
font-weight: bold;
}
body blockquote {
margin-top: .75em;
line-height: 1.5;
margin-bottom: .75em;
}
html body {
margin: 1em 5% 1em 5%;
line-height: 1.2;
}
body div {
margin: 0;
}
h1, h2, h3, h4, h5, h6,
div.toc p b,
div.list-of-figures p b,
div.list-of-tables p b,
div.abstract p.title
{
color: #527bbd;
font-family: tahoma, verdana, sans-serif;
}
div.toc p:first-child,
div.list-of-figures p:first-child,
div.list-of-tables p:first-child,
div.example p.title
{
margin-bottom: 0.2em;
}
body h1 {
margin: .0em 0 0 -4%;
line-height: 1.3;
border-bottom: 2px solid silver;
}
body h2 {
margin: 0.5em 0 0 -4%;
line-height: 1.3;
border-bottom: 2px solid silver;
}
body h3 {
margin: .8em 0 0 -3%;
line-height: 1.3;
}
body h4 {
margin: .8em 0 0 -3%;
line-height: 1.3;
}
body h5 {
margin: .8em 0 0 -2%;
line-height: 1.3;
}
body h6 {
margin: .8em 0 0 -1%;
line-height: 1.3;
}
body hr {
border: none; /* Broken on IE6 */
}
div.footnotes hr {
border: 1px solid silver;
}
div.navheader th, div.navheader td, div.navfooter td {
font-family: sans-serif;
font-size: 0.9em;
font-weight: bold;
color: #527bbd;
}
div.navheader img, div.navfooter img {
border-style: none;
}
div.navheader a, div.navfooter a {
font-weight: normal;
}
div.navfooter hr {
border: 1px solid silver;
}
body td {
line-height: 1.2
}
body th {
line-height: 1.2;
}
ol {
line-height: 1.2;
}
ul, body dir, body menu {
line-height: 1.2;
}
html {
margin: 0;
padding: 0;
}
body h1, body h2, body h3, body h4, body h5, body h6 {
margin-left: 0
}
body pre {
margin: 0.5em 10% 0.5em 1em;
line-height: 1.0;
color: navy;
}
tt.literal, code.literal {
color: navy;
}
div.literallayout p {
padding: 0em;
margin: 0em;
}
div.literallayout {
font-family: monospace;
# margin: 0.5em 10% 0.5em 1em;
margin: 0em;
color: navy;
border: 1px solid silver;
background: #f4f4f4;
padding: 0.5em;
}
.programlisting, .screen {
border: 1px solid silver;
background: #f4f4f4;
margin: 0.5em 10% 0.5em 0;
padding: 0.5em 1em;
}
div.sidebar {
background: #ffffee;
margin: 1.0em 10% 0.5em 0;
padding: 0.5em 1em;
border: 1px solid silver;
}
div.sidebar * { padding: 0; }
div.sidebar div { margin: 0; }
div.sidebar p.title {
font-family: sans-serif;
margin-top: 0.5em;
margin-bottom: 0.2em;
}
div.bibliomixed {
margin: 0.5em 5% 0.5em 1em;
}
div.glossary dt {
font-weight: bold;
}
div.glossary dd p {
margin-top: 0.2em;
}
dl {
margin: .8em 0;
line-height: 1.2;
}
dt {
margin-top: 0.5em;
}
dt span.term {
font-style: italic;
}
div.variablelist dd p {
margin-top: 0;
}
div.itemizedlist li, div.orderedlist li {
margin-left: -0.8em;
margin-top: 0.5em;
}
ul, ol {
list-style-position: outside;
}
div.sidebar ul, div.sidebar ol {
margin-left: 2.8em;
}
div.itemizedlist p.title,
div.orderedlist p.title,
div.variablelist p.title
{
margin-bottom: -0.8em;
}
div.revhistory table {
border-collapse: collapse;
border: none;
}
div.revhistory th {
border: none;
color: #527bbd;
font-family: tahoma, verdana, sans-serif;
}
div.revhistory td {
border: 1px solid silver;
}
/* Keep TOC and index lines close together. */
div.toc dl, div.toc dt,
div.list-of-figures dl, div.list-of-figures dt,
div.list-of-tables dl, div.list-of-tables dt,
div.indexdiv dl, div.indexdiv dt
{
line-height: normal;
margin-top: 0;
margin-bottom: 0;
}
/*
Table styling does not work because of overriding attributes in
generated HTML.
*/
div.table table,
div.informaltable table
{
margin-left: 0;
margin-right: 5%;
margin-bottom: 0.8em;
}
div.informaltable table
{
margin-top: 0.4em
}
div.table thead,
div.table tfoot,
div.table tbody,
div.informaltable thead,
div.informaltable tfoot,
div.informaltable tbody
{
/* No effect in IE6. */
border-top: 2px solid #527bbd;
border-bottom: 2px solid #527bbd;
}
div.table thead, div.table tfoot,
div.informaltable thead, div.informaltable tfoot
{
font-weight: bold;
}
div.mediaobject img {
border: 1px solid silver;
margin-bottom: 0.8em;
}
div.figure p.title,
div.table p.title
{
margin-top: 1em;
margin-bottom: 0.4em;
}
@media print {
div.navheader, div.navfooter { display: none; }
}

View file

@ -28,7 +28,7 @@ Everybody uses these commands to maintain git repositories.
* gitlink:git-init[1] or gitlink:git-clone[1] to create a
new repository.
* gitlink:git-fsck-objects[1] to check the repository for errors.
* gitlink:git-fsck[1] to check the repository for errors.
* gitlink:git-prune[1] to remove unused objects in the repository.
@ -43,7 +43,7 @@ Examples
Check health and remove cruft.::
+
------------
$ git fsck-objects <1>
$ git fsck <1>
$ git count-objects <2>
$ git repack <3>
$ git gc <4>
@ -212,12 +212,12 @@ Push into another repository.::
------------
satellite$ git clone mothership:frotz frotz <1>
satellite$ cd frotz
satellite$ git repo-config --get-regexp '^(remote|branch)\.' <2>
satellite$ git config --get-regexp '^(remote|branch)\.' <2>
remote.origin.url mothership:frotz
remote.origin.fetch refs/heads/*:refs/remotes/origin/*
branch.master.remote origin
branch.master.merge refs/heads/master
satellite$ git repo-config remote.origin.push \
satellite$ git config remote.origin.push \
master:refs/remotes/satellite/master <3>
satellite$ edit/compile/test/commit
satellite$ git push origin <4>

View file

@ -8,7 +8,7 @@ git-blame - Show what revision and author last modified each line of a file
SYNOPSIS
--------
[verse]
'git-blame' [-c] [-l] [-t] [-f] [-n] [-p] [-L n,m] [-S <revs-file>]
'git-blame' [-c] [-l] [-t] [-f] [-n] [-p] [--incremental] [-L n,m] [-S <revs-file>]
[-M] [-C] [-C] [--since=<date>] [<rev>] [--] <file>
DESCRIPTION
@ -63,6 +63,10 @@ OPTIONS
-p, --porcelain::
Show in a format designed for machine consumption.
--incremental::
Show the result incrementally in a format designed for
machine consumption.
-M::
Detect moving lines in the file as well. When a commit
moves a block of lines in a file (e.g. the original file
@ -158,6 +162,47 @@ parents, using `commit{caret}!` notation:
git blame -C -C -f $commit^! -- foo
INCREMENTAL OUTPUT
------------------
When called with `--incremental` option, the command outputs the
result as it is built. The output generally will talk about
lines touched by more recent commits first (i.e. the lines will
be annotated out of order) and is meant to be used by
interactive viewers.
The output format is similar to the Porcelain format, but it
does not contain the actual lines from the file that is being
annotated.
. Each blame entry always starts with a line of:
<40-byte hex sha1> <sourceline> <resultline> <num_lines>
+
Line numbers count from 1.
. The first time that commit shows up in the stream, it has various
other information about it printed out with a one-word tag at the
beginning of each line about that "extended commit info" (author,
email, committer, dates, summary etc).
. Unlike Porcelain format, the filename information is always
given and terminates the entry:
"filename" <whitespace-quoted-filename-goes-here>
+
and thus it's really quite easy to parse for some line- and word-oriented
parser (which should be quite natural for most scripting languages).
+
[NOTE]
For people who do parsing: to make it more robust, just ignore any
lines in between the first and last one ("<sha1>" and "filename" lines)
where you don't recognize the tag-words (or care about that particular
one) at the beginning of the "extended information" lines. That way, if
there is ever added information (like the commit encoding or extended
commit commentary), a blame viewer won't ever care.
SEE ALSO
--------
gitlink:git-annotate[1]

View file

@ -19,7 +19,9 @@ or '-s' is used to find the object size.
OPTIONS
-------
<object>::
The sha1 identifier of the object.
The name of the object to show.
For a more complete list of ways to spell object names, see
"SPECIFYING REVISIONS" section in gitlink:git-rev-parse[1].
-t::
Instead of the content, show the object type identified by

View file

@ -8,8 +8,8 @@ git-checkout - Checkout and switch to a branch
SYNOPSIS
--------
[verse]
'git-checkout' [-f] [-b <new_branch> [-l]] [-m] [<branch>]
'git-checkout' [<branch>] <paths>...
'git-checkout' [-q] [-f] [-b <new_branch> [-l]] [-m] [<branch>]
'git-checkout' [<tree-ish>] <paths>...
DESCRIPTION
-----------
@ -22,15 +22,20 @@ be created.
When <paths> are given, this command does *not* switch
branches. It updates the named paths in the working tree from
the index file (i.e. it runs `git-checkout-index -f -u`). In
the index file (i.e. it runs `git-checkout-index -f -u`), or a
named commit. In
this case, `-f` and `-b` options are meaningless and giving
either of them results in an error. <branch> argument can be
used to specify a specific tree-ish to update the index for the
given paths before updating the working tree.
either of them results in an error. <tree-ish> argument can be
used to specify a specific tree-ish (i.e. commit, tag or tree)
to update the index for the given paths before updating the
working tree.
OPTIONS
-------
-q::
Quiet, supress feedback messages.
-f::
Force a re-read of everything.

View file

@ -0,0 +1,227 @@
git-config(1)
=============
NAME
----
git-config - Get and set repository or global options
SYNOPSIS
--------
[verse]
'git-config' [--global] [type] name [value [value_regex]]
'git-config' [--global] [type] --add name value
'git-config' [--global] [type] --replace-all name [value [value_regex]]
'git-config' [--global] [type] --get name [value_regex]
'git-config' [--global] [type] --get-all name [value_regex]
'git-config' [--global] [type] --unset name [value_regex]
'git-config' [--global] [type] --unset-all name [value_regex]
'git-config' [--global] -l | --list
DESCRIPTION
-----------
You can query/set/replace/unset options with this command. The name is
actually the section and the key separated by a dot, and the value will be
escaped.
Multiple lines can be added to an option by using the '--add' option.
If you want to update or unset an option which can occur on multiple
lines, a POSIX regexp `value_regex` needs to be given. Only the
existing values that match the regexp are updated or unset. If
you want to handle the lines that do *not* match the regex, just
prepend a single exclamation mark in front (see EXAMPLES).
The type specifier can be either '--int' or '--bool', which will make
'git-config' ensure that the variable(s) are of the given type and
convert the value to the canonical form (simple decimal number for int,
a "true" or "false" string for bool). If no type specifier is passed,
no checks or transformations are performed on the value.
This command will fail if:
. The .git/config file is invalid,
. Can not write to .git/config,
. no section was provided,
. the section or key is invalid,
. you try to unset an option which does not exist,
. you try to unset/set an option for which multiple lines match, or
. you use --global option without $HOME being properly set.
OPTIONS
-------
--replace-all::
Default behavior is to replace at most one line. This replaces
all lines matching the key (and optionally the value_regex).
--add::
Adds a new line to the option without altering any existing
values. This is the same as providing '^$' as the value_regex.
--get::
Get the value for a given key (optionally filtered by a regex
matching the value). Returns error code 1 if the key was not
found and error code 2 if multiple key values were found.
--get-all::
Like get, but does not fail if the number of values for the key
is not exactly one.
--get-regexp::
Like --get-all, but interprets the name as a regular expression.
--global::
Use global ~/.gitconfig file rather than the repository .git/config.
--unset::
Remove the line matching the key from config file.
--unset-all::
Remove all matching lines from config file.
-l, --list::
List all variables set in config file.
--bool::
git-config will ensure that the output is "true" or "false"
--int::
git-config will ensure that the output is a simple
decimal number. An optional value suffix of 'k', 'm', or 'g'
in the config file will cause the value to be multiplied
by 1024, 1048576, or 1073741824 prior to output.
ENVIRONMENT
-----------
GIT_CONFIG::
Take the configuration from the given file instead of .git/config.
Using the "--global" option forces this to ~/.gitconfig.
GIT_CONFIG_LOCAL::
Currently the same as $GIT_CONFIG; when Git will support global
configuration files, this will cause it to take the configuration
from the global configuration file in addition to the given file.
EXAMPLE
-------
Given a .git/config like this:
#
# This is the config file, and
# a '#' or ';' character indicates
# a comment
#
; core variables
[core]
; Don't trust file modes
filemode = false
; Our diff algorithm
[diff]
external = "/usr/local/bin/gnu-diff -u"
renames = true
; Proxy settings
[core]
gitproxy="ssh" for "ssh://kernel.org/"
gitproxy="proxy-command" for kernel.org
gitproxy="myprotocol-command" for "my://"
gitproxy=default-proxy ; for all the rest
you can set the filemode to true with
------------
% git config core.filemode true
------------
The hypothetical proxy command entries actually have a postfix to discern
what URL they apply to. Here is how to change the entry for kernel.org
to "ssh".
------------
% git config core.gitproxy '"ssh" for kernel.org' 'for kernel.org$'
------------
This makes sure that only the key/value pair for kernel.org is replaced.
To delete the entry for renames, do
------------
% git config --unset diff.renames
------------
If you want to delete an entry for a multivar (like core.gitproxy above),
you have to provide a regex matching the value of exactly one line.
To query the value for a given key, do
------------
% git config --get core.filemode
------------
or
------------
% git config core.filemode
------------
or, to query a multivar:
------------
% git config --get core.gitproxy "for kernel.org$"
------------
If you want to know all the values for a multivar, do:
------------
% git config --get-all core.gitproxy
------------
If you like to live dangerous, you can replace *all* core.gitproxy by a
new one with
------------
% git config --replace-all core.gitproxy ssh
------------
However, if you really only want to replace the line for the default proxy,
i.e. the one without a "for ..." postfix, do something like this:
------------
% git config core.gitproxy ssh '! for '
------------
To actually match only values with an exclamation mark, you have to
------------
% git config section.key value '[!]'
------------
To add a new proxy, without altering any of the existing ones, use
------------
% git config core.gitproxy '"proxy" for example.com'
------------
include::config.txt[]
Author
------
Written by Johannes Schindelin <Johannes.Schindelin@gmx.de>
Documentation
--------------
Documentation by Johannes Schindelin, Petr Baudis and the git-list <git@vger.kernel.org>.
GIT
---
Part of the gitlink:git[7] suite

View file

@ -7,7 +7,7 @@ git-for-each-ref - Output information on each ref
SYNOPSIS
--------
'git-for-each-ref' [--count=<count>]\* [--shell|--perl|--python] [--sort=<key>]\* [--format=<format>] [<pattern>]
'git-for-each-ref' [--count=<count>]\* [--shell|--perl|--python|--tcl] [--sort=<key>]\* [--format=<format>] [<pattern>]
DESCRIPTION
-----------
@ -49,7 +49,7 @@ OPTIONS
using fnmatch(3). Refs that do not match the pattern
are not shown.
--shell, --perl, --python::
--shell, --perl, --python, --tcl::
If given, strings that substitute `%(fieldname)`
placeholders are quoted as string literals suitable for
the specified host language. This is meant to produce

View file

@ -8,132 +8,10 @@ git-fsck-objects - Verifies the connectivity and validity of the objects in the
SYNOPSIS
--------
[verse]
'git-fsck-objects' [--tags] [--root] [--unreachable] [--cache]
[--full] [--strict] [<object>*]
'git-fsck-objects' ...
DESCRIPTION
-----------
Verifies the connectivity and validity of the objects in the database.
OPTIONS
-------
<object>::
An object to treat as the head of an unreachability trace.
+
If no objects are given, git-fsck-objects defaults to using the
index file and all SHA1 references in .git/refs/* as heads.
--unreachable::
Print out objects that exist but that aren't readable from any
of the reference nodes.
--root::
Report root nodes.
--tags::
Report tags.
--cache::
Consider any object recorded in the index also as a head node for
an unreachability trace.
--full::
Check not just objects in GIT_OBJECT_DIRECTORY
($GIT_DIR/objects), but also the ones found in alternate
object pools listed in GIT_ALTERNATE_OBJECT_DIRECTORIES
or $GIT_DIR/objects/info/alternates,
and in packed git archives found in $GIT_DIR/objects/pack
and corresponding pack subdirectories in alternate
object pools.
--strict::
Enable more strict checking, namely to catch a file mode
recorded with g+w bit set, which was created by older
versions of git. Existing repositories, including the
Linux kernel, git itself, and sparse repository have old
objects that triggers this check, but it is recommended
to check new projects with this flag.
It tests SHA1 and general object sanity, and it does full tracking of
the resulting reachability and everything else. It prints out any
corruption it finds (missing or bad objects), and if you use the
'--unreachable' flag it will also print out objects that exist but
that aren't readable from any of the specified head nodes.
So for example
git-fsck-objects --unreachable HEAD $(cat .git/refs/heads/*)
will do quite a _lot_ of verification on the tree. There are a few
extra validity tests to be added (make sure that tree objects are
sorted properly etc), but on the whole if "git-fsck-objects" is happy, you
do have a valid tree.
Any corrupt objects you will have to find in backups or other archives
(i.e., you can just remove them and do an "rsync" with some other site in
the hopes that somebody else has the object you have corrupted).
Of course, "valid tree" doesn't mean that it wasn't generated by some
evil person, and the end result might be crap. git is a revision
tracking system, not a quality assurance system ;)
Extracted Diagnostics
---------------------
expect dangling commits - potential heads - due to lack of head information::
You haven't specified any nodes as heads so it won't be
possible to differentiate between un-parented commits and
root nodes.
missing sha1 directory '<dir>'::
The directory holding the sha1 objects is missing.
unreachable <type> <object>::
The <type> object <object>, isn't actually referred to directly
or indirectly in any of the trees or commits seen. This can
mean that there's another root node that you're not specifying
or that the tree is corrupt. If you haven't missed a root node
then you might as well delete unreachable nodes since they
can't be used.
missing <type> <object>::
The <type> object <object>, is referred to but isn't present in
the database.
dangling <type> <object>::
The <type> object <object>, is present in the database but never
'directly' used. A dangling commit could be a root node.
warning: git-fsck-objects: tree <tree> has full pathnames in it::
And it shouldn't...
sha1 mismatch <object>::
The database has an object who's sha1 doesn't match the
database value.
This indicates a serious data integrity problem.
Environment Variables
---------------------
GIT_OBJECT_DIRECTORY::
used to specify the object database root (usually $GIT_DIR/objects)
GIT_INDEX_FILE::
used to specify the index file of the index
GIT_ALTERNATE_OBJECT_DIRECTORIES::
used to specify additional object database roots (usually unset)
Author
------
Written by Linus Torvalds <torvalds@osdl.org>
Documentation
--------------
Documentation by David Greaves, Junio C Hamano and the git-list <git@vger.kernel.org>.
GIT
---
Part of the gitlink:git[7] suite
This is a synonym for gitlink:git-fsck[1]. Please refer to the
documentation of that command.

139
Documentation/git-fsck.txt Normal file
View file

@ -0,0 +1,139 @@
git-fsck(1)
===========
NAME
----
git-fsck - Verifies the connectivity and validity of the objects in the database
SYNOPSIS
--------
[verse]
'git-fsck' [--tags] [--root] [--unreachable] [--cache]
[--full] [--strict] [<object>*]
DESCRIPTION
-----------
Verifies the connectivity and validity of the objects in the database.
OPTIONS
-------
<object>::
An object to treat as the head of an unreachability trace.
+
If no objects are given, git-fsck defaults to using the
index file and all SHA1 references in .git/refs/* as heads.
--unreachable::
Print out objects that exist but that aren't readable from any
of the reference nodes.
--root::
Report root nodes.
--tags::
Report tags.
--cache::
Consider any object recorded in the index also as a head node for
an unreachability trace.
--full::
Check not just objects in GIT_OBJECT_DIRECTORY
($GIT_DIR/objects), but also the ones found in alternate
object pools listed in GIT_ALTERNATE_OBJECT_DIRECTORIES
or $GIT_DIR/objects/info/alternates,
and in packed git archives found in $GIT_DIR/objects/pack
and corresponding pack subdirectories in alternate
object pools.
--strict::
Enable more strict checking, namely to catch a file mode
recorded with g+w bit set, which was created by older
versions of git. Existing repositories, including the
Linux kernel, git itself, and sparse repository have old
objects that triggers this check, but it is recommended
to check new projects with this flag.
It tests SHA1 and general object sanity, and it does full tracking of
the resulting reachability and everything else. It prints out any
corruption it finds (missing or bad objects), and if you use the
'--unreachable' flag it will also print out objects that exist but
that aren't readable from any of the specified head nodes.
So for example
git-fsck --unreachable HEAD $(cat .git/refs/heads/*)
will do quite a _lot_ of verification on the tree. There are a few
extra validity tests to be added (make sure that tree objects are
sorted properly etc), but on the whole if "git-fsck" is happy, you
do have a valid tree.
Any corrupt objects you will have to find in backups or other archives
(i.e., you can just remove them and do an "rsync" with some other site in
the hopes that somebody else has the object you have corrupted).
Of course, "valid tree" doesn't mean that it wasn't generated by some
evil person, and the end result might be crap. git is a revision
tracking system, not a quality assurance system ;)
Extracted Diagnostics
---------------------
expect dangling commits - potential heads - due to lack of head information::
You haven't specified any nodes as heads so it won't be
possible to differentiate between un-parented commits and
root nodes.
missing sha1 directory '<dir>'::
The directory holding the sha1 objects is missing.
unreachable <type> <object>::
The <type> object <object>, isn't actually referred to directly
or indirectly in any of the trees or commits seen. This can
mean that there's another root node that you're not specifying
or that the tree is corrupt. If you haven't missed a root node
then you might as well delete unreachable nodes since they
can't be used.
missing <type> <object>::
The <type> object <object>, is referred to but isn't present in
the database.
dangling <type> <object>::
The <type> object <object>, is present in the database but never
'directly' used. A dangling commit could be a root node.
warning: git-fsck: tree <tree> has full pathnames in it::
And it shouldn't...
sha1 mismatch <object>::
The database has an object who's sha1 doesn't match the
database value.
This indicates a serious data integrity problem.
Environment Variables
---------------------
GIT_OBJECT_DIRECTORY::
used to specify the object database root (usually $GIT_DIR/objects)
GIT_INDEX_FILE::
used to specify the index file of the index
GIT_ALTERNATE_OBJECT_DIRECTORIES::
used to specify additional object database roots (usually unset)
Author
------
Written by Linus Torvalds <torvalds@osdl.org>
Documentation
--------------
Documentation by David Greaves, Junio C Hamano and the git-list <git@vger.kernel.org>.
GIT
---
Part of the gitlink:git[7] suite

View file

@ -21,7 +21,7 @@ given will be ignored when checking which packs are required. This makes the
following command useful when wanting to remove packs which contain unreachable
objects.
git-fsck-objects --full --unreachable | cut -d ' ' -f3 | \
git-fsck --full --unreachable | cut -d ' ' -f3 | \
git-pack-redundant --all | xargs rm
OPTIONS

View file

@ -13,7 +13,7 @@ SYNOPSIS
DESCRIPTION
-----------
This runs `git-fsck-objects --unreachable` using all the refs
This runs `git-fsck --unreachable` using all the refs
available in `$GIT_DIR/refs`, optionally with additional set of
objects specified on the command line, and prunes all
objects unreachable from any of these head objects from the object database.

View file

@ -42,7 +42,7 @@ git pull, git pull origin::
current branch. Normally the branch merged in is
the HEAD of the remote repository, but the choice is
determined by the branch.<name>.remote and
branch.<name>.merge options; see gitlink:git-repo-config[1]
branch.<name>.merge options; see gitlink:git-config[1]
for details.
git pull origin next::
@ -94,7 +94,7 @@ gitlink:git-reset[1].
SEE ALSO
--------
gitlink:git-fetch[1], gitlink:git-merge[1], gitlink:git-repo-config[1]
gitlink:git-fetch[1], gitlink:git-merge[1], gitlink:git-config[1]
Author

View file

@ -12,23 +12,43 @@ SYNOPSIS
'git-remote'
'git-remote' add <name> <url>
'git-remote' show <name>
'git-remote' prune <name>
DESCRIPTION
-----------
Manage the set of repositories ("remotes") whose branches you track.
With no arguments, shows a list of existing remotes.
In the second form, adds a remote named <name> for the repository at
COMMANDS
--------
With no arguments, shows a list of existing remotes. Several
subcommands are available to perform operations on the remotes.
'add'::
Adds a remote named <name> for the repository at
<url>. The command `git fetch <name>` can then be used to create and
update remote-tracking branches <name>/<branch>.
In the third form, gives some information about the remote <name>.
'show'::
Gives some information about the remote <name>.
'prune'::
Deletes all stale tracking branches under <name>.
These stale branches have already been removed from the remote repository
referenced by <name>, but are still locally available in "remotes/<name>".
DISCUSSION
----------
The remote configuration is achieved using the `remote.origin.url` and
`remote.origin.fetch` configuration variables. (See
gitlink:git-repo-config[1]).
gitlink:git-config[1]).
Examples
--------
@ -58,7 +78,7 @@ See Also
--------
gitlink:git-fetch[1]
gitlink:git-branch[1]
gitlink:git-repo-config[1]
gitlink:git-config[1]
Author
------

View file

@ -8,220 +8,11 @@ git-repo-config - Get and set repository or global options
SYNOPSIS
--------
[verse]
'git-repo-config' [--global] [type] name [value [value_regex]]
'git-repo-config' [--global] [type] --add name value
'git-repo-config' [--global] [type] --replace-all name [value [value_regex]]
'git-repo-config' [--global] [type] --get name [value_regex]
'git-repo-config' [--global] [type] --get-all name [value_regex]
'git-repo-config' [--global] [type] --unset name [value_regex]
'git-repo-config' [--global] [type] --unset-all name [value_regex]
'git-repo-config' [--global] -l | --list
'git-repo-config' ...
DESCRIPTION
-----------
You can query/set/replace/unset options with this command. The name is
actually the section and the key separated by a dot, and the value will be
escaped.
Multiple lines can be added to an option by using the '--add' option.
If you want to update or unset an option which can occur on multiple
lines, a POSIX regexp `value_regex` needs to be given. Only the
existing values that match the regexp are updated or unset. If
you want to handle the lines that do *not* match the regex, just
prepend a single exclamation mark in front (see EXAMPLES).
The type specifier can be either '--int' or '--bool', which will make
'git-repo-config' ensure that the variable(s) are of the given type and
convert the value to the canonical form (simple decimal number for int,
a "true" or "false" string for bool). If no type specifier is passed,
no checks or transformations are performed on the value.
This command will fail if:
. The .git/config file is invalid,
. Can not write to .git/config,
. no section was provided,
. the section or key is invalid,
. you try to unset an option which does not exist,
. you try to unset/set an option for which multiple lines match, or
. you use --global option without $HOME being properly set.
OPTIONS
-------
--replace-all::
Default behavior is to replace at most one line. This replaces
all lines matching the key (and optionally the value_regex).
--add::
Adds a new line to the option without altering any existing
values. This is the same as providing '^$' as the value_regex.
--get::
Get the value for a given key (optionally filtered by a regex
matching the value). Returns error code 1 if the key was not
found and error code 2 if multiple key values were found.
--get-all::
Like get, but does not fail if the number of values for the key
is not exactly one.
--get-regexp::
Like --get-all, but interprets the name as a regular expression.
--global::
Use global ~/.gitconfig file rather than the repository .git/config.
--unset::
Remove the line matching the key from config file.
--unset-all::
Remove all matching lines from config file.
-l, --list::
List all variables set in config file.
--bool::
git-repo-config will ensure that the output is "true" or "false"
--int::
git-repo-config will ensure that the output is a simple
decimal number. An optional value suffix of 'k', 'm', or 'g'
in the config file will cause the value to be multiplied
by 1024, 1048576, or 1073741824 prior to output.
ENVIRONMENT
-----------
GIT_CONFIG::
Take the configuration from the given file instead of .git/config.
Using the "--global" option forces this to ~/.gitconfig.
GIT_CONFIG_LOCAL::
Currently the same as $GIT_CONFIG; when Git will support global
configuration files, this will cause it to take the configuration
from the global configuration file in addition to the given file.
EXAMPLE
-------
Given a .git/config like this:
#
# This is the config file, and
# a '#' or ';' character indicates
# a comment
#
; core variables
[core]
; Don't trust file modes
filemode = false
; Our diff algorithm
[diff]
external = "/usr/local/bin/gnu-diff -u"
renames = true
; Proxy settings
[core]
gitproxy="ssh" for "ssh://kernel.org/"
gitproxy="proxy-command" for kernel.org
gitproxy="myprotocol-command" for "my://"
gitproxy=default-proxy ; for all the rest
you can set the filemode to true with
------------
% git repo-config core.filemode true
------------
The hypothetical proxy command entries actually have a postfix to discern
what URL they apply to. Here is how to change the entry for kernel.org
to "ssh".
------------
% git repo-config core.gitproxy '"ssh" for kernel.org' 'for kernel.org$'
------------
This makes sure that only the key/value pair for kernel.org is replaced.
To delete the entry for renames, do
------------
% git repo-config --unset diff.renames
------------
If you want to delete an entry for a multivar (like core.gitproxy above),
you have to provide a regex matching the value of exactly one line.
To query the value for a given key, do
------------
% git repo-config --get core.filemode
------------
or
------------
% git repo-config core.filemode
------------
or, to query a multivar:
------------
% git repo-config --get core.gitproxy "for kernel.org$"
------------
If you want to know all the values for a multivar, do:
------------
% git repo-config --get-all core.gitproxy
------------
If you like to live dangerous, you can replace *all* core.gitproxy by a
new one with
------------
% git repo-config --replace-all core.gitproxy ssh
------------
However, if you really only want to replace the line for the default proxy,
i.e. the one without a "for ..." postfix, do something like this:
------------
% git repo-config core.gitproxy ssh '! for '
------------
To actually match only values with an exclamation mark, you have to
------------
% git repo-config section.key value '[!]'
------------
To add a new proxy, without altering any of the existing ones, use
------------
% git repo-config core.gitproxy '"proxy" for example.com'
------------
include::config.txt[]
Author
------
Written by Johannes Schindelin <Johannes.Schindelin@gmx.de>
Documentation
--------------
Documentation by Johannes Schindelin, Petr Baudis and the git-list <git@vger.kernel.org>.
GIT
---
Part of the gitlink:git[7] suite
This is a synonym for gitlink:git-config[1]. Please refer to the
documentation of that command.

View file

@ -160,6 +160,10 @@ blobs contained in a commit.
immediately following a ref name and the ref must have an existing
log ($GIT_DIR/logs/<ref>).
* You can use the '@' construct with an empty ref part to get at a
reflog of the current branch. For example, if you are on the
branch 'blabla', then '@\{1\}' means the same as 'blabla@\{1\}'.
* A suffix '{caret}' to a revision parameter means the first parent of
that commit object. '{caret}<n>' means the <n>th parent (i.e.
'rev{caret}'

View file

@ -3,7 +3,7 @@ git-send-pack(1)
NAME
----
git-send-pack - Push objects over git protocol to another reposiotory
git-send-pack - Push objects over git protocol to another repository
SYNOPSIS

View file

@ -133,7 +133,7 @@ manually joining branches on commit.
'multi-init'::
This command supports git-svnimport-like command-line syntax for
importing repositories that are layed out as recommended by the
importing repositories that are laid out as recommended by the
SVN folks. This is a bit more tolerant than the git-svnimport
command-line syntax and doesn't require the user to figure out
where the repository URL ends and where the repository path
@ -204,7 +204,7 @@ removed by default if there are no files left in them. git
cannot version empty directories. Enabling this flag will make
the commit to SVN act like git.
repo-config key: svn.rmdir
config key: svn.rmdir
-e::
--edit::
@ -215,7 +215,7 @@ Edit the commit message before committing to SVN. This is off by
default for objects that are commits, and forced on when committing
tree objects.
repo-config key: svn.edit
config key: svn.edit
-l<num>::
--find-copies-harder::
@ -226,8 +226,8 @@ They are both passed directly to git-diff-tree see
gitlink:git-diff-tree[1] for more information.
[verse]
repo-config key: svn.l
repo-config key: svn.findcopiesharder
config key: svn.l
config key: svn.findcopiesharder
-A<filename>::
--authors-file=<filename>::
@ -245,7 +245,7 @@ will abort operation. The user will then have to add the
appropriate entry. Re-running the previous git-svn command
after the authors-file is modified should continue operation.
repo-config key: svn.authorsfile
config key: svn.authorsfile
-q::
--quiet::
@ -262,8 +262,8 @@ repo-config key: svn.authorsfile
--repack-flags are passed directly to gitlink:git-repack[1].
repo-config key: svn.repack
repo-config key: svn.repackflags
config key: svn.repack
config key: svn.repackflags
-m::
--merge::
@ -304,7 +304,7 @@ used to track branches across multiple SVN _repositories_.
This option may be specified multiple times, once for each
branch.
repo-config key: svn.branch
config key: svn.branch
-i<GIT_SVN_ID>::
--id <GIT_SVN_ID>::
@ -320,7 +320,7 @@ for more information on using GIT_SVN_ID.
started tracking a branch and never tracked the trunk it was
descended from.
repo-config key: svn.followparent
config key: svn.followparent
--no-metadata::
This gets rid of the git-svn-id: lines at the end of every commit.
@ -332,7 +332,7 @@ repo-config key: svn.followparent
The 'git-svn log' command will not work on repositories using this,
either.
repo-config key: svn.nometadata
config key: svn.nometadata
--

View file

@ -289,7 +289,7 @@ Configuration
The command honors `core.filemode` configuration variable. If
your repository is on an filesystem whose executable bits are
unreliable, this should be set to 'false' (see gitlink:git-repo-config[1]).
unreliable, this should be set to 'false' (see gitlink:git-config[1]).
This causes the command to ignore differences in file modes recorded
in the index and the file mode on the filesystem if they differ only on
executable bit. On such an unfortunate filesystem, you may
@ -301,7 +301,7 @@ The command looks at `core.ignorestat` configuration variable. See
See Also
--------
gitlink:git-repo-config[1]
gitlink:git-config[1]
Author

View file

@ -20,7 +20,7 @@ OPTIONS
Cause the logical variables to be listed. In addition, all the
variables of the git configuration file .git/config are listed
as well. (However, the configuration variables listing functionality
is deprecated in favor of `git-repo-config -l`.)
is deprecated in favor of `git-config -l`.)
EXAMPLE
--------
@ -49,7 +49,7 @@ See Also
--------
gitlink:git-commit-tree[1]
gitlink:git-tag[1]
gitlink:git-repo-config[1]
gitlink:git-config[1]
Author
------

View file

@ -22,9 +22,12 @@ See this link:tutorial.html[tutorial] to get started, then see
link:everyday.html[Everyday Git] for a useful minimum set of commands, and
"man git-commandname" for documentation of each command. CVS users may
also want to read link:cvs-migration.html[CVS migration].
link:user-manual.html[Git User's Manual] is still work in
progress, but when finished hopefully it will guide a new user
in a coherent way to git enlightenment ;-).
The COMMAND is either a name of a Git command (see below) or an alias
as defined in the configuration file (see gitlink:git-repo-config[1]).
as defined in the configuration file (see gitlink:git-config[1]).
OPTIONS
-------

View file

@ -54,7 +54,7 @@ frequently used options.
Limit commits to the ones touching files in the given paths. Note, to
avoid ambiguity wrt. revision names use "--" to separate the paths
from any preceeding options.
from any preceding options.
Examples
--------

View file

@ -90,9 +90,6 @@ parameter, and is invoked after a commit is made.
This hook is meant primarily for notification, and cannot affect
the outcome of `git-commit`.
The default 'post-commit' hook, when enabled, demonstrates how to
send out a commit notification e-mail.
update
------
@ -130,6 +127,8 @@ The standard output of this hook is sent to `stderr`, so if you
want to report something to the `git-send-pack` on the other end,
you can simply `echo` your messages.
The default 'update' hook, when enabled, demonstrates how to
send out a notification e-mail.
post-update
-----------

View file

@ -205,7 +205,7 @@ To check whether all is OK, do:
Now, add the remote in your existing repository which contains the project
you want to export:
$ git-repo-config remote.upload.url \
$ git-config remote.upload.url \
http://<username>@<servername>/my-new-repo.git/
It is important to put the last '/'; Without it, the server will send
@ -222,7 +222,7 @@ From your client repository, do
This pushes branch 'master' (which is assumed to be the branch you
want to export) to repository called 'upload', which we previously
defined with git-repo-config.
defined with git-config.
Troubleshooting:

View file

@ -352,24 +352,23 @@ situation:
------------------------------------------------
$ git status
#
# Added but not yet committed:
# (will commit)
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# new file: closing.txt
#
#
# Changed but not added:
# (use "git add file1 file2" to include for commit)
# Changed but not updated:
# (use "git add <file>..." to update what will be committed)
#
# modified: file.txt
#
------------------------------------------------
Since the current state of closing.txt is cached in the index file,
it is listed as "added but not yet committed". Since file.txt has
it is listed as "Changes to be committed". Since file.txt has
changes in the working directory that aren't reflected in the index,
it is marked "changed but not added". At this point, running "git
it is marked "changed but not updated". At this point, running "git
commit" would create a commit that added closing.txt (with its new
contents), but that didn't modify file.txt.

View file

@ -16,8 +16,8 @@ public email address before doing any operation. The easiest
way to do so is:
------------------------------------------------
$ git repo-config --global user.name "Your Name Comes Here"
$ git repo-config --global user.email you@yourdomain.example.com
$ git config --global user.name "Your Name Comes Here"
$ git config --global user.email you@yourdomain.example.com
------------------------------------------------
@ -101,27 +101,27 @@ want to commit together. This can be done in a few different ways:
1) By using 'git add <file_spec>...'
This can be performed multiple times before a commit. Note that this
is not only for adding new files. Even modified files must be
added to the set of changes about to be committed. The "git status"
command gives you a summary of what is included so far for the
next commit. When done you should use the 'git commit' command to
make it real.
This can be performed multiple times before a commit. Note that this
is not only for adding new files. Even modified files must be
added to the set of changes about to be committed. The "git status"
command gives you a summary of what is included so far for the
next commit. When done you should use the 'git commit' command to
make it real.
Note: don't forget to 'add' a file again if you modified it after the
first 'add' and before 'commit'. Otherwise only the previous added
state of that file will be committed. This is because git tracks
content, so what you're really 'add'ing to the commit is the *content*
of the file in the state it is in when you 'add' it.
Note: don't forget to 'add' a file again if you modified it after the
first 'add' and before 'commit'. Otherwise only the previous added
state of that file will be committed. This is because git tracks
content, so what you're really 'add'ing to the commit is the *content*
of the file in the state it is in when you 'add' it.
2) By using 'git commit -a' directly
This is a quick way to automatically 'add' the content from all files
that were modified since the previous commit, and perform the actual
commit without having to separately 'add' them beforehand. This will
not add content from new files i.e. files that were never added before.
Those files still have to be added explicitly before performing a
commit.
This is a quick way to automatically 'add' the content from all files
that were modified since the previous commit, and perform the actual
commit without having to separately 'add' them beforehand. This will
not add content from new files i.e. files that were never added before.
Those files still have to be added explicitly before performing a
commit.
But here's a twist. If you do 'git commit <file1> <file2> ...' then only
the changes belonging to those explicitly specified files will be
@ -353,12 +353,12 @@ repository in the repository configuration, and that location is
used for pulls:
-------------------------------------
$ git repo-config --get remote.origin.url
$ git config --get remote.origin.url
/home/bob/myrepo
-------------------------------------
(The complete configuration created by git-clone is visible using
"git repo-config -l", and the gitlink:git-repo-config[1] man page
"git config -l", and the gitlink:git-config[1] man page
explains the meaning of each option.)
Git also keeps a pristine copy of Alice's master branch under the
@ -458,9 +458,9 @@ $ git reset --hard HEAD^ # reset your current branch and working
Be careful with that last command: in addition to losing any changes
in the working directory, it will also remove all later commits from
this branch. If this branch is the only branch containing those
commits, they will be lost. (Also, don't use "git reset" on a
publicly-visible branch that other developers pull from, as git will
be confused by history that disappears in this way.)
commits, they will be lost. Also, don't use "git reset" on a
publicly-visible branch that other developers pull from, as it will
force needless merges on other developers to clean up the history.
The git grep command can search for strings in any version of your
project, so

View file

@ -0,0 +1,21 @@
[titles]
underlines="__","==","--","~~","^^"
[attributes]
caret=^
startsb=&#91;
endsb=&#93;
tilde=&#126;
[gitlink-inlinemacro]
<ulink url="{target}.html">{target}{0?({0})}</ulink>
ifdef::backend-docbook[]
# "unbreak" docbook-xsl v1.68 for manpages. v1.69 works with or without this.
[listingblock]
<example><title>{title}</title>
<literallayout>
|
</literallayout>
{title#}</example>
endif::backend-docbook[]

File diff suppressed because it is too large Load diff

View file

@ -1,7 +1,7 @@
#!/bin/sh
GVF=GIT-VERSION-FILE
DEF_VER=v1.5.0-rc2.GIT
DEF_VER=v1.5.0-rc3.GIT
LF='
'

View file

@ -192,7 +192,7 @@ SCRIPTS = $(patsubst %.sh,%,$(SCRIPT_SH)) \
# ... and all the rest that could be moved out of bindir to gitexecdir
PROGRAMS = \
git-convert-objects$X git-fetch-pack$X git-fsck-objects$X \
git-convert-objects$X git-fetch-pack$X git-fsck$X \
git-hash-object$X git-index-pack$X git-local-fetch$X \
git-merge-base$X \
git-daemon$X \
@ -213,7 +213,8 @@ EXTRA_PROGRAMS =
BUILT_INS = \
git-format-patch$X git-show$X git-whatchanged$X git-cherry$X \
git-get-tar-commit-id$X git-init$X \
git-get-tar-commit-id$X git-init$X git-repo-config$X \
git-fsck-objects$X \
$(patsubst builtin-%.o,git-%$X,$(BUILTIN_OBJS))
# what 'all' will build and 'install' will install, in gitexecdir
@ -283,6 +284,7 @@ BUILTIN_OBJS = \
builtin-diff-tree.o \
builtin-fmt-merge-msg.o \
builtin-for-each-ref.o \
builtin-fsck.o \
builtin-grep.o \
builtin-init-db.o \
builtin-log.o \
@ -299,7 +301,7 @@ BUILTIN_OBJS = \
builtin-push.o \
builtin-read-tree.o \
builtin-reflog.o \
builtin-repo-config.o \
builtin-config.o \
builtin-rerere.o \
builtin-rev-list.o \
builtin-rev-parse.o \

View file

@ -77,6 +77,10 @@ struct origin {
char path[FLEX_ARRAY];
};
/*
* Given an origin, prepare mmfile_t structure to be used by the
* diff machinery
*/
static char *fill_origin_blob(struct origin *o, mmfile_t *file)
{
if (!o->file.ptr) {
@ -91,6 +95,10 @@ static char *fill_origin_blob(struct origin *o, mmfile_t *file)
return file->ptr;
}
/*
* Origin is refcounted and usually we keep the blob contents to be
* reused.
*/
static inline struct origin *origin_incref(struct origin *o)
{
if (o)
@ -108,6 +116,11 @@ static void origin_decref(struct origin *o)
}
}
/*
* Each group of lines is described by a blame_entry; it can be split
* as we pass blame to the parents. They form a linked list in the
* scoreboard structure, sorted by the target line number.
*/
struct blame_entry {
struct blame_entry *prev;
struct blame_entry *next;
@ -134,19 +147,24 @@ struct blame_entry {
int s_lno;
/* how significant this entry is -- cached to avoid
* scanning the lines over and over
* scanning the lines over and over.
*/
unsigned score;
};
/*
* The current state of the blame assignment.
*/
struct scoreboard {
/* the final commit (i.e. where we started digging from) */
struct commit *final;
const char *path;
/* the contents in the final; pointed into by buf pointers of
* blame_entries
/*
* The contents in the final image.
* Used by many functions to obtain contents of the nth line,
* indexed with scoreboard.lineno[blame_entry.lno].
*/
const char *final_buf;
unsigned long final_buf_size;
@ -171,6 +189,11 @@ static int cmp_suspect(struct origin *a, struct origin *b)
static void sanity_check_refcnt(struct scoreboard *);
/*
* If two blame entries that are next to each other came from
* contiguous lines in the same origin (i.e. <commit, path> pair),
* merge them together.
*/
static void coalesce(struct scoreboard *sb)
{
struct blame_entry *ent, *next;
@ -194,6 +217,12 @@ static void coalesce(struct scoreboard *sb)
sanity_check_refcnt(sb);
}
/*
* Given a commit and a path in it, create a new origin structure.
* The callers that add blame to the scoreboard should use
* get_origin() to obtain shared, refcounted copy instead of calling
* this function directly.
*/
static struct origin *make_origin(struct commit *commit, const char *path)
{
struct origin *o;
@ -204,6 +233,9 @@ static struct origin *make_origin(struct commit *commit, const char *path)
return o;
}
/*
* Locate an existing origin or create a new one.
*/
static struct origin *get_origin(struct scoreboard *sb,
struct commit *commit,
const char *path)
@ -218,6 +250,13 @@ static struct origin *get_origin(struct scoreboard *sb,
return make_origin(commit, path);
}
/*
* Fill the blob_sha1 field of an origin if it hasn't, so that later
* call to fill_origin_blob() can use it to locate the data. blob_sha1
* for an origin is also used to pass the blame for the entire file to
* the parent to detect the case where a child's blob is identical to
* that of its parent's.
*/
static int fill_blob_sha1(struct origin *origin)
{
unsigned mode;
@ -238,6 +277,10 @@ static int fill_blob_sha1(struct origin *origin)
return -1;
}
/*
* We have an origin -- check if the same path exists in the
* parent and return an origin structure to represent it.
*/
static struct origin *find_origin(struct scoreboard *sb,
struct commit *parent,
struct origin *origin)
@ -247,12 +290,26 @@ static struct origin *find_origin(struct scoreboard *sb,
const char *paths[2];
if (parent->util) {
/* This is a freestanding copy of origin and not
* refcounted.
/*
* Each commit object can cache one origin in that
* commit. This is a freestanding copy of origin and
* not refcounted.
*/
struct origin *cached = parent->util;
if (!strcmp(cached->path, origin->path)) {
/*
* The same path between origin and its parent
* without renaming -- the most common case.
*/
porigin = get_origin(sb, parent, cached->path);
/*
* If the origin was newly created (i.e. get_origin
* would call make_origin if none is found in the
* scoreboard), it does not know the blob_sha1,
* so copy it. Otherwise porigin was in the
* scoreboard and already knows blob_sha1.
*/
if (porigin->refcnt == 1)
hashcpy(porigin->blob_sha1, cached->blob_sha1);
return porigin;
@ -309,7 +366,13 @@ static struct origin *find_origin(struct scoreboard *sb,
}
diff_flush(&diff_opts);
if (porigin) {
/*
* Create a freestanding copy that is not part of
* the refcounted origin found in the scoreboard, and
* cache it in the commit.
*/
struct origin *cached;
cached = make_origin(porigin->commit, porigin->path);
hashcpy(cached->blob_sha1, porigin->blob_sha1);
parent->util = cached;
@ -317,6 +380,10 @@ static struct origin *find_origin(struct scoreboard *sb,
return porigin;
}
/*
* We have an origin -- find the path that corresponds to it in its
* parent and return an origin structure to represent it.
*/
static struct origin *find_rename(struct scoreboard *sb,
struct commit *parent,
struct origin *origin)
@ -353,6 +420,9 @@ static struct origin *find_rename(struct scoreboard *sb,
return porigin;
}
/*
* Parsing of patch chunks...
*/
struct chunk {
/* line number in postimage; up to but not including this
* line is the same as preimage
@ -454,6 +524,11 @@ static struct patch *compare_buffer(mmfile_t *file_p, mmfile_t *file_o,
return state.ret;
}
/*
* Run diff between two origins and grab the patch output, so that
* we can pass blame for lines origin is currently suspected for
* to its parent.
*/
static struct patch *get_patch(struct origin *parent, struct origin *origin)
{
mmfile_t file_p, file_o;
@ -474,6 +549,10 @@ static void free_patch(struct patch *p)
free(p);
}
/*
* Link in a new blame entry to the scoreboard. Entries that cover the
* same line range have been removed from the scoreboard previously.
*/
static void add_blame_entry(struct scoreboard *sb, struct blame_entry *e)
{
struct blame_entry *ent, *prev = NULL;
@ -497,6 +576,12 @@ static void add_blame_entry(struct scoreboard *sb, struct blame_entry *e)
e->next->prev = e;
}
/*
* src typically is on-stack; we want to copy the information in it to
* an malloced blame_entry that is already on the linked list of the
* scoreboard. The origin of dst loses a refcnt while the origin of src
* gains one.
*/
static void dup_entry(struct blame_entry *dst, struct blame_entry *src)
{
struct blame_entry *p, *n;
@ -516,25 +601,25 @@ static const char *nth_line(struct scoreboard *sb, int lno)
return sb->final_buf + sb->lineno[lno];
}
/*
* It is known that lines between tlno to same came from parent, and e
* has an overlap with that range. it also is known that parent's
* line plno corresponds to e's line tlno.
*
* <---- e ----->
* <------>
* <------------>
* <------------>
* <------------------>
*
* Split e into potentially three parts; before this chunk, the chunk
* to be blamed for the parent, and after that portion.
*/
static void split_overlap(struct blame_entry *split,
struct blame_entry *e,
int tlno, int plno, int same,
struct origin *parent)
{
/* it is known that lines between tlno to same came from
* parent, and e has an overlap with that range. it also is
* known that parent's line plno corresponds to e's line tlno.
*
* <---- e ----->
* <------>
* <------------>
* <------------>
* <------------------>
*
* Potentially we need to split e into three parts; before
* this chunk, the chunk to be blamed for parent, and after
* that portion.
*/
int chunk_end_lno;
memset(split, 0, sizeof(struct blame_entry [3]));
@ -564,11 +649,20 @@ static void split_overlap(struct blame_entry *split,
chunk_end_lno = e->lno + e->num_lines;
split[1].num_lines = chunk_end_lno - split[1].lno;
/*
* if it turns out there is nothing to blame the parent for,
* forget about the splitting. !split[1].suspect signals this.
*/
if (split[1].num_lines < 1)
return;
split[1].suspect = origin_incref(parent);
}
/*
* split_overlap() divided an existing blame e into up to three parts
* in split. Adjust the linked list of blames in the scoreboard to
* reflect the split.
*/
static void split_blame(struct scoreboard *sb,
struct blame_entry *split,
struct blame_entry *e)
@ -576,21 +670,27 @@ static void split_blame(struct scoreboard *sb,
struct blame_entry *new_entry;
if (split[0].suspect && split[2].suspect) {
/* we need to split e into two and add another for parent */
/* The first part (reuse storage for the existing entry e) */
dup_entry(e, &split[0]);
/* The last part -- me */
new_entry = xmalloc(sizeof(*new_entry));
memcpy(new_entry, &(split[2]), sizeof(struct blame_entry));
add_blame_entry(sb, new_entry);
/* ... and the middle part -- parent */
new_entry = xmalloc(sizeof(*new_entry));
memcpy(new_entry, &(split[1]), sizeof(struct blame_entry));
add_blame_entry(sb, new_entry);
}
else if (!split[0].suspect && !split[2].suspect)
/* parent covers the entire area */
/*
* The parent covers the entire area; reuse storage for
* e and replace it with the parent.
*/
dup_entry(e, &split[1]);
else if (split[0].suspect) {
/* me and then parent */
dup_entry(e, &split[0]);
new_entry = xmalloc(sizeof(*new_entry));
@ -598,6 +698,7 @@ static void split_blame(struct scoreboard *sb,
add_blame_entry(sb, new_entry);
}
else {
/* parent and then me */
dup_entry(e, &split[1]);
new_entry = xmalloc(sizeof(*new_entry));
@ -628,6 +729,10 @@ static void split_blame(struct scoreboard *sb,
}
}
/*
* After splitting the blame, the origins used by the
* on-stack blame_entry should lose one refcnt each.
*/
static void decref_split(struct blame_entry *split)
{
int i;
@ -636,6 +741,10 @@ static void decref_split(struct blame_entry *split)
origin_decref(split[i].suspect);
}
/*
* Helper for blame_chunk(). blame_entry e is known to overlap with
* the patch hunk; split it and pass blame to the parent.
*/
static void blame_overlap(struct scoreboard *sb, struct blame_entry *e,
int tlno, int plno, int same,
struct origin *parent)
@ -648,6 +757,9 @@ static void blame_overlap(struct scoreboard *sb, struct blame_entry *e,
decref_split(split);
}
/*
* Find the line number of the last line the target is suspected for.
*/
static int find_last_in_target(struct scoreboard *sb, struct origin *target)
{
struct blame_entry *e;
@ -662,6 +774,11 @@ static int find_last_in_target(struct scoreboard *sb, struct origin *target)
return last_in_target;
}
/*
* Process one hunk from the patch between the current suspect for
* blame_entry e and its parent. Find and split the overlap, and
* pass blame to the overlapping part to the parent.
*/
static void blame_chunk(struct scoreboard *sb,
int tlno, int plno, int same,
struct origin *target, struct origin *parent)
@ -678,6 +795,11 @@ static void blame_chunk(struct scoreboard *sb,
}
}
/*
* We are looking at the origin 'target' and aiming to pass blame
* for the lines it is suspected to its parent. Run diff to find
* which lines came from parent and pass blame for them.
*/
static int pass_blame_to_parent(struct scoreboard *sb,
struct origin *target,
struct origin *parent)
@ -698,13 +820,22 @@ static int pass_blame_to_parent(struct scoreboard *sb,
plno = chunk->p_next;
tlno = chunk->t_next;
}
/* rest (i.e. anything above tlno) are the same as parent */
/* The rest (i.e. anything after tlno) are the same as the parent */
blame_chunk(sb, tlno, plno, last_in_target, target, parent);
free_patch(patch);
return 0;
}
/*
* The lines in blame_entry after splitting blames many times can become
* very small and trivial, and at some point it becomes pointless to
* blame the parents. E.g. "\t\t}\n\t}\n\n" appears everywhere in any
* ordinary C program, and it is not worth to say it was copied from
* totally unrelated file in the parent.
*
* Compute how trivial the lines in the blame_entry are.
*/
static unsigned ent_score(struct scoreboard *sb, struct blame_entry *e)
{
unsigned score;
@ -726,6 +857,12 @@ static unsigned ent_score(struct scoreboard *sb, struct blame_entry *e)
return score;
}
/*
* best_so_far[] and this[] are both a split of an existing blame_entry
* that passes blame to the parent. Maintain best_so_far the best split
* so far, by comparing this and best_so_far and copying this into
* bst_so_far as needed.
*/
static void copy_split_if_better(struct scoreboard *sb,
struct blame_entry *best_so_far,
struct blame_entry *this)
@ -745,6 +882,11 @@ static void copy_split_if_better(struct scoreboard *sb,
memcpy(best_so_far, this, sizeof(struct blame_entry [3]));
}
/*
* Find the lines from parent that are the same as ent so that
* we can pass blames to it. file_p has the blob contents for
* the parent.
*/
static void find_copy_in_blob(struct scoreboard *sb,
struct blame_entry *ent,
struct origin *parent,
@ -757,6 +899,9 @@ static void find_copy_in_blob(struct scoreboard *sb,
struct patch *patch;
int i, plno, tlno;
/*
* Prepare mmfile that contains only the lines in ent.
*/
cp = nth_line(sb, ent->lno);
file_o.ptr = (char*) cp;
cnt = ent->num_lines;
@ -792,6 +937,10 @@ static void find_copy_in_blob(struct scoreboard *sb,
free_patch(patch);
}
/*
* See if lines currently target is suspected for can be attributed to
* parent.
*/
static int find_move_in_parent(struct scoreboard *sb,
struct origin *target,
struct origin *parent)
@ -826,12 +975,15 @@ static int find_move_in_parent(struct scoreboard *sb,
return 0;
}
struct blame_list {
struct blame_entry *ent;
struct blame_entry split[3];
};
/*
* Count the number of entries the target is suspected for,
* and prepare a list of entry and the best split.
*/
static struct blame_list *setup_blame_list(struct scoreboard *sb,
struct origin *target,
int *num_ents_p)
@ -840,9 +992,6 @@ static struct blame_list *setup_blame_list(struct scoreboard *sb,
int num_ents, i;
struct blame_list *blame_list = NULL;
/* Count the number of entries the target is suspected for,
* and prepare a list of entry and the best split.
*/
for (e = sb->ent, num_ents = 0; e; e = e->next)
if (!e->guilty && !cmp_suspect(e->suspect, target))
num_ents++;
@ -856,6 +1005,11 @@ static struct blame_list *setup_blame_list(struct scoreboard *sb,
return blame_list;
}
/*
* For lines target is suspected for, see if we can find code movement
* across file boundary from the parent commit. porigin is the path
* in the parent we already tried.
*/
static int find_copy_in_parent(struct scoreboard *sb,
struct origin *target,
struct commit *parent,
@ -956,7 +1110,8 @@ static int find_copy_in_parent(struct scoreboard *sb,
return retval;
}
/* The blobs of origin and porigin exactly match, so everything
/*
* The blobs of origin and porigin exactly match, so everything
* origin is suspected for can be blamed on the parent.
*/
static void pass_whole_blame(struct scoreboard *sb,
@ -1041,7 +1196,7 @@ static void pass_blame(struct scoreboard *sb, struct origin *origin, int opt)
}
/*
* Optionally run "miff" to find moves in parents' files here.
* Optionally find moves in parents' files.
*/
if (opt & PICKAXE_BLAME_MOVE)
for (i = 0, parent = commit->parents;
@ -1055,7 +1210,7 @@ static void pass_blame(struct scoreboard *sb, struct origin *origin, int opt)
}
/*
* Optionally run "ciff" to find copies from parents' files here.
* Optionally find copies from parents' files.
*/
if (opt & PICKAXE_BLAME_COPY)
for (i = 0, parent = commit->parents;
@ -1072,6 +1227,9 @@ static void pass_blame(struct scoreboard *sb, struct origin *origin, int opt)
origin_decref(parent_origin[i]);
}
/*
* Information on commits, used for output.
*/
struct commit_info
{
char *author;
@ -1088,6 +1246,9 @@ struct commit_info
char *summary;
};
/*
* Parse author/committer line in the commit object buffer
*/
static void get_ac_line(const char *inbuf, const char *what,
int bufsz, char *person, char **mail,
unsigned long *time, char **tz)
@ -1142,7 +1303,8 @@ static void get_commit_info(struct commit *commit,
static char committer_buf[1024];
static char summary_buf[1024];
/* We've operated without save_commit_buffer, so
/*
* We've operated without save_commit_buffer, so
* we now need to populate them for output.
*/
if (!commit->buffer) {
@ -1182,6 +1344,10 @@ static void get_commit_info(struct commit *commit,
summary_buf[len] = 0;
}
/*
* To allow LF and other nonportable characters in pathnames,
* they are c-style quoted as needed.
*/
static void write_filename_info(const char *path)
{
printf("filename ");
@ -1189,6 +1355,10 @@ static void write_filename_info(const char *path)
putchar('\n');
}
/*
* The blame_entry is found to be guilty for the range. Mark it
* as such, and show it in incremental output.
*/
static void found_guilty_entry(struct blame_entry *ent)
{
if (ent->guilty)
@ -1220,6 +1390,11 @@ static void found_guilty_entry(struct blame_entry *ent)
}
}
/*
* The main loop -- while the scoreboard has lines whose true origin
* is still unknown, pick one blame_entry, and allow its current
* suspect to pass blames to its parents.
*/
static void assign_blame(struct scoreboard *sb, struct rev_info *revs, int opt)
{
while (1) {
@ -1234,12 +1409,16 @@ static void assign_blame(struct scoreboard *sb, struct rev_info *revs, int opt)
if (!suspect)
return; /* all done */
/*
* We will use this suspect later in the loop,
* so hold onto it in the meantime.
*/
origin_incref(suspect);
commit = suspect->commit;
if (!commit->object.parsed)
parse_commit(commit);
if (!(commit->object.flags & UNINTERESTING) &&
!(revs->max_age != -1 && commit->date < revs->max_age))
!(revs->max_age != -1 && commit->date < revs->max_age))
pass_blame(sb, suspect, opt);
else {
commit->object.flags |= UNINTERESTING;
@ -1431,6 +1610,10 @@ static void output(struct scoreboard *sb, int option)
}
}
/*
* To allow quick access to the contents of nth line in the
* final image, prepare an index in the scoreboard.
*/
static int prepare_lines(struct scoreboard *sb)
{
const char *buf = sb->final_buf;
@ -1458,6 +1641,11 @@ static int prepare_lines(struct scoreboard *sb)
return sb->num_lines;
}
/*
* Add phony grafts for use with -S; this is primarily to
* support git-cvsserver that wants to give a linear history
* to its clients.
*/
static int read_ancestry(const char *graft_file)
{
FILE *fp = fopen(graft_file, "r");
@ -1475,6 +1663,9 @@ static int read_ancestry(const char *graft_file)
return 0;
}
/*
* How many columns do we need to show line numbers in decimal?
*/
static int lineno_width(int lines)
{
int i, width;
@ -1484,6 +1675,10 @@ static int lineno_width(int lines)
return width;
}
/*
* How many columns do we need to show line numbers, authors,
* and filenames?
*/
static void find_alignment(struct scoreboard *sb, int *option)
{
int longest_src_lines = 0;
@ -1522,6 +1717,10 @@ static void find_alignment(struct scoreboard *sb, int *option)
max_score_digits = lineno_width(largest_score);
}
/*
* For debugging -- origin is refcounted, and this asserts that
* we do not underflow.
*/
static void sanity_check_refcnt(struct scoreboard *sb)
{
int baa = 0;
@ -1543,8 +1742,9 @@ static void sanity_check_refcnt(struct scoreboard *sb)
ent->suspect->refcnt = -ent->suspect->refcnt;
}
for (ent = sb->ent; ent; ent = ent->next) {
/* then pick each and see if they have the the correct
* refcnt.
/*
* ... then pick each and see if they have the the
* correct refcnt.
*/
int found;
struct blame_entry *e;
@ -1574,6 +1774,10 @@ static void sanity_check_refcnt(struct scoreboard *sb)
}
}
/*
* Used for the command line parsing; check if the path exists
* in the working tree.
*/
static int has_path_in_work_tree(const char *path)
{
struct stat st;
@ -1596,6 +1800,9 @@ static const char *add_prefix(const char *prefix, const char *path)
return prefix_path(prefix, strlen(prefix), path);
}
/*
* Parsing of (comma separated) one item in the -L option
*/
static const char *parse_loc(const char *spec,
struct scoreboard *sb, long lno,
long begin, long *ret)
@ -1670,6 +1877,9 @@ static const char *parse_loc(const char *spec,
}
}
/*
* Parsing of -L option
*/
static void prepare_blame_range(struct scoreboard *sb,
const char *bottomtop,
long lno,
@ -1780,14 +1990,18 @@ int cmd_blame(int argc, const char **argv, const char *prefix)
argv[unk++] = arg;
}
if (!incremental)
setup_pager();
if (!blame_move_score)
blame_move_score = BLAME_DEFAULT_MOVE_SCORE;
if (!blame_copy_score)
blame_copy_score = BLAME_DEFAULT_COPY_SCORE;
/* We have collected options unknown to us in argv[1..unk]
/*
* We have collected options unknown to us in argv[1..unk]
* which are to be passed to revision machinery if we are
* going to do the "bottom" procesing.
* going to do the "bottom" processing.
*
* The remaining are:
*
@ -1865,7 +2079,8 @@ int cmd_blame(int argc, const char **argv, const char *prefix)
if (final_commit_name)
argv[unk++] = final_commit_name;
/* Now we got rev and path. We do not want the path pruning
/*
* Now we got rev and path. We do not want the path pruning
* but we may want "bottom" processing.
*/
argv[unk++] = "--"; /* terminate the rev name */
@ -1875,7 +2090,8 @@ int cmd_blame(int argc, const char **argv, const char *prefix)
setup_revisions(unk, argv, &revs, "HEAD");
memset(&sb, 0, sizeof(sb));
/* There must be one and only one positive commit in the
/*
* There must be one and only one positive commit in the
* revs->pending array.
*/
for (i = 0; i < revs.pending.nr; i++) {
@ -1896,7 +2112,10 @@ int cmd_blame(int argc, const char **argv, const char *prefix)
}
if (!sb.final) {
/* "--not A B -- path" without anything positive */
/*
* "--not A B -- path" without anything positive;
* default to HEAD.
*/
unsigned char head_sha1[20];
final_commit_name = "HEAD";
@ -1906,7 +2125,8 @@ int cmd_blame(int argc, const char **argv, const char *prefix)
add_pending_object(&revs, &(sb.final->object), "HEAD");
}
/* If we have bottom, this will mark the ancestors of the
/*
* If we have bottom, this will mark the ancestors of the
* bottom commits we would reach while traversing as
* uninteresting.
*/

View file

@ -316,6 +316,7 @@ static void create_branch(const char *name, const char *start_name,
struct commit *commit;
unsigned char sha1[20];
char ref[PATH_MAX], msg[PATH_MAX + 20];
int forcing = 0;
snprintf(ref, sizeof ref, "refs/heads/%s", name);
if (check_ref_format(ref))
@ -326,6 +327,7 @@ static void create_branch(const char *name, const char *start_name,
die("A branch named '%s' already exists.", name);
else if (!is_bare_repository() && !strcmp(head, name))
die("Cannot force update the current branch.");
forcing = 1;
}
if (start_sha1)
@ -342,11 +344,15 @@ static void create_branch(const char *name, const char *start_name,
if (!lock)
die("Failed to lock ref for update: %s.", strerror(errno));
if (reflog) {
if (reflog)
log_all_ref_updates = 1;
if (forcing)
snprintf(msg, sizeof msg, "branch: Reset from %s",
start_name);
else
snprintf(msg, sizeof msg, "branch: Created from %s",
start_name);
}
if (write_ref_sha1(lock, sha1, msg) < 0)
die("Failed to write ref: %s.", strerror(errno));
@ -358,7 +364,7 @@ static void rename_branch(const char *oldname, const char *newname, int force)
unsigned char sha1[20];
if (!oldname)
die("cannot rename the curren branch while not on any.");
die("cannot rename the current branch while not on any.");
if (snprintf(oldref, sizeof(oldref), "refs/heads/%s", oldname) > sizeof(oldref))
die("Old branchname too long");

View file

@ -2,7 +2,7 @@
#include "cache.h"
static const char git_config_set_usage[] =
"git-repo-config [ --global ] [ --bool | --int ] [--get | --get-all | --get-regexp | --replace-all | --add | --unset | --unset-all] name [value [value_regex]] | --rename-section old_name new_name | --list";
"git-config [ --global ] [ --bool | --int ] [--get | --get-all | --get-regexp | --replace-all | --add | --unset | --unset-all] name [value [value_regex]] | --rename-section old_name new_name | --list";
static char *key;
static regex_t *key_regexp;
@ -126,7 +126,7 @@ static int get_value(const char* key_, const char* regex_)
return ret;
}
int cmd_repo_config(int argc, const char **argv, const char *prefix)
int cmd_config(int argc, const char **argv, const char *prefix)
{
int nongit = 0;
setup_git_directory_gently(&nongit);

View file

@ -12,6 +12,7 @@
#define QUOTE_SHELL 1
#define QUOTE_PERL 2
#define QUOTE_PYTHON 3
#define QUOTE_TCL 4
typedef enum { FIELD_STR, FIELD_ULONG, FIELD_TIME } cmp_type;
@ -134,7 +135,7 @@ static const char *find_next(const char *cp)
while (*cp) {
if (*cp == '%') {
/* %( is the start of an atom;
* %% is a quoteed per-cent.
* %% is a quoted per-cent.
*/
if (cp[1] == '(')
return cp;
@ -723,6 +724,9 @@ static void print_value(struct refinfo *ref, int atom, int quote_style)
case QUOTE_PYTHON:
python_quote_print(stdout, v->s);
break;
case QUOTE_TCL:
tcl_quote_print(stdout, v->s);
break;
}
}
@ -834,6 +838,12 @@ int cmd_for_each_ref(int ac, const char **av, char *prefix)
quote_style = QUOTE_PYTHON;
continue;
}
if (!strcmp(arg, "--tcl") ) {
if (0 <= quote_style)
die("more than one quoting style?");
quote_style = QUOTE_TCL;
continue;
}
if (!strncmp(arg, "--count=", 8)) {
if (maxcount)
die("more than one --count?");

View file

@ -117,7 +117,7 @@ static void check_unreachable_object(struct object *obj)
/*
* "!used" means that nothing at all points to it, including
* other unreacahble objects. In other words, it's the "tip"
* other unreachable objects. In other words, it's the "tip"
* of some set of unreachable objects, usually a commit that
* got dropped.
*
@ -576,12 +576,11 @@ static int fsck_cache_tree(struct cache_tree *it)
return err;
}
int main(int argc, char **argv)
int cmd_fsck(int argc, char **argv, const char *prefix)
{
int i, heads;
track_object_refs = 1;
setup_git_directory();
for (i = 1; i < argc; i++) {
const char *arg = argv[i];
@ -611,7 +610,7 @@ int main(int argc, char **argv)
continue;
}
if (*arg == '-')
usage("git-fsck-objects [--tags] [--root] [[--unreachable] [--cache] [--full] [--strict] <head-sha1>*]");
usage("git-fsck [--tags] [--root] [[--unreachable] [--cache] [--full] [--strict] <head-sha1>*]");
}
fsck_head_link();

View file

@ -501,6 +501,7 @@ int cmd_update_index(int argc, const char **argv, const char *prefix)
for (i = 1 ; i < argc; i++) {
const char *path = argv[i];
const char *p;
if (allow_options && *path == '-') {
if (!strcmp(path, "--")) {
@ -616,9 +617,12 @@ int cmd_update_index(int argc, const char **argv, const char *prefix)
usage(update_index_usage);
die("unknown option %s", path);
}
update_one(path, prefix, prefix_length);
p = prefix_path(prefix, prefix_length, path);
update_one(p, NULL, 0);
if (set_executable_bit)
chmod_path(set_executable_bit, path);
chmod_path(set_executable_bit, p);
if (p < path || p > path + strlen(path))
free((char*)p);
}
if (read_from_stdin) {
struct strbuf buf;

View file

@ -61,10 +61,8 @@ int cmd_update_ref(int argc, const char **argv, const char *prefix)
lock = lock_any_ref_for_update(refname, oldval ? oldsha1 : NULL);
if (!lock)
return 1;
die("%s: cannot lock the ref", refname);
if (write_ref_sha1(lock, sha1, msg) < 0)
return 1;
/* write_ref_sha1 always unlocks the ref, no need to do it explicitly */
die("%s: cannot update the ref", refname);
return 0;
}

View file

@ -34,6 +34,7 @@ extern int cmd_diff_tree(int argc, const char **argv, const char *prefix);
extern int cmd_fmt_merge_msg(int argc, const char **argv, const char *prefix);
extern int cmd_for_each_ref(int argc, const char **argv, const char *prefix);
extern int cmd_format_patch(int argc, const char **argv, const char *prefix);
extern int cmd_fsck(int argc, const char **argv, const char *prefix);
extern int cmd_get_tar_commit_id(int argc, const char **argv, const char *prefix);
extern int cmd_grep(int argc, const char **argv, const char *prefix);
extern int cmd_help(int argc, const char **argv, const char *prefix);
@ -53,7 +54,7 @@ extern int cmd_prune_packed(int argc, const char **argv, const char *prefix);
extern int cmd_push(int argc, const char **argv, const char *prefix);
extern int cmd_read_tree(int argc, const char **argv, const char *prefix);
extern int cmd_reflog(int argc, const char **argv, const char *prefix);
extern int cmd_repo_config(int argc, const char **argv, const char *prefix);
extern int cmd_config(int argc, const char **argv, const char *prefix);
extern int cmd_rerere(int argc, const char **argv, const char *prefix);
extern int cmd_rev_list(int argc, const char **argv, const char *prefix);
extern int cmd_rev_parse(int argc, const char **argv, const char *prefix);

View file

@ -482,11 +482,11 @@ static int make_hunks(struct sline *sline, unsigned long cnt,
return has_interesting;
}
static void show_parent_lno(struct sline *sline, unsigned long l0, unsigned long l1, int n)
static void show_parent_lno(struct sline *sline, unsigned long l0, unsigned long l1, int n, unsigned long null_context)
{
l0 = sline[l0].p_lno[n];
l1 = sline[l1].p_lno[n];
printf(" -%lu,%lu", l0, l1-l0);
printf(" -%lu,%lu", l0, l1-l0-null_context);
}
static int hunk_comment_line(const char *bol)
@ -519,6 +519,7 @@ static void dump_sline(struct sline *sline, unsigned long cnt, int num_parent,
unsigned long hunk_end;
unsigned long rlines;
const char *hunk_comment = NULL;
unsigned long null_context = 0;
while (lno <= cnt && !(sline[lno].flag & mark)) {
if (hunk_comment_line(sline[lno].bol))
@ -535,10 +536,28 @@ static void dump_sline(struct sline *sline, unsigned long cnt, int num_parent,
rlines = hunk_end - lno;
if (cnt < hunk_end)
rlines--; /* pointing at the last delete hunk */
if (!context) {
/*
* Even when running with --unified=0, all
* lines in the hunk needs to be processed in
* the loop below in order to show the
* deletion recorded in lost_head. However,
* we do not want to show the resulting line
* with all blank context markers in such a
* case. Compensate.
*/
unsigned long j;
for (j = lno; j < hunk_end; j++)
if (!(sline[j].flag & (mark-1)))
null_context++;
rlines -= null_context;
}
fputs(c_frag, stdout);
for (i = 0; i <= num_parent; i++) putchar(combine_marker);
for (i = 0; i < num_parent; i++)
show_parent_lno(sline, lno, hunk_end, i);
show_parent_lno(sline, lno, hunk_end, i, null_context);
printf(" +%lu,%lu ", lno+1, rlines);
for (i = 0; i <= num_parent; i++) putchar(combine_marker);
@ -578,8 +597,15 @@ static void dump_sline(struct sline *sline, unsigned long cnt, int num_parent,
if (cnt < lno)
break;
p_mask = 1;
if (!(sl->flag & (mark-1)))
if (!(sl->flag & (mark-1))) {
/*
* This sline was here to hang the
* lost lines in front of it.
*/
if (!context)
continue;
fputs(c_plain, stdout);
}
else
fputs(c_new, stdout);
for (j = 0; j < num_parent; j++) {

View file

@ -47,7 +47,8 @@ enum cmit_fmt get_commit_format(const char *arg)
if (*arg == '=')
arg++;
for (i = 0; i < ARRAY_SIZE(cmt_fmts); i++) {
if (!strncmp(arg, cmt_fmts[i].n, cmt_fmts[i].cmp_len))
if (!strncmp(arg, cmt_fmts[i].n, cmt_fmts[i].cmp_len) &&
!strncmp(arg, cmt_fmts[i].n, strlen(arg)))
return cmt_fmts[i].v;
}

View file

@ -896,7 +896,7 @@ int git_config_rename_section(const char *old_name, const char *new_name)
if (buf[i] != old_name[j++])
break;
}
if (buf[i] == ']') {
if (buf[i] == ']' && old_name[j] == 0) {
/* old_name matches */
ret++;
store.baselen = strlen(new_name);

10
contrib/blameview/README Normal file
View file

@ -0,0 +1,10 @@
This is a sample program to use 'git-blame --incremental', based
on this message.
From: Jeff King <peff@peff.net>
Subject: Re: More precise tag following
To: Linus Torvalds <torvalds@linux-foundation.org>
Cc: git@vger.kernel.org
Date: Sat, 27 Jan 2007 18:52:38 -0500
Message-ID: <20070127235238.GA28706@coredump.intra.peff.net>

119
contrib/blameview/blameview.perl Executable file
View file

@ -0,0 +1,119 @@
#!/usr/bin/perl
use Gtk2 -init;
use Gtk2::SimpleList;
my $fn = shift or die "require filename to blame";
Gtk2::Rc->parse_string(<<'EOS');
style "treeview_style"
{
GtkTreeView::vertical-separator = 0
}
class "GtkTreeView" style "treeview_style"
EOS
my $window = Gtk2::Window->new('toplevel');
$window->signal_connect(destroy => sub { Gtk2->main_quit });
my $scrolled_window = Gtk2::ScrolledWindow->new;
$window->add($scrolled_window);
my $fileview = Gtk2::SimpleList->new(
'Commit' => 'text',
'CommitInfo' => 'text',
'FileLine' => 'text',
'Data' => 'text'
);
$scrolled_window->add($fileview);
$fileview->get_column(0)->set_spacing(0);
$fileview->set_size_request(1024, 768);
$fileview->set_rules_hint(1);
my $fh;
open($fh, '-|', "git cat-file blob HEAD:$fn")
or die "unable to open $fn: $!";
while(<$fh>) {
chomp;
$fileview->{data}->[$.] = ['HEAD', '?', "$fn:$.", $_];
}
my $blame;
open($blame, '-|', qw(git blame --incremental --), $fn)
or die "cannot start git-blame $fn";
Glib::IO->add_watch(fileno($blame), 'in', \&read_blame_line);
$window->show_all;
Gtk2->main;
exit 0;
my %commitinfo = ();
sub flush_blame_line {
my ($attr) = @_;
return unless defined $attr;
my ($commit, $s_lno, $lno, $cnt) =
@{$attr}{qw(COMMIT S_LNO LNO CNT)};
my ($filename, $author, $author_time, $author_tz) =
@{$commitinfo{$commit}}{qw(FILENAME AUTHOR AUTHOR-TIME AUTHOR-TZ)};
my $info = $author . ' ' . format_time($author_time, $author_tz);
for(my $i = 0; $i < $cnt; $i++) {
@{$fileview->{data}->[$lno+$i-1]}[0,1,2] =
(substr($commit, 0, 8), $info,
$filename . ':' . ($s_lno+$i));
}
}
my $buf;
my $current;
sub read_blame_line {
my $r = sysread($blame, $buf, 1024, length($buf));
die "I/O error" unless defined $r;
if ($r == 0) {
flush_blame_line($current);
$current = undef;
return 0;
}
while ($buf =~ s/([^\n]*)\n//) {
my $line = $1;
if (($commit, $s_lno, $lno, $cnt) =
($line =~ /^([0-9a-f]{40}) (\d+) (\d+) (\d+)$/)) {
flush_blame_line($current);
$current = +{
COMMIT => $1,
S_LNO => $2,
LNO => $3,
CNT => $4,
};
next;
}
# extended attribute values
if ($line =~ /^(author|author-mail|author-time|author-tz|committer|committer-mail|committer-time|committer-tz|summary|filename) (.*)$/) {
my $commit = $current->{COMMIT};
$commitinfo{$commit}{uc($1)} = $2;
next;
}
}
return 1;
}
sub format_time {
my $time = shift;
my $tz = shift;
my $minutes = $tz < 0 ? 0-$tz : $tz;
$minutes = ($minutes / 100)*60 + ($minutes % 100);
$minutes = $tz < 0 ? 0-$minutes : $minutes;
$time += $minutes * 60;
my @t = gmtime($time);
return sprintf('%04d-%02d-%02d %02d:%02d:%02d %s',
$t[5] + 1900, @t[4,3,2,1,0], $tz);
}

View file

@ -145,7 +145,7 @@ __git_remotes ()
echo ${i#$d/remotes/}
done
[ "$ngoff" ] && shopt -u nullglob
for i in $(git --git-dir="$d" repo-config --list); do
for i in $(git --git-dir="$d" config --list); do
case "$i" in
remote.*.url=*)
i="${i#remote.}"
@ -286,7 +286,7 @@ __git_commandlist="$(__git_commands 2>/dev/null)"
__git_aliases ()
{
local i IFS=$'\n'
for i in $(git --git-dir="$(__gitdir)" repo-config --list); do
for i in $(git --git-dir="$(__gitdir)" config --list); do
case "$i" in
alias.*)
i="${i#alias.}"
@ -299,7 +299,7 @@ __git_aliases ()
__git_aliased_command ()
{
local word cmdline=$(git --git-dir="$(__gitdir)" \
repo-config --get "alias.$1")
config --get "alias.$1")
for word in $cmdline; do
if [ "${word##-*}" ]; then
echo $word
@ -629,7 +629,7 @@ _git_rebase ()
COMPREPLY=($(compgen -W "$(__git_refs)" -- "$cur"))
}
_git_repo_config ()
_git_config ()
{
local cur="${COMP_WORDS[COMP_CWORD]}"
local prv="${COMP_WORDS[COMP_CWORD-1]}"
@ -806,6 +806,7 @@ _git ()
checkout) _git_checkout ;;
cherry-pick) _git_cherry_pick ;;
commit) _git_commit ;;
config) _git_config ;;
diff) _git_diff ;;
diff-tree) _git_diff_tree ;;
fetch) _git_fetch ;;
@ -819,7 +820,7 @@ _git ()
pull) _git_pull ;;
push) _git_push ;;
rebase) _git_rebase ;;
repo-config) _git_repo_config ;;
repo-config) _git_config ;;
reset) _git_reset ;;
show) _git_show ;;
show-branch) _git_log ;;
@ -856,7 +857,7 @@ complete -o default -F _git_name_rev git-name-rev
complete -o default -o nospace -F _git_pull git-pull
complete -o default -o nospace -F _git_push git-push
complete -o default -F _git_rebase git-rebase
complete -o default -F _git_repo_config git-repo-config
complete -o default -F _git_config git-config
complete -o default -F _git_reset git-reset
complete -o default -o nospace -F _git_show git-show
complete -o default -o nospace -F _git_log git-show-branch
@ -879,7 +880,7 @@ complete -o default -o nospace -F _git_ls_tree git-ls-tree.exe
complete -o default -F _git_merge_base git-merge-base.exe
complete -o default -F _git_name_rev git-name-rev.exe
complete -o default -o nospace -F _git_push git-push.exe
complete -o default -F _git_repo_config git-repo-config
complete -o default -F _git_config git-config
complete -o default -o nospace -F _git_show git-show.exe
complete -o default -o nospace -F _git_log git-show-branch.exe
complete -o default -o nospace -F _git_log git-whatchanged.exe

View file

@ -222,7 +222,7 @@ and returns the process output as a string."
"Return the name to use as GIT_COMMITTER_NAME."
; copied from log-edit
(or git-committer-name
(git-repo-config "user.name")
(git-config "user.name")
(and (boundp 'add-log-full-name) add-log-full-name)
(and (fboundp 'user-full-name) (user-full-name))
(and (boundp 'user-full-name) user-full-name)))
@ -231,7 +231,7 @@ and returns the process output as a string."
"Return the email address to use as GIT_COMMITTER_EMAIL."
; copied from log-edit
(or git-committer-email
(git-repo-config "user.email")
(git-config "user.email")
(and (boundp 'add-log-mailing-address) add-log-mailing-address)
(and (fboundp 'user-mail-address) (user-mail-address))
(and (boundp 'user-mail-address) user-mail-address)))
@ -298,9 +298,9 @@ and returns the process output as a string."
(git-get-string-sha1
(git-call-process-env-string nil "rev-parse" rev)))
(defun git-repo-config (key)
(defun git-config (key)
"Retrieve the value associated to KEY in the git repository config file."
(let ((str (git-call-process-env-string nil "repo-config" key)))
(let ((str (git-call-process-env-string nil "config" key)))
(and str (car (split-string str "\n")))))
(defun git-symbolic-ref (ref)

View file

@ -497,7 +497,7 @@ class GitView:
fp.close()
def get_encoding(self):
fp = os.popen("git repo-config --get i18n.commitencoding")
fp = os.popen("git config --get i18n.commitencoding")
self.encoding=string.strip(fp.readline())
fp.close()
if (self.encoding == ""):

View file

@ -26,8 +26,8 @@ if [ -d "$GIT_DIR"/remotes ]; then
mv "$GIT_DIR"/remotes "$GIT_DIR"/remotes.old
fi ;;
*)
echo "git-repo-config $key "$value" $regex"
git-repo-config $key "$value" $regex || error=1 ;;
echo "git-config $key "$value" $regex"
git-config $key "$value" $regex || error=1 ;;
esac
done
fi

View file

@ -372,9 +372,16 @@ static int upload_archive(void)
return -1;
}
static int receive_pack(void)
{
execl_git_cmd("receive-pack", ".", NULL);
return -1;
}
static struct daemon_service daemon_service[] = {
{ "upload-archive", "uploadarch", upload_archive, 0, 1 },
{ "upload-pack", "uploadpack", upload_pack, 1, 1 },
{ "receive-pack", "receivepack", receive_pack, 0, 1 },
};
static void enable_service(const char *name, int ena) {
@ -401,7 +408,7 @@ static void make_service_overridable(const char *name, int ena) {
/*
* Separate the "extra args" information as supplied by the client connection.
* Any resulting data is squirrelled away in the given interpolation table.
* Any resulting data is squirreled away in the given interpolation table.
*/
static void parse_extra_args(struct interp *table, char *extra_args, int buflen)
{

View file

@ -152,7 +152,7 @@ bisect_next() {
nr=$(eval "git-rev-list $rev $good -- $(cat $GIT_DIR/BISECT_NAMES)" | wc -l) || exit
echo "Bisecting: $nr revisions left to test after this"
echo "$rev" > "$GIT_DIR/refs/heads/new-bisect"
git checkout new-bisect || exit
git checkout -q new-bisect || exit
mv "$GIT_DIR/refs/heads/new-bisect" "$GIT_DIR/refs/heads/bisect" &&
GIT_DIR="$GIT_DIR" git-symbolic-ref HEAD refs/heads/bisect
git-show-branch "$rev"

View file

@ -1,6 +1,6 @@
#!/bin/sh
USAGE='[-f] [-b <new_branch>] [-m] [<branch>] [<paths>...]'
USAGE='[-q] [-f] [-b <new_branch>] [-m] [<branch>] [<paths>...]'
SUBDIRECTORY_OK=Sometimes
. git-sh-setup
require_work_tree
@ -15,6 +15,7 @@ branch=
newbranch=
newbranch_log=
merge=
quiet=
LF='
'
while [ "$#" != "0" ]; do
@ -40,6 +41,9 @@ while [ "$#" != "0" ]; do
-m)
merge=1
;;
"-q")
quiet=1
;;
--)
break
;;
@ -153,11 +157,11 @@ detach_warn=
if test -z "$branch$newbranch" && test "$new" != "$old"
then
detached="$new"
if test -n "$oldbranch"
if test -n "$oldbranch" && test -z "$quiet"
then
detach_warn="warning: you are not on ANY branch anymore.
If you meant to create a new branch from this checkout, you may still do
so (now or later) by using -b with the checkout command again. Example:
detach_warn="Note: moving to \"$new_name\" which isn't a local branch
If you want to create a new branch from this checkout, you may do so
(now or later) by using -b with the checkout command again. Example:
git checkout -b <new_branch_name>"
fi
elif test -z "$oldbranch" && test -n "$branch"
@ -180,8 +184,11 @@ fi
if [ "X$old" = X ]
then
echo >&2 "warning: You appear to be on a branch yet to be born."
echo >&2 "warning: Forcing checkout of $new_name."
if test -z "$quiet"
then
echo >&2 "warning: You appear to be on a branch yet to be born."
echo >&2 "warning: Forcing checkout of $new_name."
fi
force=1
fi
@ -226,9 +233,9 @@ else
exit 0
)
saved_err=$?
if test "$saved_err" = 0
if test "$saved_err" = 0 && test -z "$quiet"
then
test "$new" = "$old" || git diff-index --name-status "$new"
git diff-index --name-status "$new"
fi
(exit $saved_err)
fi
@ -251,6 +258,10 @@ if [ "$?" -eq 0 ]; then
if test -n "$branch"
then
GIT_DIR="$GIT_DIR" git-symbolic-ref -m "checkout: moving to $branch" HEAD "refs/heads/$branch"
if test -z "$quiet"
then
echo >&2 "Switched to${newbranch:+ a new} branch \"$branch\""
fi
elif test -n "$detached"
then
# NEEDSWORK: we would want a command to detach the HEAD

View file

@ -36,7 +36,7 @@ clone_dumb_http () {
clone_tmp="$GIT_DIR/clone-tmp" &&
mkdir -p "$clone_tmp" || exit 1
if [ -n "$GIT_CURL_FTP_NO_EPSV" -o \
"`git-repo-config --bool http.noEPSV`" = true ]; then
"`git-config --bool http.noEPSV`" = true ]; then
curl_extra_args="${curl_extra_args} --disable-epsv"
fi
http_fetch "$1/info/refs" "$clone_tmp/refs" ||
@ -66,48 +66,6 @@ Perhaps git-update-server-info needs to be run there?"
rm -f "$GIT_DIR/REMOTE_HEAD"
}
# Read git-fetch-pack -k output and store the remote branches.
copy_refs='
use File::Path qw(mkpath);
use File::Basename qw(dirname);
my $git_dir = $ARGV[0];
my $use_separate_remote = $ARGV[1];
my $origin = $ARGV[2];
my $branch_top = ($use_separate_remote ? "remotes/$origin" : "heads");
my $tag_top = "tags";
sub store {
my ($sha1, $name, $top) = @_;
$name = "$git_dir/refs/$top/$name";
mkpath(dirname($name));
open O, ">", "$name";
print O "$sha1\n";
close O;
}
open FH, "<", "$git_dir/CLONE_HEAD";
while (<FH>) {
my ($sha1, $name) = /^([0-9a-f]{40})\s(.*)$/;
next if ($name =~ /\^\173/);
if ($name eq "HEAD") {
open O, ">", "$git_dir/REMOTE_HEAD";
print O "$sha1\n";
close O;
next;
}
if ($name =~ s/^refs\/heads\///) {
store($sha1, $name, $branch_top);
next;
}
if ($name =~ s/^refs\/tags\///) {
store($sha1, $name, $tag_top);
next;
}
}
close FH;
'
quiet=
local=no
use_local=no
@ -165,7 +123,7 @@ while
shift
upload_pack="--upload-pack=$1" ;;
*,--upload-pack=*)
upload_pack=--upload-pack=$(expr "$1" : '-[^=]*=\(.*\)') ;;
upload_pack=--upload-pack=$(expr "z$1" : 'z-[^=]*=\(.*\)') ;;
1,--depth) usage;;
*,--depth)
shift
@ -332,8 +290,29 @@ test -d "$GIT_DIR/refs/reference-tmp" && rm -fr "$GIT_DIR/refs/reference-tmp"
if test -f "$GIT_DIR/CLONE_HEAD"
then
# Read git-fetch-pack -k output and store the remote branches.
@@PERL@@ -e "$copy_refs" "$GIT_DIR" "$use_separate_remote" "$origin" ||
exit
if [ -n "$use_separate_remote" ]
then
branch_top="remotes/$origin"
else
branch_top="heads"
fi
tag_top="tags"
while read sha1 name
do
case "$name" in
*'^{}')
continue ;;
HEAD)
destname="REMOTE_HEAD" ;;
refs/heads/*)
destname="refs/$branch_top/${name#refs/heads/}" ;;
refs/tags/*)
destname="refs/$tag_top/${name#refs/tags/}" ;;
*)
continue ;;
esac
git-update-ref -m "clone: from $repo" "$destname" "$sha1" ""
done < "$GIT_DIR/CLONE_HEAD"
fi
cd "$D" || exit
@ -386,17 +365,17 @@ then
git-update-ref HEAD "$head_sha1" &&
# Upstream URL
git-repo-config remote."$origin".url "$repo" &&
git-config remote."$origin".url "$repo" &&
# Set up the mappings to track the remote branches.
git-repo-config remote."$origin".fetch \
git-config remote."$origin".fetch \
"+refs/heads/*:$remote_top/*" '^$' &&
rm -f "refs/remotes/$origin/HEAD"
git-symbolic-ref "refs/remotes/$origin/HEAD" \
"refs/remotes/$origin/$head_points_at" &&
git-repo-config branch."$head_points_at".remote "$origin" &&
git-repo-config branch."$head_points_at".merge "refs/heads/$head_points_at"
git-config branch."$head_points_at".remote "$origin" &&
git-config branch."$head_points_at".merge "refs/heads/$head_points_at"
esac
case "$no_checkout" in

View file

@ -429,7 +429,7 @@ then
fi
elif test "$use_commit" != ""
then
encoding=$(git repo-config i18n.commitencoding || echo UTF-8)
encoding=$(git config i18n.commitencoding || echo UTF-8)
git show -s --pretty=raw --encoding="$encoding" "$use_commit" |
sed -e '1,/^$/d' -e 's/^ //'
elif test -f "$GIT_DIR/MERGE_MSG"
@ -442,8 +442,11 @@ fi | git-stripspace >"$GIT_DIR"/COMMIT_EDITMSG
case "$signoff" in
t)
need_blank_before_signoff=
tail -n 1 "$GIT_DIR"/COMMIT_EDITMSG |
grep 'Signed-off-by:' >/dev/null || need_blank_before_signoff=yes
{
echo
test -z "$need_blank_before_signoff" || echo
git-var GIT_COMMITTER_IDENT | sed -e '
s/>.*/>/
s/^/Signed-off-by: /
@ -485,7 +488,7 @@ then
q
}
'
encoding=$(git repo-config i18n.commitencoding || echo UTF-8)
encoding=$(git config i18n.commitencoding || echo UTF-8)
set_author_env=`git show -s --pretty=raw --encoding="$encoding" "$use_commit" |
LANG=C LC_ALL=C sed -ne "$pick_author_script"`
eval "$set_author_env"
@ -525,6 +528,7 @@ else
rloga='commit (initial)'
current=''
fi
set_reflog_action "$rloga"
if test -z "$no_edit"
then
@ -599,7 +603,7 @@ then
fi &&
commit=$(cat "$GIT_DIR"/COMMIT_MSG | git-commit-tree $tree $PARENTS) &&
rlogm=$(sed -e 1q "$GIT_DIR"/COMMIT_MSG) &&
git-update-ref -m "$rloga: $rlogm" HEAD $commit "$current" &&
git-update-ref -m "$GIT_REFLOG_ACTION: $rlogm" HEAD $commit "$current" &&
rm -f -- "$GIT_DIR/MERGE_HEAD" "$GIT_DIR/MERGE_MSG" &&
if test -f "$NEXT_INDEX"
then

View file

@ -172,11 +172,11 @@ sub req_Root
return 0;
}
my @gitvars = `git-repo-config -l`;
my @gitvars = `git-config -l`;
if ($?) {
print "E problems executing git-repo-config on the server -- this is not a git repository or the PATH is not set correctly.\n";
print "E problems executing git-config on the server -- this is not a git repository or the PATH is not set correctly.\n";
print "E \n";
print "error 1 - problem executing git-repo-config\n";
print "error 1 - problem executing git-config\n";
return 0;
}
foreach my $line ( @gitvars )

View file

@ -37,7 +37,7 @@ do
;;
--upl=*|--uplo=*|--uploa=*|--upload=*|\
--upload-=*|--upload-p=*|--upload-pa=*|--upload-pac=*|--upload-pack=*)
exec=--upload-pack=$(expr "$1" : '-[^=]*=\(.*\)')
exec=--upload-pack=$(expr "z$1" : 'z-[^=]*=\(.*\)')
shift
;;
-f|--f|--fo|--for|--forc|--force)
@ -321,7 +321,7 @@ fetch_main () {
curl_extra_args="-k"
fi
if [ -n "$GIT_CURL_FTP_NO_EPSV" -o \
"`git-repo-config --bool http.noEPSV`" = true ]; then
"`git-config --bool http.noEPSV`" = true ]; then
noepsv_opt="--disable-epsv"
fi

View file

@ -15,11 +15,11 @@ case "$GIT_DIR" in
fqgitdir="$PWD/$GIT_DIR" ;;
esac
local="`git repo-config --bool --get instaweb.local`"
httpd="`git repo-config --get instaweb.httpd`"
browser="`git repo-config --get instaweb.browser`"
port=`git repo-config --get instaweb.port`
module_path="`git repo-config --get instaweb.modulepath`"
local="`git config --bool --get instaweb.local`"
httpd="`git config --get instaweb.httpd`"
browser="`git config --get instaweb.browser`"
port=`git config --get instaweb.port`
module_path="`git config --get instaweb.modulepath`"
conf=$GIT_DIR/gitweb/httpd.conf

View file

@ -12,7 +12,7 @@ fi
laf="$GIT_DIR/lost-found"
rm -fr "$laf" && mkdir -p "$laf/commit" "$laf/other" || exit
git fsck-objects --full |
git fsck --full |
while read dangling type sha1
do
case "$dangling" in

View file

@ -27,7 +27,7 @@ do
shift;;
-u=*|--u=*|--up=*|--upl=*|--uplo=*|--uploa=*|--upload=*|\
--upload-=*|--upload-p=*|--upload-pa=*|--upload-pac=*|--upload-pack=*)
exec=--upload-pack=$(expr "$1" : '-[^=]*=\(.*\)')
exec=--upload-pack=$(expr "z$1" : 'z-[^=]*=\(.*\)')
shift;;
--)
shift; break ;;
@ -58,7 +58,7 @@ http://* | https://* | ftp://* )
curl_extra_args="-k"
fi
if [ -n "$GIT_CURL_FTP_NO_EPSV" -o \
"`git-repo-config --bool http.noEPSV`" = true ]; then
"`git-config --bool http.noEPSV`" = true ]; then
curl_extra_args="${curl_extra_args} --disable-epsv"
fi
curl -nsf $curl_extra_args --header "Pragma: no-cache" "$peek_repo/info/refs" ||

View file

@ -3,7 +3,7 @@
# Copyright (c) 2005 Linus Torvalds
# Copyright (c) 2005 Junio C Hamano
#
# Resolve two trees, using enhancd multi-base read-tree.
# Resolve two trees, using enhanced multi-base read-tree.
# The first parameters up to -- are merge bases; the rest are heads.
bases= head= remotes= sep_seen=

View file

@ -233,7 +233,7 @@ case "$use_strategies" in
'')
case "$#" in
1)
var="`git-repo-config --get pull.twohead`"
var="`git-config --get pull.twohead`"
if test -n "$var"
then
use_strategies="$var"
@ -241,7 +241,7 @@ case "$use_strategies" in
use_strategies="$default_twohead_strategies"
fi ;;
*)
var="`git-repo-config --get pull.octopus`"
var="`git-config --get pull.octopus`"
if test -n "$var"
then
use_strategies="$var"

View file

@ -193,13 +193,13 @@ def current_branch(self):
def get_config(self, variable):
try:
return self.git("repo-config --get %s" % variable)[0].rstrip()
return self.git("config --get %s" % variable)[0].rstrip()
except:
return None
def set_config(self, variable, value):
try:
self.git("repo-config %s %s"%(variable, value) )
self.git("config %s %s"%(variable, value) )
except:
die("Could not set %s to " % variable, value)

View file

@ -10,7 +10,7 @@ get_data_source () {
echo ''
;;
*)
if test "$(git-repo-config --get "remote.$1.url")"
if test "$(git-config --get "remote.$1.url")"
then
echo config
elif test -f "$GIT_DIR/remotes/$1"
@ -32,7 +32,7 @@ get_remote_url () {
echo "$1"
;;
config)
git-repo-config --get "remote.$1.url"
git-config --get "remote.$1.url"
;;
remotes)
sed -ne '/^URL: */{
@ -50,7 +50,7 @@ get_remote_url () {
get_default_remote () {
curr_branch=$(git-symbolic-ref -q HEAD | sed -e 's|^refs/heads/||')
origin=$(git-repo-config --get "branch.$curr_branch.remote")
origin=$(git-config --get "branch.$curr_branch.remote")
echo ${origin:-origin}
}
@ -60,7 +60,7 @@ get_remote_default_refs_for_push () {
'' | branches)
;; # no default push mapping, just send matching refs.
config)
git-repo-config --get-all "remote.$1.push" ;;
git-config --get-all "remote.$1.push" ;;
remotes)
sed -ne '/^Push: */{
s///p
@ -146,7 +146,7 @@ canon_refs_list_for_fetch () {
then
curr_branch=$(git-symbolic-ref -q HEAD | \
sed -e 's|^refs/heads/||')
merge_branches=$(git-repo-config \
merge_branches=$(git-config \
--get-all "branch.${curr_branch}.merge")
fi
if test -z "$merge_branches" && test $is_explicit != explicit
@ -183,7 +183,7 @@ canon_refs_list_for_fetch () {
done
fi
case "$remote" in
'') remote=HEAD ;;
'' | HEAD ) remote=HEAD ;;
refs/heads/* | refs/tags/* | refs/remotes/*) ;;
heads/* | tags/* | remotes/* ) remote="refs/$remote" ;;
*) remote="refs/heads/$remote" ;;
@ -212,7 +212,7 @@ get_remote_default_refs_for_fetch () {
echo "HEAD:" ;;
config)
canon_refs_list_for_fetch -d "$1" \
$(git-repo-config --get-all "remote.$1.fetch") ;;
$(git-config --get-all "remote.$1.fetch") ;;
branches)
remote_branch=$(sed -ne '/#/s/.*#//p' "$GIT_DIR/branches/$1")
case "$remote_branch" in '') remote_branch=master ;; esac
@ -291,7 +291,7 @@ get_uploadpack () {
data_source=$(get_data_source "$1")
case "$data_source" in
config)
uplp=$(git-repo-config --get "remote.$1.uploadpack")
uplp=$(git-config --get "remote.$1.uploadpack")
echo ${uplp:-git-upload-pack}
;;
*)

View file

@ -59,7 +59,7 @@ if ! [ -d "$QUILT_PATCHES" ] ; then
exit 1
fi
# Temporay directories
# Temporary directories
tmp_dir=.dotest
tmp_msg="$tmp_dir/msg"
tmp_patch="$tmp_dir/patch"

View file

@ -249,7 +249,8 @@ fi
git-update-index --refresh || exit
diff=$(git-diff-index --cached --name-status -r HEAD)
case "$diff" in
?*) echo "$diff"
?*) echo "cannot rebase: your index is not up-to-date"
echo "$diff"
exit 1
;;
esac

View file

@ -64,7 +64,7 @@ sub list_remote {
my ($git) = @_;
my %seen = ();
my @remotes = eval {
$git->command(qw(repo-config --get-regexp), '^remote\.');
$git->command(qw(config --get-regexp), '^remote\.');
};
for (@remotes) {
if (/^remote\.([^.]*)\.(\S*)\s+(.*)$/) {
@ -103,7 +103,7 @@ sub list_branch {
my ($git) = @_;
my %seen = ();
my @branches = eval {
$git->command(qw(repo-config --get-regexp), '^branch\.');
$git->command(qw(config --get-regexp), '^branch\.');
};
for (@branches) {
if (/^branch\.([^.]*)\.(\S*)\s+(.*)$/) {
@ -130,7 +130,7 @@ sub update_ls_remote {
$info->{'LS_REMOTE'} = \@ref;
}
sub show_wildcard_mapping {
sub list_wildcard_mapping {
my ($forced, $ours, $ls) = @_;
my %refs;
for (@$ls) {
@ -156,25 +156,14 @@ sub show_wildcard_mapping {
push @tracked, $_;
}
}
if (@new) {
print " New remote branches (next fetch will store in remotes/$ours)\n";
print " @new\n";
}
if (@stale) {
print " Stale tracking branches in remotes/$ours (you'd better remove them)\n";
print " @stale\n";
}
if (@tracked) {
print " Tracked remote branches\n";
print " @tracked\n";
}
return \@new, \@stale, \@tracked;
}
sub show_mapping {
sub list_mapping {
my ($name, $info) = @_;
my $fetch = $info->{'FETCH'};
my $ls = $info->{'LS_REMOTE'};
my (@stale, @tracked);
my (@new, @stale, @tracked);
for (@$fetch) {
next unless (/(\+)?([^:]+):(.*)/);
@ -182,7 +171,11 @@ sub show_mapping {
if ($theirs eq 'refs/heads/*' &&
$ours =~ /^refs\/remotes\/(.*)\/\*$/) {
# wildcard mapping
show_wildcard_mapping($forced, $1, $ls);
my ($w_new, $w_stale, $w_tracked)
= list_wildcard_mapping($forced, $1, $ls);
push @new, @$w_new;
push @stale, @$w_stale;
push @tracked, @$w_tracked;
}
elsif ($theirs =~ /\*/ || $ours =~ /\*/) {
print STDERR "Warning: unrecognized mapping in remotes.$name.fetch: $_\n";
@ -196,13 +189,40 @@ sub show_mapping {
}
}
}
if (@stale) {
print " Stale tracking branches in remotes/$name (you'd better remove them)\n";
print " @stale\n";
return \@new, \@stale, \@tracked;
}
sub show_mapping {
my ($name, $info) = @_;
my ($new, $stale, $tracked) = list_mapping($name, $info);
if (@$new) {
print " New remote branches (next fetch will store in remotes/$name)\n";
print " @$new\n";
}
if (@tracked) {
if (@$stale) {
print " Stale tracking branches in remotes/$name (use 'git remote prune')\n";
print " @$stale\n";
}
if (@$tracked) {
print " Tracked remote branches\n";
print " @tracked\n";
print " @$tracked\n";
}
}
sub prune_remote {
my ($name, $ls_remote) = @_;
if (!exists $remote->{$name}) {
print STDERR "No such remote $name\n";
return;
}
my $info = $remote->{$name};
update_ls_remote($ls_remote, $info);
my ($new, $stale, $tracked) = list_mapping($name, $info);
my $prefix = "refs/remotes/$name";
foreach my $to_prune (@$stale) {
my @v = $git->command(qw(rev-parse --verify), "$prefix/$to_prune");
$git->command(qw(update-ref -d), "$prefix/$to_prune", $v[0]);
}
}
@ -238,8 +258,8 @@ sub add_remote {
print STDERR "remote $name already exists.\n";
exit(1);
}
$git->command('repo-config', "remote.$name.url", $url);
$git->command('repo-config', "remote.$name.fetch",
$git->command('config', "remote.$name.url", $url);
$git->command('config', "remote.$name.fetch",
"+refs/heads/*:refs/remotes/$name/*");
}
@ -267,6 +287,25 @@ sub add_remote {
show_remote($ARGV[$i], $ls_remote);
}
}
elsif ($ARGV[0] eq 'prune') {
my $ls_remote = 1;
my $i;
for ($i = 1; $i < @ARGV; $i++) {
if ($ARGV[$i] eq '-n') {
$ls_remote = 0;
}
else {
last;
}
}
if ($i >= @ARGV) {
print STDERR "Usage: git remote prune <remote>\n";
exit(1);
}
for (; $i < @ARGV; $i++) {
prune_remote($ARGV[$i], $ls_remote);
}
}
elsif ($ARGV[0] eq 'add') {
if (@ARGV != 3) {
print STDERR "Usage: git remote add <name> <url>\n";
@ -278,5 +317,6 @@ sub add_remote {
print STDERR "Usage: git remote\n";
print STDERR " git remote add <name> <url>\n";
print STDERR " git remote show <name>\n";
print STDERR " git remote prune <name>\n";
exit(1);
}

View file

@ -28,7 +28,7 @@ done
# Later we will default repack.UseDeltaBaseOffset to true
default_dbo=false
case "`git repo-config --bool repack.usedeltabaseoffset ||
case "`git config --bool repack.usedeltabaseoffset ||
echo $default_dbo`" in
true)
extra="$extra --delta-base-offset" ;;

View file

@ -54,6 +54,8 @@ do
shift
done
set_reflog_action "$me"
test "$me,$replay" = "revert,t" && usage
case "$no_commit" in
@ -81,7 +83,7 @@ prev=$(git-rev-parse --verify "$commit^1" 2>/dev/null) ||
git-rev-parse --verify "$commit^2" >/dev/null 2>&1 &&
die "Cannot run $me a multi-parent commit."
encoding=$(git repo-config i18n.commitencoding || echo UTF-8)
encoding=$(git config i18n.commitencoding || echo UTF-8)
# "commit" is an existing commit. We would want to apply
# the difference it introduces since its first parent "prev"

View file

@ -408,7 +408,7 @@ sub unquote_rfc2047 {
s/_/ /g;
s/=([0-9A-F]{2})/chr(hex($1))/eg;
}
return "$_ - unquoted";
return "$_";
}
sub send_message

View file

@ -29,7 +29,7 @@ set_reflog_action() {
}
is_bare_repository () {
git-repo-config --bool --get core.bare ||
git-config --bool --get core.bare ||
case "$GIT_DIR" in
.git | */.git) echo false ;;
*) echo true ;;

View file

@ -593,7 +593,7 @@ sub multi_init {
"$trunk_url ($_trunk)\n";
}
init($trunk_url);
command_noisy('repo-config', 'svn.trunk', $trunk_url);
command_noisy('config', 'svn.trunk', $trunk_url);
}
}
$_prefix = '' unless defined $_prefix;
@ -681,7 +681,7 @@ sub show_log {
process_commit($_, $r_min, $r_max) foreach reverse @k;
}
out:
eval { command_close_pipe($log) };
close $log;
print '-' x72,"\n" unless $_incremental || $_oneline;
}
@ -772,22 +772,22 @@ sub log_use_color {
return 1 if $_color;
my ($dc, $dcvar);
$dcvar = 'color.diff';
$dc = `git-repo-config --get $dcvar`;
$dc = `git-config --get $dcvar`;
if ($dc eq '') {
# nothing at all; fallback to "diff.color"
$dcvar = 'diff.color';
$dc = `git-repo-config --get $dcvar`;
$dc = `git-config --get $dcvar`;
}
chomp($dc);
if ($dc eq 'auto') {
my $pc;
$pc = `git-repo-config --get color.pager`;
$pc = `git-config --get color.pager`;
if ($pc eq '') {
# does not have it -- fallback to pager.color
$pc = `git-repo-config --bool --get pager.color`;
$pc = `git-config --bool --get pager.color`;
}
else {
$pc = `git-repo-config --bool --get color.pager`;
$pc = `git-config --bool --get color.pager`;
if ($?) {
$pc = 'false';
}
@ -800,7 +800,7 @@ sub log_use_color {
}
return 0 if $dc eq 'never';
return 1 if $dc eq 'always';
chomp($dc = `git-repo-config --bool --get $dcvar`);
chomp($dc = `git-config --bool --get $dcvar`);
return ($dc eq 'true');
}
@ -919,7 +919,7 @@ sub complete_url_ls_init {
waitpid $pid, 0;
croak $? if $?;
my ($n) = ($switch =~ /^--(\w+)/);
command_noisy('repo-config', "svn.$n", $full_url);
command_noisy('config', "svn.$n", $full_url);
}
sub common_prefix {
@ -1475,7 +1475,7 @@ sub map_tree_joins {
$seen{$commit} = 1;
}
}
eval { command_close_pipe($pipe) };
close $pipe;
}
}
@ -1594,7 +1594,7 @@ sub init_vars {
%tree_map = ();
}
# convert GetOpt::Long specs for use by git-repo-config
# convert GetOpt::Long specs for use by git-config
sub read_repo_config {
return unless -d $GIT_DIR;
my $opts = shift;
@ -1602,7 +1602,7 @@ sub read_repo_config {
my $v = $opts->{$o};
my ($key) = ($o =~ /^([a-z\-]+)/);
$key =~ s/-//g;
my $arg = 'git-repo-config';
my $arg = 'git-config';
$arg .= ' --int' if ($o =~ /[:=]i$/);
$arg .= ' --bool' if ($o !~ /[:=][sfi]$/);
if (ref $v eq 'ARRAY') {
@ -1669,7 +1669,7 @@ sub write_grafts {
last unless /^\S/;
}
}
eval { command_close_pipe($ch) }; # breaking the pipe
close $ch; # breaking the pipe
# if real parents are the only ones in the grafts, drop it
next if join(' ',sort keys %$p) eq join(' ',sort keys %x);
@ -1766,7 +1766,7 @@ sub get_commit_time {
} elsif ($tz =~ s/^\-//) {
$s -= tz_to_s_offset($tz);
}
eval { command_close_pipe($fh) };
close $fh;
return $s;
}
die "Can't get commit time for commit: $cmt\n";
@ -2846,7 +2846,7 @@ sub rmdirs {
delete $rm->{join '/', @dn};
}
unless (%$rm) {
eval { command_close_pipe($fh) };
close $fh;
return;
}
}

View file

@ -113,8 +113,9 @@ object=$(git-rev-parse --verify --default HEAD "$@") || exit 1
type=$(git-cat-file -t $object) || exit 1
tagger=$(git-var GIT_COMMITTER_IDENT) || exit 1
keyid=$(git-repo-config user.signingkey) ||
keyid=$(expr "z$tagger" : 'z\(.*>\)')
test -n "$username" ||
username=$(git-repo-config user.signingkey) ||
username=$(expr "z$tagger" : 'z\(.*>\)')
trap 'rm -f "$GIT_DIR"/TAG_TMP* "$GIT_DIR"/TAG_FINALMSG "$GIT_DIR"/TAG_EDITMSG' 0
@ -141,7 +142,7 @@ if [ "$annotate" ]; then
cat "$GIT_DIR"/TAG_FINALMSG ) >"$GIT_DIR"/TAG_TMP
rm -f "$GIT_DIR"/TAG_TMP.asc "$GIT_DIR"/TAG_FINALMSG
if [ "$signed" ]; then
gpg -bsa -u "$keyid" "$GIT_DIR"/TAG_TMP &&
gpg -bsa -u "$username" "$GIT_DIR"/TAG_TMP &&
cat "$GIT_DIR"/TAG_TMP.asc >>"$GIT_DIR"/TAG_TMP ||
die "failed to sign the tag with GPG."
fi

7
git.c
View file

@ -217,13 +217,14 @@ static void handle_internal_command(int argc, const char **argv, char **envp)
{ "annotate", cmd_annotate, USE_PAGER },
{ "apply", cmd_apply },
{ "archive", cmd_archive },
{ "blame", cmd_blame, RUN_SETUP | USE_PAGER },
{ "blame", cmd_blame, RUN_SETUP },
{ "branch", cmd_branch, RUN_SETUP },
{ "cat-file", cmd_cat_file, RUN_SETUP },
{ "checkout-index", cmd_checkout_index, RUN_SETUP },
{ "check-ref-format", cmd_check_ref_format },
{ "cherry", cmd_cherry, RUN_SETUP },
{ "commit-tree", cmd_commit_tree, RUN_SETUP },
{ "config", cmd_config },
{ "count-objects", cmd_count_objects, RUN_SETUP },
{ "describe", cmd_describe, RUN_SETUP },
{ "diff", cmd_diff, RUN_SETUP | USE_PAGER },
@ -234,6 +235,8 @@ static void handle_internal_command(int argc, const char **argv, char **envp)
{ "fmt-merge-msg", cmd_fmt_merge_msg, RUN_SETUP },
{ "for-each-ref", cmd_for_each_ref, RUN_SETUP },
{ "format-patch", cmd_format_patch, RUN_SETUP },
{ "fsck", cmd_fsck, RUN_SETUP },
{ "fsck-objects", cmd_fsck, RUN_SETUP },
{ "get-tar-commit-id", cmd_get_tar_commit_id },
{ "grep", cmd_grep, RUN_SETUP },
{ "help", cmd_help },
@ -254,7 +257,7 @@ static void handle_internal_command(int argc, const char **argv, char **envp)
{ "push", cmd_push, RUN_SETUP },
{ "read-tree", cmd_read_tree, RUN_SETUP },
{ "reflog", cmd_reflog, RUN_SETUP },
{ "repo-config", cmd_repo_config },
{ "repo-config", cmd_config },
{ "rerere", cmd_rerere, RUN_SETUP },
{ "rev-list", cmd_rev_list, RUN_SETUP },
{ "rev-parse", cmd_rev_parse, RUN_SETUP },

2
gitk
View file

@ -6193,7 +6193,7 @@ set wrcomcmd "git diff-tree --stdin -p --pretty"
set gitencoding {}
catch {
set gitencoding [exec git repo-config --get i18n.commitencoding]
set gitencoding [exec git config --get i18n.commitencoding]
}
if {$gitencoding == ""} {
set gitencoding "utf-8"

View file

@ -834,7 +834,7 @@ sub file_type_long {
## ----------------------------------------------------------------------
## functions returning short HTML fragments, or transforming HTML fragments
## which don't beling to other sections
## which don't belong to other sections
# format line of commit message.
sub format_log_line_html {
@ -986,7 +986,7 @@ sub git_get_project_config {
$key =~ s/^gitweb\.//;
return if ($key =~ m/\W/);
my @x = (git_cmd(), 'repo-config');
my @x = (git_cmd(), 'config');
if (defined $type) { push @x, $type; }
push @x, "--get";
push @x, "gitweb.$key";

View file

@ -1069,7 +1069,7 @@ int main(int argc, const char **argv)
fprintf(stderr,
"Some loose object were found to be corrupt, but they might be just\n"
"a false '404 Not Found' error message sent with incorrect HTTP\n"
"status code. Suggest running git fsck-objects.\n");
"status code. Suggest running git-fsck.\n");
}
return rc;
}

View file

@ -178,8 +178,8 @@ static const char *env_hint =
"\n"
"Run\n"
"\n"
" git repo-config user.email \"you@email.com\"\n"
" git repo-config user.name \"Your Name\"\n"
" git config user.email \"you@email.com\"\n"
" git config user.name \"Your Name\"\n"
"\n"
"To set the identity in this repository.\n"
"Add --global to set your account\'s default\n"

View file

@ -386,7 +386,7 @@ struct rename
};
/*
* Get information of all renames which occured between 'o_tree' and
* Get information of all renames which occurred between 'o_tree' and
* 'tree'. We need the three trees in the merge ('o_tree', 'a_tree' and
* 'b_tree') to be able to associate the correct cache entries with
* the rename information. 'tree' is always equal to either a_tree or b_tree.
@ -891,7 +891,7 @@ static int process_renames(struct path_list *a_renames,
struct diff_filespec src_other, dst_other;
int try_merge, stage = a_renames == renames1 ? 3: 2;
remove_file(1, ren1_src, index_only);
remove_file(1, ren1_src, index_only || stage == 3);
hashcpy(src_other.sha1, ren1->src_entry->stages[stage].sha);
src_other.mode = ren1->src_entry->stages[stage].mode;
@ -1175,7 +1175,7 @@ static struct commit_list *reverse_commit_list(struct commit_list *list)
/*
* Merge the commits h1 and h2, return the resulting virtual
* commit object and a flag indicating the cleaness of the merge.
* commit object and a flag indicating the cleanness of the merge.
*/
static int merge(struct commit *h1,
struct commit *h2,
@ -1222,8 +1222,8 @@ static int merge(struct commit *h1,
/*
* When the merge fails, the result contains files
* with conflict markers. The cleanness flag is
* ignored, it was never acutally used, as result of
* merge_trees has always overwritten it: the commited
* ignored, it was never actually used, as result of
* merge_trees has always overwritten it: the committed
* "conflicts" were already resolved.
*/
discard_cache();

View file

@ -354,7 +354,7 @@ sub command_input_pipe {
=item command_close_pipe ( PIPE [, CTX ] )
Close the C<PIPE> as returned from C<command_*_pipe()>, checking
whether the command finished successfuly. The optional C<CTX> argument
whether the command finished successfully. The optional C<CTX> argument
is required if you want to see the command name in the error message,
and it is the second value returned by C<command_*_pipe()> when
called in array context. The call idiom is:
@ -482,14 +482,14 @@ sub wc_chdir {
=item config ( VARIABLE )
Retrieve the configuration C<VARIABLE> in the same manner as C<repo-config>
Retrieve the configuration C<VARIABLE> in the same manner as C<config>
does. In scalar context requires the variable to be set only one time
(exception is thrown otherwise), in array context returns allows the
variable to be set multiple times and returns all the values.
Must be called on a repository instance.
This currently wraps command('repo-config') so it is not so fast.
This currently wraps command('config') so it is not so fast.
=cut
@ -500,9 +500,9 @@ sub config {
try {
if (wantarray) {
return $self->command('repo-config', '--get-all', $var);
return $self->command('config', '--get-all', $var);
} else {
return $self->command_oneline('repo-config', '--get', $var);
return $self->command_oneline('config', '--get', $var);
}
} catch Git::Error::Command with {
my $E = shift;

View file

@ -781,7 +781,7 @@ =head1 $Error::ObjectifyCallback
This variable holds a reference to a subroutine that converts errors that
are plain strings to objects. It is used by Error.pm to convert textual
errors to objects, and can be overrided by the user.
errors to objects, and can be overridden by the user.
It accepts a single argument which is a hash reference to named parameters.
Currently the only named parameter passed is C<'text'> which is the text

View file

@ -18,7 +18,7 @@
* %r0 - temp
* %r3 - argument (pointer to 5 words of SHA state)
* %r4 - argument (pointer to data to hash)
* %r5 - Contant K in SHA round (initially number of blocks to hash)
* %r5 - Constant K in SHA round (initially number of blocks to hash)
* %r6-%r10 - Working copies of SHA variables A..E (actually E..A order)
* %r11-%r26 - Data being hashed W[].
* %r27-%r31 - Previous copies of A..E, for final add back.
@ -48,7 +48,7 @@
* E += ROTL(A,5) + F(B,C,D) + W[i] + K; B = ROTL(B,30)
* Then the variables are renamed: (A,B,C,D,E) = (E,A,B,C,D).
*
* Every 20 rounds, the function F() and the contant K changes:
* Every 20 rounds, the function F() and the constant K changes:
* - 20 rounds of f0(b,c,d) = "bit wise b ? c : d" = (^b & d) + (b & c)
* - 20 rounds of f1(b,c,d) = b^c^d = (b^d)^c
* - 20 rounds of f2(b,c,d) = majority(b,c,d) = (b&d) + ((b^d)&c)
@ -57,7 +57,7 @@
* These are all scheduled for near-optimal performance on a G4.
* The G4 is a 3-issue out-of-order machine with 3 ALUs, but it can only
* *consider* starting the oldest 3 instructions per cycle. So to get
* maximum performace out of it, you have to treat it as an in-order
* maximum performance out of it, you have to treat it as an in-order
* machine. Which means interleaving the computation round t with the
* computation of W[t+4].
*

34
quote.c
View file

@ -387,3 +387,37 @@ void python_quote_print(FILE *stream, const char *src)
}
fputc(sq, stream);
}
void tcl_quote_print(FILE *stream, const char *src)
{
char c;
fputc('"', stream);
while ((c = *src++)) {
switch (c) {
case '[': case ']':
case '{': case '}':
case '$': case '\\': case '"':
fputc('\\', stream);
default:
fputc(c, stream);
break;
case '\f':
fputs("\\f", stream);
break;
case '\r':
fputs("\\r", stream);
break;
case '\n':
fputs("\\n", stream);
break;
case '\t':
fputs("\\t", stream);
break;
case '\v':
fputs("\\v", stream);
break;
}
}
fputc('"', stream);
}

View file

@ -55,5 +55,6 @@ extern void write_name_quoted(const char *prefix, int prefix_len,
/* quoting as a string literal for other languages */
extern void perl_quote_print(FILE *stream, const char *src);
extern void python_quote_print(FILE *stream, const char *src);
extern void tcl_quote_print(FILE *stream, const char *src);
#endif

View file

@ -165,6 +165,14 @@ void add_reflog_for_walk(struct reflog_walk_info *info,
if (item)
reflogs = item->util;
else {
if (*branch == '\0') {
unsigned char sha1[20];
const char *head = resolve_ref("HEAD", sha1, 0, NULL);
if (!head)
die ("No current branch");
free(branch);
branch = xstrdup(head);
}
reflogs = read_complete_reflog(branch);
if (!reflogs || reflogs->nr == 0)
die("No reflogs found for '%s'", branch);

2
refs.c
View file

@ -663,6 +663,8 @@ struct ref_lock *lock_ref_sha1(const char *ref, const unsigned char *old_sha1)
struct ref_lock *lock_any_ref_for_update(const char *ref, const unsigned char *old_sha1)
{
if (check_ref_format(ref) == -1)
return NULL;
return lock_ref_sha1_basic(ref, old_sha1, NULL);
}

View file

@ -25,6 +25,8 @@ static int pack_objects(int fd, struct ref *refs)
if (pipe(pipe_fd) < 0)
return error("send-pack: pipe failed");
pid = fork();
if (pid < 0)
return error("send-pack: unable to fork git-pack-objects");
if (!pid) {
/*
* The child becomes pack-objects --revs; we feed

View file

@ -10,6 +10,8 @@ static FILE *info_ref_fp;
static int add_info_ref(const char *path, const unsigned char *sha1, int flag, void *cb_data)
{
struct object *o = parse_object(sha1);
if (!o)
return -1;
fprintf(info_ref_fp, "%s %s\n", sha1_to_hex(sha1), path);
if (o->type == OBJ_TAG) {

View file

@ -552,7 +552,11 @@ void unuse_pack(struct pack_window **w_cursor)
}
}
static void open_packed_git(struct packed_git *p)
/*
* Do not call this directly as this leaks p->pack_fd on error return;
* call open_packed_git() instead.
*/
static int open_packed_git_1(struct packed_git *p)
{
struct stat st;
struct pack_header hdr;
@ -562,49 +566,61 @@ static void open_packed_git(struct packed_git *p)
p->pack_fd = open(p->pack_name, O_RDONLY);
if (p->pack_fd < 0 || fstat(p->pack_fd, &st))
die("packfile %s cannot be opened", p->pack_name);
return -1;
/* If we created the struct before we had the pack we lack size. */
if (!p->pack_size) {
if (!S_ISREG(st.st_mode))
die("packfile %s not a regular file", p->pack_name);
return error("packfile %s not a regular file", p->pack_name);
p->pack_size = st.st_size;
} else if (p->pack_size != st.st_size)
die("packfile %s size changed", p->pack_name);
return error("packfile %s size changed", p->pack_name);
/* We leave these file descriptors open with sliding mmap;
* there is no point keeping them open across exec(), though.
*/
fd_flag = fcntl(p->pack_fd, F_GETFD, 0);
if (fd_flag < 0)
die("cannot determine file descriptor flags");
return error("cannot determine file descriptor flags");
fd_flag |= FD_CLOEXEC;
if (fcntl(p->pack_fd, F_SETFD, fd_flag) == -1)
die("cannot set FD_CLOEXEC");
return error("cannot set FD_CLOEXEC");
/* Verify we recognize this pack file format. */
if (read_in_full(p->pack_fd, &hdr, sizeof(hdr)) != sizeof(hdr))
die("file %s is far too short to be a packfile", p->pack_name);
return error("file %s is far too short to be a packfile", p->pack_name);
if (hdr.hdr_signature != htonl(PACK_SIGNATURE))
die("file %s is not a GIT packfile", p->pack_name);
return error("file %s is not a GIT packfile", p->pack_name);
if (!pack_version_ok(hdr.hdr_version))
die("packfile %s is version %u and not supported"
return error("packfile %s is version %u and not supported"
" (try upgrading GIT to a newer version)",
p->pack_name, ntohl(hdr.hdr_version));
/* Verify the pack matches its index. */
if (num_packed_objects(p) != ntohl(hdr.hdr_entries))
die("packfile %s claims to have %u objects"
return error("packfile %s claims to have %u objects"
" while index size indicates %u objects",
p->pack_name, ntohl(hdr.hdr_entries),
num_packed_objects(p));
if (lseek(p->pack_fd, p->pack_size - sizeof(sha1), SEEK_SET) == -1)
die("end of packfile %s is unavailable", p->pack_name);
return error("end of packfile %s is unavailable", p->pack_name);
if (read_in_full(p->pack_fd, sha1, sizeof(sha1)) != sizeof(sha1))
die("packfile %s signature is unavailable", p->pack_name);
return error("packfile %s signature is unavailable", p->pack_name);
idx_sha1 = ((unsigned char *)p->index_base) + p->index_size - 40;
if (hashcmp(sha1, idx_sha1))
die("packfile %s does not match index", p->pack_name);
return error("packfile %s does not match index", p->pack_name);
return 0;
}
static int open_packed_git(struct packed_git *p)
{
if (!open_packed_git_1(p))
return 0;
if (p->pack_fd != -1) {
close(p->pack_fd);
p->pack_fd = -1;
}
return -1;
}
static int in_window(struct pack_window *win, unsigned long offset)
@ -627,8 +643,8 @@ unsigned char* use_pack(struct packed_git *p,
{
struct pack_window *win = *w_cursor;
if (p->pack_fd == -1)
open_packed_git(p);
if (p->pack_fd == -1 && open_packed_git(p))
die("packfile %s cannot be accessed", p->pack_name);
/* Since packfiles end in a hash of their content and its
* pointless to ask for an offset into the middle of that
@ -779,7 +795,7 @@ static void prepare_packed_git_one(char *objdir, int local)
if (!has_extension(de->d_name, ".idx"))
continue;
/* we have .idx. Is it a file we can map? */
/* Don't reopen a pack we already have. */
strcpy(path + len, de->d_name);
for (p = packed_git; p; p = p->next) {
if (!memcmp(path, p->pack_name, len + namelen - 4))
@ -787,11 +803,13 @@ static void prepare_packed_git_one(char *objdir, int local)
}
if (p)
continue;
/* See if it really is a valid .idx file with corresponding
* .pack file that we can map.
*/
p = add_packed_git(path, len + namelen, local);
if (!p)
continue;
p->next = packed_git;
packed_git = p;
install_packed_git(p);
}
closedir(dir);
}
@ -1145,7 +1163,7 @@ static unsigned long unpack_object_header(struct packed_git *p,
/* use_pack() assures us we have [base, base + 20) available
* as a range that we can look at at. (Its actually the hash
* size that is assurred.) With our object header encoding
* size that is assured.) With our object header encoding
* the maximum deflated object size is 2^137, which is just
* insane, so we know won't exceed what we have been given.
*/
@ -1405,6 +1423,18 @@ static int find_pack_entry(const unsigned char *sha1, struct pack_entry *e, cons
}
offset = find_pack_entry_one(sha1, p);
if (offset) {
/*
* We are about to tell the caller where they can
* locate the requested object. We better make
* sure the packfile is still here and can be
* accessed before supplying that answer, as
* it may have been deleted since the index
* was loaded!
*/
if (p->pack_fd == -1 && open_packed_git(p)) {
error("packfile %s cannot be accessed", p->pack_name);
continue;
}
e->offset = offset;
e->p = p;
hashcpy(e->sha1, sha1);

View file

@ -279,7 +279,7 @@ static int get_sha1_basic(const char *str, int len, unsigned char *sha1)
/* basic@{time or number} format to query ref-log */
reflog_len = at = 0;
if (str[len-1] == '}') {
for (at = 1; at < len - 1; at++) {
for (at = 0; at < len - 1; at++) {
if (str[at] == '@' && str[at+1] == '{') {
reflog_len = (len-1) - (at+2);
len = at;
@ -289,10 +289,14 @@ static int get_sha1_basic(const char *str, int len, unsigned char *sha1)
}
/* Accept only unambiguous ref paths. */
if (ambiguous_path(str, len))
if (len && ambiguous_path(str, len))
return -1;
refs_found = dwim_ref(str, len, sha1, &real_ref);
if (!len && reflog_len) {
/* allow "@{...}" to mean the current branch reflog */
refs_found = dwim_ref("HEAD", 4, sha1, &real_ref);
} else
refs_found = dwim_ref(str, len, sha1, &real_ref);
if (!refs_found)
return -1;
@ -301,12 +305,27 @@ static int get_sha1_basic(const char *str, int len, unsigned char *sha1)
fprintf(stderr, warning, len, str);
if (reflog_len) {
/* Is it asking for N-th entry, or approxidate? */
int nth, i;
unsigned long at_time;
unsigned long co_time;
int co_tz, co_cnt;
/*
* We'll have an independent reflog for "HEAD" eventually
* which won't be a synonym for the current branch reflog.
* In the mean time prevent people from getting used to
* such a synonym until the work is completed.
*/
if (len && !strncmp("HEAD", str, len) &&
!strncmp(real_ref, "refs/", 5)) {
error("reflog for HEAD has not been implemented yet\n"
"Maybe you could try %s%s instead, "
"or just %s for current branch..",
strchr(real_ref+5, '/')+1, str+len, str+len);
exit(-1);
}
/* Is it asking for N-th entry, or approxidate? */
for (i = nth = 0; 0 <= nth && i < reflog_len; i++) {
char ch = str[at+2+i];
if ('0' <= ch && ch <= '9')

View file

@ -87,7 +87,7 @@ test_expect_success 'three-way not complaining on an untracked path in both' '
git-read-tree -m -u branch-point master side
'
test_expect_success 'three-way not cloberring a working tree file' '
test_expect_success 'three-way not clobbering a working tree file' '
git reset --hard &&
rm -f file2 subdir/file2 file3 subdir/file3 &&

View file

@ -106,21 +106,21 @@ test_expect_success 'read-tree' '
cmp ../one ../original.one
'
test_expect_success 'no file/rev ambuguity check inside .git' '
test_expect_success 'no file/rev ambiguity check inside .git' '
cd $HERE &&
git commit -a -m 1 &&
cd $HERE/.git &&
git show -s HEAD
'
test_expect_success 'no file/rev ambuguity check inside a bare repo' '
test_expect_success 'no file/rev ambiguity check inside a bare repo' '
cd $HERE &&
git clone -s --bare .git foo.git &&
cd foo.git && GIT_DIR=. git show -s HEAD
'
# This still does not work as it should...
: test_expect_success 'no file/rev ambuguity check inside a bare repo' '
: test_expect_success 'no file/rev ambiguity check inside a bare repo' '
cd $HERE &&
git clone -s --bare .git foo.git &&
cd foo.git && git show -s HEAD

View file

@ -3,13 +3,13 @@
# Copyright (c) 2005 Johannes Schindelin
#
test_description='Test git-repo-config in different settings'
test_description='Test git-config in different settings'
. ./test-lib.sh
test -f .git/config && rm .git/config
git-repo-config core.penguin "little blue"
git-config core.penguin "little blue"
cat > expect << EOF
[core]
@ -18,7 +18,7 @@ EOF
test_expect_success 'initial' 'cmp .git/config expect'
git-repo-config Core.Movie BadPhysics
git-config Core.Movie BadPhysics
cat > expect << EOF
[core]
@ -28,7 +28,7 @@ EOF
test_expect_success 'mixed case' 'cmp .git/config expect'
git-repo-config Cores.WhatEver Second
git-config Cores.WhatEver Second
cat > expect << EOF
[core]
@ -40,7 +40,7 @@ EOF
test_expect_success 'similar section' 'cmp .git/config expect'
git-repo-config CORE.UPPERCASE true
git-config CORE.UPPERCASE true
cat > expect << EOF
[core]
@ -54,10 +54,10 @@ EOF
test_expect_success 'similar section' 'cmp .git/config expect'
test_expect_success 'replace with non-match' \
'git-repo-config core.penguin kingpin !blue'
'git-config core.penguin kingpin !blue'
test_expect_success 'replace with non-match (actually matching)' \
'git-repo-config core.penguin "very blue" !kingpin'
'git-config core.penguin "very blue" !kingpin'
cat > expect << EOF
[core]
@ -86,7 +86,7 @@ EOF
cp .git/config .git/config2
test_expect_success 'multiple unset' \
'git-repo-config --unset-all beta.haha'
'git-config --unset-all beta.haha'
cat > expect << EOF
[beta] ; silly comment # another comment
@ -102,7 +102,7 @@ test_expect_success 'multiple unset is correct' 'cmp .git/config expect'
mv .git/config2 .git/config
test_expect_success '--replace-all' \
'git-repo-config --replace-all beta.haha gamma'
'git-config --replace-all beta.haha gamma'
cat > expect << EOF
[beta] ; silly comment # another comment
@ -116,7 +116,7 @@ EOF
test_expect_success 'all replaced' 'cmp .git/config expect'
git-repo-config beta.haha alpha
git-config beta.haha alpha
cat > expect << EOF
[beta] ; silly comment # another comment
@ -130,7 +130,7 @@ EOF
test_expect_success 'really mean test' 'cmp .git/config expect'
git-repo-config nextsection.nonewline wow
git-config nextsection.nonewline wow
cat > expect << EOF
[beta] ; silly comment # another comment
@ -145,8 +145,8 @@ EOF
test_expect_success 'really really mean test' 'cmp .git/config expect'
test_expect_success 'get value' 'test alpha = $(git-repo-config beta.haha)'
git-repo-config --unset beta.haha
test_expect_success 'get value' 'test alpha = $(git-config beta.haha)'
git-config --unset beta.haha
cat > expect << EOF
[beta] ; silly comment # another comment
@ -160,7 +160,7 @@ EOF
test_expect_success 'unset' 'cmp .git/config expect'
git-repo-config nextsection.NoNewLine "wow2 for me" "for me$"
git-config nextsection.NoNewLine "wow2 for me" "for me$"
cat > expect << EOF
[beta] ; silly comment # another comment
@ -176,18 +176,18 @@ EOF
test_expect_success 'multivar' 'cmp .git/config expect'
test_expect_success 'non-match' \
'git-repo-config --get nextsection.nonewline !for'
'git-config --get nextsection.nonewline !for'
test_expect_success 'non-match value' \
'test wow = $(git-repo-config --get nextsection.nonewline !for)'
'test wow = $(git-config --get nextsection.nonewline !for)'
test_expect_failure 'ambiguous get' \
'git-repo-config --get nextsection.nonewline'
'git-config --get nextsection.nonewline'
test_expect_success 'get multivar' \
'git-repo-config --get-all nextsection.nonewline'
'git-config --get-all nextsection.nonewline'
git-repo-config nextsection.nonewline "wow3" "wow$"
git-config nextsection.nonewline "wow3" "wow$"
cat > expect << EOF
[beta] ; silly comment # another comment
@ -202,15 +202,15 @@ EOF
test_expect_success 'multivar replace' 'cmp .git/config expect'
test_expect_failure 'ambiguous value' 'git-repo-config nextsection.nonewline'
test_expect_failure 'ambiguous value' 'git-config nextsection.nonewline'
test_expect_failure 'ambiguous unset' \
'git-repo-config --unset nextsection.nonewline'
'git-config --unset nextsection.nonewline'
test_expect_failure 'invalid unset' \
'git-repo-config --unset somesection.nonewline'
'git-config --unset somesection.nonewline'
git-repo-config --unset nextsection.nonewline "wow3$"
git-config --unset nextsection.nonewline "wow3$"
cat > expect << EOF
[beta] ; silly comment # another comment
@ -224,12 +224,12 @@ EOF
test_expect_success 'multivar unset' 'cmp .git/config expect'
test_expect_failure 'invalid key' 'git-repo-config inval.2key blabla'
test_expect_failure 'invalid key' 'git-config inval.2key blabla'
test_expect_success 'correct key' 'git-repo-config 123456.a123 987'
test_expect_success 'correct key' 'git-config 123456.a123 987'
test_expect_success 'hierarchical section' \
'git-repo-config Version.1.2.3eX.Alpha beta'
'git-config Version.1.2.3eX.Alpha beta'
cat > expect << EOF
[beta] ; silly comment # another comment
@ -255,7 +255,7 @@ version.1.2.3eX.alpha=beta
EOF
test_expect_success 'working --list' \
'git-repo-config --list > output && cmp output expect'
'git-config --list > output && cmp output expect'
cat > expect << EOF
beta.noindent sillyValue
@ -263,9 +263,9 @@ nextsection.nonewline wow2 for me
EOF
test_expect_success '--get-regexp' \
'git-repo-config --get-regexp in > output && cmp output expect'
'git-config --get-regexp in > output && cmp output expect'
git-repo-config --add nextsection.nonewline "wow4 for you"
git-config --add nextsection.nonewline "wow4 for you"
cat > expect << EOF
wow2 for me
@ -273,7 +273,7 @@ wow4 for you
EOF
test_expect_success '--add' \
'git-repo-config --get-all nextsection.nonewline > output && cmp output expect'
'git-config --get-all nextsection.nonewline > output && cmp output expect'
cat > .git/config << EOF
[novalue]
@ -281,9 +281,9 @@ cat > .git/config << EOF
EOF
test_expect_success 'get variable with no value' \
'git-repo-config --get novalue.variable ^$'
'git-config --get novalue.variable ^$'
git-repo-config > output 2>&1
git-config > output 2>&1
test_expect_success 'no arguments, but no crash' \
"test $? = 129 && grep usage output"
@ -293,7 +293,7 @@ cat > .git/config << EOF
c = d
EOF
git-repo-config a.x y
git-config a.x y
cat > expect << EOF
[a.b]
@ -304,8 +304,8 @@ EOF
test_expect_success 'new section is partial match of another' 'cmp .git/config expect'
git-repo-config b.x y
git-repo-config a.b c
git-config b.x y
git-config a.b c
cat > expect << EOF
[a.b]
@ -328,11 +328,11 @@ cat > expect << EOF
ein.bahn=strasse
EOF
GIT_CONFIG=other-config git-repo-config -l > output
GIT_CONFIG=other-config git-config -l > output
test_expect_success 'alternative GIT_CONFIG' 'cmp output expect'
GIT_CONFIG=other-config git-repo-config anwohner.park ausweis
GIT_CONFIG=other-config git-config anwohner.park ausweis
cat > expect << EOF
[ein]
@ -355,7 +355,7 @@ weird
EOF
test_expect_success "rename section" \
"git-repo-config --rename-section branch.eins branch.zwei"
"git-config --rename-section branch.eins branch.zwei"
cat > expect << EOF
# Hallo
@ -371,12 +371,12 @@ EOF
test_expect_success "rename succeeded" "diff -u expect .git/config"
test_expect_failure "rename non-existing section" \
'git-repo-config --rename-section branch."world domination" branch.drei'
'git-config --rename-section branch."world domination" branch.drei'
test_expect_success "rename succeeded" "diff -u expect .git/config"
test_expect_success "rename another section" \
'git-repo-config --rename-section branch."1 234 blabl/a" branch.drei'
'git-config --rename-section branch."1 234 blabl/a" branch.drei'
cat > expect << EOF
# Hallo
@ -393,20 +393,20 @@ test_expect_success "rename succeeded" "diff -u expect .git/config"
test_expect_success numbers '
git-repo-config kilo.gram 1k &&
git-repo-config mega.ton 1m &&
k=$(git-repo-config --int --get kilo.gram) &&
git-config kilo.gram 1k &&
git-config mega.ton 1m &&
k=$(git-config --int --get kilo.gram) &&
test z1024 = "z$k" &&
m=$(git-repo-config --int --get mega.ton) &&
m=$(git-config --int --get mega.ton) &&
test z1048576 = "z$m"
'
rm .git/config
git-repo-config quote.leading " test"
git-repo-config quote.ending "test "
git-repo-config quote.semicolon "test;test"
git-repo-config quote.hash "test#test"
git-config quote.leading " test"
git-config quote.ending "test "
git-config quote.semicolon "test;test"
git-config quote.hash "test#test"
cat > expect << EOF
[quote]
@ -418,10 +418,10 @@ EOF
test_expect_success 'quoting' 'cmp .git/config expect'
test_expect_failure 'key with newline' 'git repo-config key.with\\\
test_expect_failure 'key with newline' 'git config key.with\\\
newline 123'
test_expect_success 'value with newline' 'git repo-config key.sub value.with\\\
test_expect_success 'value with newline' 'git config key.sub value.with\\\
newline'
cat > .git/config <<\EOF
@ -440,7 +440,7 @@ section.noncont=not continued
section.quotecont=cont;inued
EOF
git repo-config --list > result
git config --list > result
test_expect_success 'value continued on next line' 'cmp result expect'

View file

@ -93,8 +93,8 @@ rm -rf .git/$m .git/logs expect
test_expect_success \
'enable core.logAllRefUpdates' \
'git-repo-config core.logAllRefUpdates true &&
test true = $(git-repo-config --bool --get core.logAllRefUpdates)'
'git-config core.logAllRefUpdates true &&
test true = $(git-config --bool --get core.logAllRefUpdates)'
test_expect_success \
"create $m (logged by config)" \

View file

@ -20,7 +20,7 @@ check_have () {
}
check_fsck () {
output=$(git fsck-objects --full)
output=$(git fsck --full)
case "$1" in
'')
test -z "$output" ;;
@ -71,7 +71,7 @@ test_expect_success setup '
check_fsck &&
chmod +x C &&
( test "`git repo-config --bool core.filemode`" != false ||
( test "`git config --bool core.filemode`" != false ||
echo executable >>C ) &&
git add C &&
test_tick && git commit -m dragon &&

View file

@ -94,7 +94,7 @@ test_expect_failure \
git-branch r &&
git-branch -m q r/q'
git-repo-config branch.s/s.dummy Hello
git-config branch.s/s.dummy Hello
test_expect_success \
'git branch -m s/s s should work when s/t is deleted' \
@ -107,8 +107,8 @@ test_expect_success \
test -f .git/logs/refs/heads/s'
test_expect_success 'config information was renamed, too' \
"test $(git-repo-config branch.s.dummy) = Hello &&
! git-repo-config branch.s/s/dummy"
"test $(git-config branch.s.dummy) = Hello &&
! git-config branch.s/s/dummy"
test_expect_failure \
'git-branch -m u v should fail when the reflog for u is a symlink' \

Some files were not shown because too many files have changed in this diff Show more