зеркало из https://github.com/microsoft/git.git
Merge branch 'maint'
* maint: Update draft release notes for 1.5.0.1 Convert update-index references in docs to add. Attempt to improve git-rebase lead-in description. Do not take mode bits from index after type change. git-blame: prevent argument parsing segfault Make gitk save and restore window pane position on Linux and Cygwin. Make gitk save and restore the user set window position. [PATCH] gitk: Use show-ref instead of ls-remote [PATCH] Make gitk work reasonably well on Cygwin. [PATCH] gitk - remove trailing whitespace from a few lines. Change git repo-config to git config
This commit is contained in:
Коммит
69bc0e22d3
|
@ -7,14 +7,31 @@ Fixes since v1.5.0
|
|||
* Documentation updates
|
||||
|
||||
- Clarifications and corrections to 1.5.0 release notes.
|
||||
|
||||
- The main documentation did not link to git-remote documentation.
|
||||
|
||||
- Clarified introductory text of git-rebase documentation.
|
||||
|
||||
- Converted remaining mentions of update-index on Porcelain
|
||||
documents to git-add/git-rm.
|
||||
|
||||
* Bugfixes
|
||||
|
||||
- git-daemon marks the listening sockets with FD_CLOEXEC so
|
||||
that it won't be leaked into the children.
|
||||
|
||||
- segfault from git-blame when the mandatory pathname
|
||||
parameter was missing was fixed; usage() message is given
|
||||
instead.
|
||||
|
||||
* Tweaks
|
||||
|
||||
- sliding mmap() inefficiently mmaped the same region of a
|
||||
packfile with an access pattern that used objects in the
|
||||
reverse order. This has been made more efficient.
|
||||
|
||||
--
|
||||
O=v1.5.0-7-g37b73cf
|
||||
exec >/var/tmp/1
|
||||
O=v1.5.0-24-g460ca30
|
||||
echo O=`git describe maint`
|
||||
git shortlog --no-merges $O..
|
||||
git shortlog --no-merges $O..maint
|
||||
|
|
|
@ -106,7 +106,8 @@ directory tree, and renaming a file does not change the object that
|
|||
file is associated with in any way.
|
||||
|
||||
A blob is typically created when gitlink:git-update-index[1]
|
||||
is run, and its data can be accessed by gitlink:git-cat-file[1].
|
||||
(or gitlink:git-add[1]) is run, and its data can be accessed by
|
||||
gitlink:git-cat-file[1].
|
||||
|
||||
Tree Object
|
||||
~~~~~~~~~~~
|
||||
|
|
|
@ -61,7 +61,8 @@ OPTIONS
|
|||
+
|
||||
When a merge conflict happens, the index entries for conflicting
|
||||
paths are left unmerged, and you need to resolve the conflicts
|
||||
and mark the resolved paths with `git update-index`.
|
||||
and mark the resolved paths with `git add` (or `git rm` if the merge
|
||||
should result in deletion of the path).
|
||||
|
||||
<new_branch>::
|
||||
Name for the new branch.
|
||||
|
@ -179,11 +180,11 @@ fatal: merge program failed
|
|||
At this point, `git diff` shows the changes cleanly merged as in
|
||||
the previous example, as well as the changes in the conflicted
|
||||
files. Edit and resolve the conflict and mark it resolved with
|
||||
`git update-index` as usual:
|
||||
`git add` as usual:
|
||||
+
|
||||
------------
|
||||
$ edit frotz
|
||||
$ git update-index frotz
|
||||
$ git add frotz
|
||||
------------
|
||||
|
||||
|
||||
|
|
|
@ -136,7 +136,7 @@ After seeing a conflict, you can do two things:
|
|||
|
||||
* Resolve the conflicts. `git-diff` would report only the
|
||||
conflicting paths because of the above 2. and 3.. Edit the
|
||||
working tree files into a desirable shape, `git-update-index`
|
||||
working tree files into a desirable shape, `git-add` or `git-rm`
|
||||
them, to make the index file contain what the merge result
|
||||
should be, and run `git-commit` to commit the result.
|
||||
|
||||
|
|
|
@ -13,11 +13,20 @@ SYNOPSIS
|
|||
|
||||
DESCRIPTION
|
||||
-----------
|
||||
git-rebase replaces <branch> with a new branch of the same name. When
|
||||
the --onto option is provided the new branch starts out with a HEAD equal
|
||||
to <newbase>, otherwise it is equal to <upstream>. It then attempts to
|
||||
create a new commit for each commit from the original <branch> that does
|
||||
not exist in the <upstream> branch.
|
||||
If <branch> is specified, git-rebase will perform an automatic
|
||||
`git checkout <branch>` before doing anything else. Otherwise
|
||||
it remains on the current branch.
|
||||
|
||||
All changes made by commits in the current branch but that are not
|
||||
in <upstream> are saved to a temporary area. This is the same set
|
||||
of commits that would be shown by `git log <upstream>..HEAD`.
|
||||
|
||||
The current branch is reset to <upstream>, or <newbase> if the
|
||||
--onto option was supplied. This has the exact same effect as
|
||||
`git reset --hard <upstream>` (or <newbase>).
|
||||
|
||||
The commits that were previously saved into the temporary area are
|
||||
then reapplied to the current branch, one by one, in order.
|
||||
|
||||
It is possible that a merge failure will prevent this process from being
|
||||
completely automatic. You will have to resolve any such merge failure
|
||||
|
@ -26,9 +35,6 @@ that caused the merge failure with `git rebase --skip`. To restore the
|
|||
original <branch> and remove the .dotest working files, use the command
|
||||
`git rebase --abort` instead.
|
||||
|
||||
Note that if <branch> is not specified on the command line, the currently
|
||||
checked out branch is used.
|
||||
|
||||
Assume the following history exists and the current branch is "topic":
|
||||
|
||||
------------
|
||||
|
@ -142,7 +148,7 @@ file you edit, you need to tell git that the conflict has been resolved,
|
|||
typically this would be done with
|
||||
|
||||
|
||||
git update-index <filename>
|
||||
git add <filename>
|
||||
|
||||
|
||||
After resolving the conflict manually and updating the index with the
|
||||
|
|
|
@ -163,8 +163,7 @@ If this three-way merge resolves cleanly, the result is written
|
|||
out to your working tree file, so you would not have to manually
|
||||
resolve it. Note that `git-rerere` leaves the index file alone,
|
||||
so you still need to do the final sanity checks with `git diff`
|
||||
(or `git diff -c`) and `git update-index` when you are
|
||||
satisfied.
|
||||
(or `git diff -c`) and `git add` when you are satisfied.
|
||||
|
||||
As a convenience measure, `git-merge` automatically invokes
|
||||
`git-rerere` when it exits with a failed automerge, which
|
||||
|
|
|
@ -94,11 +94,11 @@ current HEAD.
|
|||
<2> Rewind the master branch to get rid of those three commits.
|
||||
<3> Switch to "topic/wip" branch and keep working.
|
||||
|
||||
Undo update-index::
|
||||
Undo add::
|
||||
+
|
||||
------------
|
||||
$ edit <1>
|
||||
$ git-update-index frotz.c filfre.c
|
||||
$ git add frotz.c filfre.c
|
||||
$ mailx <2>
|
||||
$ git reset <3>
|
||||
$ git pull git://info.example.com/ nitfol <4>
|
||||
|
|
|
@ -16,7 +16,7 @@ DESCRIPTION
|
|||
Examines paths in the working tree that has changes unrecorded
|
||||
to the index file, and changes between the index file and the
|
||||
current HEAD commit. The former paths are what you _could_
|
||||
commit by running 'git-update-index' before running 'git
|
||||
commit by running 'git add' (or 'git rm' if you are deleting) before running 'git
|
||||
commit', and the latter paths are what you _would_ commit by
|
||||
running 'git commit'.
|
||||
|
||||
|
|
|
@ -15,7 +15,7 @@ DESCRIPTION
|
|||
Examines paths in the working tree that has changes unrecorded
|
||||
to the index file, and changes between the index file and the
|
||||
current HEAD commit. The former paths are what you _could_
|
||||
commit by running 'git-update-index' before running 'git
|
||||
commit by running 'git add' before running 'git
|
||||
commit', and the latter paths are what you _would_ commit by
|
||||
running 'git commit'.
|
||||
|
||||
|
|
|
@ -227,7 +227,7 @@ $ git diff
|
|||
@@ -1 +1,2 @@
|
||||
hello world!
|
||||
+hello world, again
|
||||
$ git update-index file.txt
|
||||
$ git add file.txt
|
||||
$ git diff
|
||||
------------------------------------------------
|
||||
|
||||
|
@ -260,7 +260,7 @@ hello world!
|
|||
hello world, again
|
||||
------------------------------------------------
|
||||
|
||||
So what our "git update-index" did was store a new blob and then put
|
||||
So what our "git add" did was store a new blob and then put
|
||||
a reference to it in the index file. If we modify the file again,
|
||||
we'll see that the new modifications are reflected in the "git-diff"
|
||||
output:
|
||||
|
|
|
@ -1988,7 +1988,7 @@ static int check_patch(struct patch *patch, struct patch *prev_patch)
|
|||
return error("%s: %s", old_name, strerror(errno));
|
||||
|
||||
if (!cached)
|
||||
st_mode = ntohl(create_ce_mode(st.st_mode));
|
||||
st_mode = ntohl(ce_mode_from_stat(ce, st.st_mode));
|
||||
|
||||
if (patch->is_new < 0)
|
||||
patch->is_new = 0;
|
||||
|
|
|
@ -2203,6 +2203,7 @@ int cmd_blame(int argc, const char **argv, const char *prefix)
|
|||
if (!strcmp(argv[j], "--"))
|
||||
seen_dashdash = j;
|
||||
if (seen_dashdash) {
|
||||
/* (2) */
|
||||
if (seen_dashdash + 1 != argc - 1)
|
||||
usage(blame_usage);
|
||||
path = add_prefix(prefix, argv[seen_dashdash + 1]);
|
||||
|
@ -2211,6 +2212,8 @@ int cmd_blame(int argc, const char **argv, const char *prefix)
|
|||
}
|
||||
else {
|
||||
/* (3) */
|
||||
if (argc <= i)
|
||||
usage(blame_usage);
|
||||
path = add_prefix(prefix, argv[i]);
|
||||
if (i + 1 == argc - 1) {
|
||||
final_commit_name = argv[i + 1];
|
||||
|
|
|
@ -109,16 +109,17 @@ static int add_file_to_cache(const char *path)
|
|||
ce->ce_flags = htons(namelen);
|
||||
fill_stat_cache_info(ce, &st);
|
||||
|
||||
if (trust_executable_bit)
|
||||
ce->ce_mode = create_ce_mode(st.st_mode);
|
||||
if (!trust_executable_bit) {
|
||||
else {
|
||||
/* If there is an existing entry, pick the mode bits
|
||||
* from it, otherwise assume unexecutable.
|
||||
*/
|
||||
struct cache_entry *ent;
|
||||
int pos = cache_name_pos(path, namelen);
|
||||
if (0 <= pos)
|
||||
ce->ce_mode = active_cache[pos]->ce_mode;
|
||||
else if (S_ISREG(st.st_mode))
|
||||
ce->ce_mode = create_ce_mode(S_IFREG | 0666);
|
||||
|
||||
ent = (0 <= pos) ? active_cache[pos] : NULL;
|
||||
ce->ce_mode = ce_mode_from_stat(ent, st.st_mode);
|
||||
}
|
||||
|
||||
if (index_path(ce->sha1, path, &st, !info_only))
|
||||
|
|
10
cache.h
10
cache.h
|
@ -106,6 +106,16 @@ static inline unsigned int create_ce_mode(unsigned int mode)
|
|||
return htonl(S_IFLNK);
|
||||
return htonl(S_IFREG | ce_permissions(mode));
|
||||
}
|
||||
static inline unsigned int ce_mode_from_stat(struct cache_entry *ce, unsigned int mode)
|
||||
{
|
||||
extern int trust_executable_bit;
|
||||
if (!trust_executable_bit && S_ISREG(mode)) {
|
||||
if (ce && S_ISREG(ntohl(ce->ce_mode)))
|
||||
return ce->ce_mode;
|
||||
return create_ce_mode(0666);
|
||||
}
|
||||
return create_ce_mode(mode);
|
||||
}
|
||||
#define canon_mode(mode) \
|
||||
(S_ISREG(mode) ? (S_IFREG | ce_permissions(mode)) : \
|
||||
S_ISLNK(mode) ? S_IFLNK : S_IFDIR)
|
||||
|
|
|
@ -170,9 +170,7 @@ static int get_stat_data(struct cache_entry *ce,
|
|||
}
|
||||
changed = ce_match_stat(ce, &st, 0);
|
||||
if (changed) {
|
||||
mode = create_ce_mode(st.st_mode);
|
||||
if (!trust_executable_bit && S_ISREG(st.st_mode))
|
||||
mode = ce->ce_mode;
|
||||
mode = ce_mode_from_stat(ce, st.st_mode);
|
||||
sha1 = no_sha1;
|
||||
}
|
||||
}
|
||||
|
|
11
read-cache.c
11
read-cache.c
|
@ -344,16 +344,17 @@ int add_file_to_index(const char *path, int verbose)
|
|||
ce->ce_flags = htons(namelen);
|
||||
fill_stat_cache_info(ce, &st);
|
||||
|
||||
if (trust_executable_bit)
|
||||
ce->ce_mode = create_ce_mode(st.st_mode);
|
||||
if (!trust_executable_bit) {
|
||||
else {
|
||||
/* If there is an existing entry, pick the mode bits
|
||||
* from it, otherwise assume unexecutable.
|
||||
*/
|
||||
struct cache_entry *ent;
|
||||
int pos = cache_name_pos(path, namelen);
|
||||
if (pos >= 0)
|
||||
ce->ce_mode = active_cache[pos]->ce_mode;
|
||||
else if (S_ISREG(st.st_mode))
|
||||
ce->ce_mode = create_ce_mode(S_IFREG | 0666);
|
||||
|
||||
ent = (0 <= pos) ? active_cache[pos] : NULL;
|
||||
ce->ce_mode = ce_mode_from_stat(ent, st.st_mode);
|
||||
}
|
||||
|
||||
if (index_path(ce->sha1, path, &st, 1))
|
||||
|
|
|
@ -30,6 +30,16 @@ test_expect_success \
|
|||
*) echo fail; git-ls-files --stage xfoo1; (exit 1);;
|
||||
esac'
|
||||
|
||||
test_expect_success 'git-add: filemode=0 should not get confused by symlink' '
|
||||
rm -f xfoo1 &&
|
||||
ln -s foo xfoo1 &&
|
||||
git-add xfoo1 &&
|
||||
case "`git-ls-files --stage xfoo1`" in
|
||||
120000" "*xfoo1) echo ok;;
|
||||
*) echo fail; git-ls-files --stage xfoo1; (exit 1);;
|
||||
esac
|
||||
'
|
||||
|
||||
test_expect_success \
|
||||
'git-update-index --add: Test that executable bit is not used...' \
|
||||
'git config core.filemode 0 &&
|
||||
|
@ -41,6 +51,16 @@ test_expect_success \
|
|||
*) echo fail; git-ls-files --stage xfoo2; (exit 1);;
|
||||
esac'
|
||||
|
||||
test_expect_success 'git-add: filemode=0 should not get confused by symlink' '
|
||||
rm -f xfoo2 &&
|
||||
ln -s foo xfoo2 &&
|
||||
git update-index --add xfoo2 &&
|
||||
case "`git-ls-files --stage xfoo2`" in
|
||||
120000" "*xfoo2) echo ok;;
|
||||
*) echo fail; git-ls-files --stage xfoo2; (exit 1);;
|
||||
esac
|
||||
'
|
||||
|
||||
test_expect_success \
|
||||
'git-update-index --add: Test that executable bit is not used...' \
|
||||
'git config core.filemode 0 &&
|
||||
|
|
Загрузка…
Ссылка в новой задаче