# Show GIT link as: <command>(<section>); if section is defined, else just show
# the command.
+[attributes]
+caret=^
+
ifdef::backend-docbook[]
[gitlink-inlinemacro]
{0%{target}}
[gitlink-inlinemacro]
<a href="{target}.html">{target}{0?({0})}</a>
endif::backend-xhtml11[]
+
+
people think it's a bug in CVS that makes it tag (and check in changes)
one file at a time. So most projects you'll ever see will use CVS
'as if' it was sane. In which case you'll find it very easy indeed to
-move over to Git.
+move over to git.
First off: this is not a git tutorial. See
link:tutorial.html[Documentation/tutorial.txt] for how git
"o-file.c", it would find the commit that changed the statement
when it was in "o-file.c".
-NOTE: The current versions of "git-diff-tree -C" is not eager
+NOTE: The current version of "git-diff-tree -C" is not eager
enough to find copies, and it will miss the fact that a-file.c
was created by copying o-file.c unless o-file.c was somehow
changed in the same commit.
The output format from "git-diff-index", "git-diff-tree" and
"git-diff-files" are very similar.
-These commands all compare two sets of things; what are
-compared are different:
+These commands all compare two sets of things; what is
+compared differs:
git-diff-index <tree-ish>::
compares the <tree-ish> and the files on the filesystem.
. path for "dst"; only exists for C or R.
. an LF or a NUL when '-z' option is used, to terminate the record.
-<sha1> is shown as all 0's if new is a file on the filesystem
+<sha1> is shown as all 0's if a file is new on the filesystem
and it is out of sync with the cache.
Example:
where:
<old|new>-file:: are files GIT_EXTERNAL_DIFF can use to read the
- contents of <old|ne>,
+ contents of <old|new>,
<old|new>-hex:: are the 40-hexdigit SHA1 hashes,
<old|new>-mode:: are the octal representation of the file modes.
involved. Especially, even for a creation or a deletion,
`/dev/null` is _not_ used in place of `a/` or `b/` filenames.
+
-When rename/copy is involved, `file1` and `file2` shows the
+When rename/copy is involved, `file1` and `file2` show the
name of the source file of the rename/copy and the name of
the file that rename/copy produces, respectively.
-2. It is followed by extended header lines that are one or
- more of:
+2. It is followed by one or more extended header lines:
old mode <mode>
new mode <mode>
Synonym for "-p".
-r::
- Look recursively in subdirectories; this flag does not
- mean anything to commands other than "git-diff-tree";
- other diff commands always look at all the subdirectories.
+ Look recursively in subdirectories; only used by "git-diff-tree";
+ other diff commands always work recursively.
-z::
\0 line termination on output
Detect copies as well as renames.
--find-copies-harder::
- By default, -C option finds copies only if the original
- file of the copy was modified in the same changeset for
- performance reasons. This flag makes the command
+ For performance reasons, by default, -C option finds copies only
+ if the original file of the copy was modified in the same
+ changeset. This flag makes the command
inspect unmodified files as candidates for the source of
copy. This is a very expensive operation for large
projects, so use it with caution.
-l<num>::
-M and -C options require O(n^2) processing time where n
- in the number of potential rename/copy targets. This
+ is the number of potential rename/copy targets. This
option prevents rename/copy detection from running if
- the number of rename/copy targets exceed the specified
+ the number of rename/copy targets exceeds the specified
number.
-S<string>::
- Look for differences that contains the change in <string>.
+ Look for differences that contain the change in <string>.
--pickaxe-all::
When -S finds a change, show all the changes in that
- changeset, not just the files that contains the change
+ changeset, not just the files that contain the change
in <string>.
-O<orderfile>::
---------------------
This transformation is used to merge filepairs broken by
-diffcore-break, and were not transformed into rename/copy by
+diffcore-break, and not transformed into rename/copy by
diffcore-rename, back into a single modification. This always
runs when diffcore-break is used.
* -B/60 (the same as above, since diffcore-break defaults to 50%).
Note that earlier implementation left a broken pair as a separate
-creation and deletion patches. This was unnecessary hack and
+creation and deletion patches. This was an unnecessary hack and
the latest implementation always merges all the broken pairs
back into modifications, but the resulting patch output is
-formatted differently to still let the reviewing easier for such
+formatted differently for easier review in case of such
a complete rewrite by showing the entire contents of old version
prefixed with '-', followed by the entire contents of new
version prefixed with '+'.
DESCRIPTION
-----------
-A simple wrapper to git-update-index to add files to the cache for people used
+A simple wrapper for git-update-index to add files to the cache for people used
to do "cvs add".
OPTIONS
DESCRIPTION
-----------
-Reads supplied diff output and applies it on a GIT index file
+Reads supplied diff output and applies it on a git index file
and a work tree.
OPTIONS
-q::
Apply patches interactively. The user will be given
opportunity to edit the log message and the patch before
- attempting to apply patch in each e-mail message.
+ attempting to apply it.
-k::
Usually the program 'cleans up' the Subject: header line
as a merge whenever possible (see discussion below).
The script expects you to provide the key roots where it can start the import
-from an 'initial import' or 'tag' type of Arch commit. It will follow and import
-new branches within the provided roots.
+from an 'initial import' or 'tag' type of Arch commit. It will follow and
+import new branches within the provided roots.
It expects to be dealing with one project only. If it sees
-branches that have different roots, it will refuse to run. In that case, edit your
-<archive/branch> parameters to define clearly the scope of the import.
+branches that have different roots, it will refuse to run. In that case,
+edit your <archive/branch> parameters to define clearly the scope of the
+import.
-`git-archimport` uses `tla` extensively in the background to access the Arch repository.
+`git-archimport` uses `tla` extensively in the background to access the
+Arch repository.
Make sure you have a recent version of `tla` available in the path. `tla` must
know about the repositories you pass to `git-archimport`.
For the initial import `git-archimport` expects to find itself in an empty
directory. To follow the development of a project that uses Arch, rerun
-`git-archimport` with the same parameters as the initial import to perform incremental imports.
+`git-archimport` with the same parameters as the initial import to perform
+incremental imports.
MERGES
------
to see the currently remaining suspects in `gitk`.
-The good/bad you told the command is logged, and `git bisect
+The good/bad input is logged, and `git bisect
log` shows what you have done so far. You can truncate its
output somewhere and save it in a file, and run
The name of the branch to create.
start-point::
- Where to make the branch; defaults to HEAD.
+ Where to create the branch; defaults to HEAD.
Author
------
<type>::
Typically this matches the real type of <object> but asking
- for a type that can trivially dereferenced from the given
+ for a type that can trivially be dereferenced from the given
<object> is also permitted. An example is to ask for a
"tree" with <object> being a commit object that contains it,
or to ask for a "blob" with <object> being a tag object that
Commit to cherry-pick.
-r::
- Usuall the command appends which commit was
+ Usually the command appends which commit was
cherry-picked after the original commit message when
making a commit. This option, '--replay', causes it to
use the original commit message intact. This is useful
--exec=<git-upload-pack>::
Use this to specify the path to 'git-upload-pack' on the
- remote side, if is not found on your $PATH.
- Installations of sshd ignores the user's environment
+ remote side, if it is not found on your $PATH.
+ Installations of sshd ignore the user's environment
setup scripts for login shells (e.g. .bash_profile) and
your privately installed GIT may not be found on the system
default $PATH. Another workaround suggested is to set
An existing tree object
-p <parent commit>::
- Each '-p' indicates a the id of a parent commit object.
+ Each '-p' indicates the id of a parent commit object.
Commit Information
`git-diff-\*`).
--not::
- When showing object names, prefix them with '^' and
- strip '^' prefix from the object names that already have
+ When showing object names, prefix them with '{caret}' and
+ strip '{caret}' prefix from the object names that already have
one.
--symbolic::
Usually the object names are output in SHA1 form (with
- possible '^' prefix); this option makes them output in a
+ possible '{caret}' prefix); this option makes them output in a
form as close to the original input as possible.
happen to have both heads/master and tags/master, you can
explicitly say 'heads/master' to tell GIT which one you mean.
-* A suffix '^' to a revision parameter means the first parent of
- that commit object. '^<n>' means the <n>th parent (i.e.
- 'rev^'
- is equivalent to 'rev^1'). As a special rule,
- 'rev^0' means the commit itself and is used when 'rev' is the
+* 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}'
+ is equivalent to 'rev{caret}1'). As a special rule,
+ 'rev{caret}0' means the commit itself and is used when 'rev' is the
object name of a tag object that refers to a commit object.
* A suffix '~<n>' to a revision parameter means the commit
object that is the <n>th generation grand-parent of the named
commit object, following only the first parent. I.e. rev~3 is
- equivalent to rev^^^ which is equivalent to rev^1^1^1.
+ equivalent to rev{caret}{caret}{caret} which is equivalent to\
+ rev{caret}1{caret}1{caret}1.
-'git-rev-parse' also accepts a prefix '^' to revision parameter,
+'git-rev-parse' also accepts a prefix '{caret}' to revision parameter,
which is passed to 'git-rev-list'. Two revision parameters
concatenated with '..' is a short-hand for writing a range
-between them. I.e. 'r1..r2' is equivalent to saying '^r1 r2'
+between them. I.e. 'r1..r2' is equivalent to saying '{caret}r1 r2'
Author
struct ref *head = NULL, *head_ptr, *master_ref;
char *head_path;
+ /* Upload-pack must report HEAD first */
if (!strcmp(ref->name, "HEAD")) {
head = ref;
ref = ref->next;
while (ref) {
if (is_master(ref))
master_ref = ref;
- if (head && !memcmp(ref->old_sha1, head->old_sha1, 20)) {
- if (!head_ptr || ref == master_ref)
- head_ptr = ref;
- }
+ if (head &&
+ !memcmp(ref->old_sha1, head->old_sha1, 20) &&
+ !strncmp(ref->name, "refs/heads/",11) &&
+ (!head_ptr || ref == master_ref))
+ head_ptr = ref;
+
write_one_ref(ref);
ref = ref->next;
}
- if (!head)
+ if (!head) {
+ fprintf(stderr, "No HEAD in remote.\n");
return;
+ }
- head_path = git_path("HEAD");
+ head_path = strdup(git_path("HEAD"));
if (!head_ptr) {
/*
* If we had a master ref, and it wasn't HEAD, we need to undo the
unlink(head_path);
}
write_one_ref(head);
+ free(head_path);
return;
}
if (master_ref)
return;
+ fprintf(stderr, "Setting HEAD to %s\n", head_ptr->name);
+
/*
* Uhhuh. Other end didn't have master. We start HEAD off with
* the first branch with the same value.
*/
- unlink(head_path);
- if (symlink(head_ptr->name, head_path) < 0)
+ if (create_symref(head_path, head_ptr->name) < 0)
die("unable to link HEAD to %s", head_ptr->name);
+ free(head_path);
}
static int clone_pack(int fd[2], int nr_match, char **match)
/* these are not diff-raw status letters proper, but used by
* diffcore-filter insn to specify additional restrictions.
*/
-#define DIFF_STATUS_FILTER_AON 'A'
+#define DIFF_STATUS_FILTER_AON '*'
#define DIFF_STATUS_FILTER_BROKEN 'B'
#endif /* DIFF_H */
PARENTS=""
fi
git-status >>.editmsg
-if [ "$?" != "0" -a ! -f $GIT_DIR/MERGE_HEAD ]
+if [ "$?" != "0" -a ! -f "$GIT_DIR/MERGE_HEAD" ]
then
rm -f .editmsg
git-status
if test "" = "$append"
then
- : >$GIT_DIR/FETCH_HEAD
+ : >"$GIT_DIR/FETCH_HEAD"
fi
append_fetch_head () {
if git-cat-file commit "$head_" >/dev/null 2>&1
then
headc_=$(git-rev-parse --verify "$head_^0") || exit
- echo "$headc_ $not_for_merge_ $note_" >>$GIT_DIR/FETCH_HEAD
+ echo "$headc_ $not_for_merge_ $note_" >>"$GIT_DIR/FETCH_HEAD"
echo >&2 "* committish: $head_"
echo >&2 " $note_"
else
- echo "$head_ not-for-merge $note_" >>$GIT_DIR/FETCH_HEAD
+ echo "$head_ not-for-merge $note_" >>"$GIT_DIR/FETCH_HEAD"
echo >&2 "* non-commit: $head_"
echo >&2 " $note_"
fi
int hold_index_file_for_update(struct cache_file *cf, const char *path)
{
+ int fd;
sprintf(cf->lockfile, "%s.lock", path);
- cf->next = cache_file_list;
- cache_file_list = cf;
- if (!cf->next) {
+ fd = open(cf->lockfile, O_RDWR | O_CREAT | O_EXCL, 0666);
+ if (fd >=0 && !cf->next) {
+ cf->next = cache_file_list;
+ cache_file_list = cf;
signal(SIGINT, remove_lock_file_on_signal);
atexit(remove_lock_file);
}
- return open(cf->lockfile, O_RDWR | O_CREAT | O_EXCL, 0666);
+ return fd;
}
int commit_index_file(struct cache_file *cf)
len -= 4;
while (len && isspace(*buf))
buf++, len--;
- if (len >= 5 && !memcmp("refs/", buffer, 5))
+ if (len >= 5 && !memcmp("refs/", buf, 5))
return 0;
return -1;
}
#include "cache.h"
+#include "refs.h"
#include "tag.h"
#include "commit.h"
#include "tree.h"
commit_list_insert(com, lst);
}
+/* for_each_ref() callback does not allow user data -- Yuck. */
+static struct commit_list **global_lst;
+
+static int include_one_commit(const char *path, const unsigned char *sha1)
+{
+ struct commit *com = get_commit_reference(path, 0);
+ handle_one_commit(com, global_lst);
+ return 0;
+}
+
+static void handle_all(struct commit_list **lst)
+{
+ global_lst = lst;
+ for_each_ref(include_one_commit);
+ global_lst = NULL;
+}
int main(int argc, char **argv)
{
bisect_list = 1;
continue;
}
+ if (!strcmp(arg, "--all")) {
+ handle_all(&list);
+ continue;
+ }
if (!strcmp(arg, "--objects")) {
tag_objects = 1;
tree_objects = 1;
static int is_rev_argument(const char *arg)
{
static const char *rev_args[] = {
+ "--all",
"--bisect",
"--header",
"--max-age=",
if (!pid) {
int i;
- int args = nr_has + nr_needs + 5;
- char **argv = xmalloc(args * sizeof(char *));
- char *buf = xmalloc(args * 45);
- char **p = argv;
+ int args;
+ char **argv;
+ char *buf;
+ char **p;
+
+ if (MAX_NEEDS <= nr_needs)
+ args = nr_has + 10;
+ else
+ args = nr_has + nr_needs + 5;
+ argv = xmalloc(args * sizeof(char *));
+ buf = xmalloc(args * 45);
+ p = argv;
dup2(fd[1], 1);
close(0);
close(fd[1]);
*p++ = "git-rev-list";
*p++ = "--objects";
- for (i = 0; i < nr_needs; i++) {
- *p++ = buf;
- memcpy(buf, sha1_to_hex(needs_sha1[i]), 41);
- buf += 41;
+ if (MAX_NEEDS <= nr_needs)
+ *p++ = "--all";
+ else {
+ for (i = 0; i < nr_needs; i++) {
+ *p++ = buf;
+ memcpy(buf, sha1_to_hex(needs_sha1[i]), 41);
+ buf += 41;
+ }
}
for (i = 0; i < nr_has; i++) {
*p++ = buf;
needs = 0;
for (;;) {
+ unsigned char dummy[20], *sha1_buf;
len = packet_read_line(0, line, sizeof(line));
if (!len)
return needs;
- /*
- * This is purely theoretical right now: git-fetch-pack only
- * ever asks for a single HEAD
- */
- if (needs >= MAX_NEEDS)
- die("I'm only doing a max of %d requests", MAX_NEEDS);
- if (strncmp("want ", line, 5) || get_sha1_hex(line+5, needs_sha1[needs]))
- die("git-upload-pack: protocol error, expected to get sha, not '%s'", line);
+ sha1_buf = dummy;
+ if (needs == MAX_NEEDS) {
+ fprintf(stderr,
+ "warning: supporting only a max of %d requests. "
+ "sending everything instead.\n",
+ MAX_NEEDS);
+ }
+ else if (needs < MAX_NEEDS)
+ sha1_buf = needs_sha1[needs];
+
+ if (strncmp("want ", line, 5) || get_sha1_hex(line+5, sha1_buf))
+ die("git-upload-pack: protocol error, "
+ "expected to get sha, not '%s'", line);
needs++;
}
}