mirror of
https://github.com/git/git.git
synced 2024-11-24 02:17:02 +08:00
Merge branch 'maint'
* 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:
commit
ed287ab7fa
@ -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
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 */
|
||||
|
2
setup.c
2
setup.c
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user