* maint:
  git.el: Retrieve commit log information from .dotest directory.
  git.el: Avoid appending a signoff line that is already present.
  setup_git_directory_gently: fix off-by-one error
  user-manual: install user manual stylesheet with other web documents
  user-manual: fix rendering of history diagrams
  user-manual: fix missing colon in git-show example
  user-manual: fix inconsistent use of pull and merge
  user-manual: fix inconsistent example
  glossary: fix overoptimistic automatic linking of defined terms
  Documentation: s/seperator/separator/
  Adjust reflog filemode in shared repository
This commit is contained in:
Junio C Hamano 2007-03-10 22:07:26 -08:00
Родитель bd1fc628b8 60fa08ed61
Коммит ed287ab7fa
7 изменённых файлов: 100 добавлений и 48 удалений

Просмотреть файл

@ -462,7 +462,7 @@ in octal. Git only supports the following modes:
In both formats `<path>` is the complete path of the file to be added
(if not already existing) or modified (if already existing).
A `<path>` string must use UNIX-style directory seperators (forward
A `<path>` string must use UNIX-style directory separators (forward
slash `/`), may contain any byte other than `LF`, and must not
start with double quote (`"`).
@ -472,8 +472,8 @@ quoting should be used, e.g. `"path/with\n and \" in it"`.
The value of `<path>` must be in canoncial form. That is it must not:
* contain an empty directory component (e.g. `foo//bar` is invalid),
* end with a directory seperator (e.g. `foo/` is invalid),
* start with a directory seperator (e.g. `/foo` is invalid),
* end with a directory separator (e.g. `foo/` is invalid),
* start with a directory separator (e.g. `/foo` is invalid),
* contain the special component `.` or `..` (e.g. `foo/./bar` and
`foo/../bar` are invalid).

Просмотреть файл

@ -2,7 +2,7 @@
T="$1"
for h in *.html *.txt howto/*.txt howto/*.html RelNotes-*.txt
for h in *.html *.txt howto/*.txt howto/*.html RelNotes-*.txt *.css
do
if test -f "$T/$h" &&
diff -u -I'Last updated [0-9][0-9]-[A-Z][a-z][a-z]-' "$T/$h" "$h"

Просмотреть файл

@ -48,7 +48,7 @@ This list is sorted alphabetically:
';
@keys=sort {uc($a) cmp uc($b)} keys %terms;
$pattern='(\b(?<!link:git-)'.join('\b|\b(?<!link:git-)',reverse @keys).'\b)';
$pattern='(\b(?<!link:git-)'.join('\b|\b(?<!-)',reverse @keys).'\b)';
foreach $key (@keys) {
$terms{$key}=~s/$pattern/sprintf "<<ref_".no_spaces($1).",$1>>";/eg;
print '[[ref_'.no_spaces($key).']]'.$key."::\n"

Просмотреть файл

@ -437,11 +437,14 @@ We will sometimes represent git history using diagrams like the one
below. Commits are shown as "o", and the links between them with
lines drawn with - / and \. Time goes left to right:
................................................
o--o--o <-- Branch A
/
o--o--o <-- master
\
o--o--o <-- Branch B
................................................
If we need to talk about a particular commit, the character "o" may
be replaced with another letter or number.
@ -601,8 +604,8 @@ a new stanza:
$ cat .git/config
...
[remote "linux-nfs"]
url = git://linux-nfs.org/~bfields/git.git
fetch = +refs/heads/*:refs/remotes/linux-nfs-read/*
url = git://linux-nfs.org/pub/nfs-2.6.git
fetch = +refs/heads/*:refs/remotes/linux-nfs/*
...
-------------------------------------------------
@ -1133,17 +1136,9 @@ modified in two different ways in the remote branch and the local
branch--then you are warned; the output may look something like this:
-------------------------------------------------
$ git pull . next
Trying really trivial in-index merge...
fatal: Merge requires file-level merging
Nope.
Merging HEAD with 77976da35a11db4580b80ae27e8d65caf5208086
Merging:
15e2162 world
77976da goodbye
found 1 common ancestor(s):
d122ed4 initial
Auto-merging file.txt
$ git merge next
100% (4/4) done
Auto-merged file.txt
CONFLICT (content): Merge conflict in file.txt
Automatic merge failed; fix conflicts and then commit the result.
-------------------------------------------------
@ -1439,7 +1434,7 @@ modifying the working directory, you can do that with
gitlink:git-show[1]:
-------------------------------------------------
$ git show HEAD^ path/to/file
$ git show HEAD^:path/to/file
-------------------------------------------------
which will display the given version of the file.
@ -1936,25 +1931,29 @@ $ git commit
You have performed no merges into mywork, so it is just a simple linear
sequence of patches on top of "origin":
................................................
o--o--o <-- origin
\
o--o--o <-- mywork
................................................
Some more interesting work has been done in the upstream project, and
"origin" has advanced:
................................................
o--o--O--o--o--o <-- origin
\
a--b--c <-- mywork
................................................
At this point, you could use "pull" to merge your changes back in;
the result would create a new merge commit, like this:
................................................
o--o--O--o--o--o <-- origin
\ \
a--b--c--m <-- mywork
................................................
However, if you prefer to keep the history in mywork a simple series of
commits without any merges, you may instead choose to use
@ -1971,9 +1970,11 @@ point at the latest version of origin, then apply each of the saved
patches to the new mywork. The result will look like:
................................................
o--o--O--o--o--o <-- origin
\
a'--b'--c' <-- mywork
................................................
In the process, it may discover conflicts. In that case it will stop
and allow you to fix the conflicts; after fixing conflicts, use "git
@ -2081,24 +2082,30 @@ The primary problem with rewriting the history of a branch has to do
with merging. Suppose somebody fetches your branch and merges it into
their branch, with a result something like this:
................................................
o--o--O--o--o--o <-- origin
\ \
t--t--t--m <-- their branch:
................................................
Then suppose you modify the last three commits:
................................................
o--o--o <-- new head of origin
/
o--o--O--o--o--o <-- old head of origin
................................................
If we examined all this history together in one repository, it will
look like:
................................................
o--o--o <-- new head of origin
/
o--o--O--o--o--o <-- old head of origin
\ \
t--t--t--m <-- their branch:
................................................
Git has no way of knowing that the new head is an updated version of
the old head; it treats this situation exactly the same as it would if
@ -2159,9 +2166,11 @@ commit. Git calls this process a "fast forward".
A fast forward looks something like this:
................................................
o--o--o--o <-- old head of the branch
\
o--o--o <-- new head of the branch
................................................
In some cases it is possible that the new head will *not* actually be
@ -2169,11 +2178,11 @@ a descendant of the old head. For example, the developer may have
realized she made a serious mistake, and decided to backtrack,
resulting in a situation like:
................................................
o--o--o--o--a--b <-- old head of the branch
\
o--o--o <-- new head of the branch
................................................
In this case, "git fetch" will fail, and print out a warning.

Просмотреть файл

@ -891,36 +891,77 @@ and returns the process output as a string."
(with-current-buffer log-edit-parent-buffer
(git-get-filenames (git-marked-files-state 'added 'deleted 'modified))))
(defun git-append-sign-off (name email)
"Append a Signed-off-by entry to the current buffer, avoiding duplicates."
(let ((sign-off (format "Signed-off-by: %s <%s>" name email))
(case-fold-search t))
(goto-char (point-min))
(unless (re-search-forward (concat "^" (regexp-quote sign-off)) nil t)
(goto-char (point-min))
(unless (re-search-forward "^Signed-off-by: " nil t)
(setq sign-off (concat "\n" sign-off)))
(goto-char (point-max))
(insert sign-off "\n"))))
(defun git-setup-log-buffer (buffer &optional author-name author-email subject date msg)
"Setup the log buffer for a commit."
(unless git-status (error "Not in git-status buffer."))
(let ((merge-heads (git-get-merge-heads))
(dir default-directory)
(committer-name (git-get-committer-name))
(committer-email (git-get-committer-email))
(sign-off git-append-signed-off-by))
(with-current-buffer buffer
(cd dir)
(erase-buffer)
(insert
(propertize
(format "Author: %s <%s>\n%s%s"
(or author-name committer-name)
(or author-email committer-email)
(if date (format "Date: %s\n" date) "")
(if merge-heads
(format "Parent: %s\n%s\n"
(git-rev-parse "HEAD")
(mapconcat (lambda (str) (concat "Parent: " str)) merge-heads "\n"))
""))
'face 'git-header-face)
(propertize git-log-msg-separator 'face 'git-separator-face)
"\n")
(when subject (insert subject "\n\n"))
(cond (msg (insert msg "\n"))
((file-readable-p ".dotest/msg")
(insert-file-contents ".dotest/msg"))
((file-readable-p ".git/MERGE_MSG")
(insert-file-contents ".git/MERGE_MSG")))
; delete empty lines at end
(goto-char (point-min))
(when (re-search-forward "\n+\\'" nil t)
(replace-match "\n" t t))
(when sign-off (git-append-sign-off committer-name committer-email)))))
(defun git-commit-file ()
"Commit the marked file(s), asking for a commit message."
(interactive)
(unless git-status (error "Not in git-status buffer."))
(let ((buffer (get-buffer-create "*git-commit*"))
(merge-heads (git-get-merge-heads))
(dir default-directory)
(coding-system (git-get-commits-coding-system))
(sign-off git-append-signed-off-by))
(with-current-buffer buffer
(when (eq 0 (buffer-size))
(cd dir)
(erase-buffer)
(insert
(propertize
(format "Author: %s <%s>\n%s"
(git-get-committer-name) (git-get-committer-email)
(if merge-heads
(format "Parent: %s\n%s\n"
(git-rev-parse "HEAD")
(mapconcat (lambda (str) (concat "Parent: " str)) merge-heads "\n"))
""))
'face 'git-header-face)
(propertize git-log-msg-separator 'face 'git-separator-face)
"\n")
(cond ((file-readable-p ".git/MERGE_MSG")
(insert-file-contents ".git/MERGE_MSG"))
(sign-off
(insert (format "\n\nSigned-off-by: %s <%s>\n"
(git-get-committer-name) (git-get-committer-email)))))))
author-name author-email subject date)
(when (eq 0 (buffer-size buffer))
(when (file-readable-p ".dotest/info")
(with-temp-buffer
(insert-file-contents ".dotest/info")
(goto-char (point-min))
(when (re-search-forward "^Author: \\(.*\\)\nEmail: \\(.*\\)$" nil t)
(setq author-name (match-string 1))
(setq author-email (match-string 2)))
(goto-char (point-min))
(when (re-search-forward "^Subject: \\(.*\\)$" nil t)
(setq subject (match-string 1)))
(goto-char (point-min))
(when (re-search-forward "^Date: \\(.*\\)$" nil t)
(setq date (match-string 1)))))
(git-setup-log-buffer buffer author-name author-email subject date))
(log-edit #'git-do-commit nil #'git-log-edit-files buffer)
(setq font-lock-keywords (font-lock-compile-keywords git-log-edit-font-lock-keywords))
(setq buffer-file-coding-system coding-system)

2
refs.c
Просмотреть файл

@ -921,6 +921,8 @@ static int log_ref_write(const char *ref_name, const unsigned char *old_sha1,
log_file, strerror(errno));
}
adjust_shared_perm(log_file);
msglen = 0;
if (msg) {
/* clean up the message and make sure it is a single line */

Просмотреть файл

@ -216,7 +216,7 @@ const char *setup_git_directory_gently(int *nongit_ok)
die("Not a git repository: '%s'", gitdirenv);
}
if (!getcwd(cwd, sizeof(cwd)) || cwd[0] != '/')
if (!getcwd(cwd, sizeof(cwd)-1) || cwd[0] != '/')
die("Unable to read current working directory");
offset = len = strlen(cwd);