提交 b4a48be1 编写于 作者: J Jiang Xin

Merge tag 'v2.29.0-rc1' of github.com:git/git

Git 2.29-rc1

* tag 'v2.29.0-rc1' of github.com:git/git:
  Git 2.29-rc1
  doc: fix the bnf like style of some commands
  doc: git-remote fix ups
  doc: use linkgit macro where needed.
  git-bisect-lk2009: make continuation of list indented
  ci: do not skip tagged revisions in GitHub workflows
  ci: skip GitHub workflow runs for already-tested commits/trees
  tests: avoid using the branch name `main`
  t1415: avoid using `main` as ref name
  Makefile: ASCII-sort += lists
  help: do not expect built-in commands to be hardlinked
  index-pack: make get_base_data() comment clearer
  index-pack: drop type_cas mutex
  index-pack: restore "resolving deltas" progress meter
  compat/mingw.h: drop extern from function declaration
  GitHub workflow: automatically follow minor updates of setup-msbuild
  t5534: split stdout and stderr redirection
......@@ -9,7 +9,7 @@ jobs:
ci-config:
runs-on: ubuntu-latest
outputs:
enabled: ${{ steps.check-ref.outputs.enabled }}
enabled: ${{ steps.check-ref.outputs.enabled }}${{ steps.skip-if-redundant.outputs.enabled }}
steps:
- name: try to clone ci-config branch
run: |
......@@ -34,6 +34,43 @@ jobs:
enabled=no
fi
echo "::set-output name=enabled::$enabled"
- name: skip if the commit or tree was already tested
id: skip-if-redundant
uses: actions/github-script@v3
if: steps.check-ref.outputs.enabled == 'yes'
with:
github-token: ${{secrets.GITHUB_TOKEN}}
script: |
// Figure out workflow ID, commit and tree
const { data: run } = await github.actions.getWorkflowRun({
owner: context.repo.owner,
repo: context.repo.repo,
run_id: context.runId,
});
const workflow_id = run.workflow_id;
const head_sha = run.head_sha;
const tree_id = run.head_commit.tree_id;
// See whether there is a successful run for that commit or tree
const { data: runs } = await github.actions.listWorkflowRuns({
owner: context.repo.owner,
repo: context.repo.repo,
per_page: 500,
status: 'success',
workflow_id,
});
for (const run of runs.workflow_runs) {
if (head_sha === run.head_sha) {
core.warning(`Successful run for the commit ${head_sha}: ${run.html_url}`);
core.setOutput('enabled', ' but skip');
break;
}
if (tree_id === run.head_commit.tree_id) {
core.warning(`Successful run for the tree ${tree_id}: ${run.html_url}`);
core.setOutput('enabled', ' but skip');
break;
}
}
windows-build:
needs: ci-config
......@@ -154,7 +191,7 @@ jobs:
Expand-Archive compat.zip -DestinationPath . -Force
Remove-Item compat.zip
- name: add msbuild to PATH
uses: microsoft/setup-msbuild@v1.0.0
uses: microsoft/setup-msbuild@v1
- name: copy dlls to root
shell: powershell
run: |
......
......@@ -156,7 +156,7 @@ Performance, Internal Implementation, Development Support etc.
barrier to adoption.
* The final leg of SHA-256 transition plus doc updates. Note that
there is no inter-operability between SHA-1 and SHA-256
there is no interoperability between SHA-1 and SHA-256
repositories yet.
* CMake support to build with MSVC for Windows bypassing the Makefile.
......@@ -184,10 +184,6 @@ Performance, Internal Implementation, Development Support etc.
the ref backend in use, as its format is much richer than the
normal refs, and written directly by "git fetch" as a plain file..
* A handful of places in in-tree code still relied on being able to
execute the git subcommands, especially built-ins, in "git-foo"
form, which have been corrected.
* An unused binary has been discarded, and and a bunch of commands
have been turned into into built-in.
......@@ -216,10 +212,25 @@ Performance, Internal Implementation, Development Support etc.
* "diff-highlight" (in contrib/) had a logic to flush its output upon
seeing a blank line but the way it detected a blank line was broken.
* The logic to skip testing on the tagged commit and the tag itself
was not quite consistent which led to failure of Windows test
tasks. It has been revamped to consistently skip revisions that
have already been tested, based on the tree object of the revision.
Fixes since v2.28
-----------------
* The "mediawiki" remote backend which lives in contrib/mw-to-git/
and is not built with git by default, had an RCE bug allowing a
malicious MediaWiki server operator to inject arbitrary commands
for execution by a cloning client. This has been fixed.
The bug was discovered and reported by Joern Schneeweisz of GitLab
to the git-security mailing list. Its practical impact due to the
obscurity of git-remote-mediawiki was deemed small enough to forgo
a dedicated security release.
* "git clone --separate-git-dir=$elsewhere" used to stomp on the
contents of the existing directory $elsewhere, which has been
taught to fail when $elsewhere is not an empty directory.
......@@ -355,16 +366,13 @@ Fixes since v2.28
"git log --tags=no-tag-matches-this-pattern" does.
(merge 04a0e98515 jk/rev-input-given-fix later to maint).
* Various callers of run_command API has been modernized.
* Various callers of run_command API have been modernized.
(merge afbdba391e jc/run-command-use-embedded-args later to maint).
* List of options offered and accepted by "git add -i/-p" were
inconsistent, which have been corrected.
(merge ce910287e7 pw/add-p-allowed-options-fix later to maint).
* Various callers of run_command API has been modernized.
(merge afbdba391e jc/run-command-use-embedded-args later to maint).
* "git diff --stat -w" showed 0-line changes for paths whose changes
were only whitespaces, which was not intuitive. We now omit such
paths from the stat output.
......@@ -381,7 +389,7 @@ Fixes since v2.28
information (e.g. "@{u}" does not record what branch the user was
on hence which branch 'the upstream' needs to be computed, and even
if the record were available, the relationship between branches may
have changed), at least hide the error to allow "status" show its
have changed), at least hide the error and allow "status" to show its
output.
* "git status --short" quoted a path with SP in it when tracked, but
......@@ -398,7 +406,7 @@ Fixes since v2.28
(merge 378fe5fc3d mt/config-fail-nongit-early later to maint).
* There is a logic to estimate how many objects are in the
repository, which is mean to run once per process invocation, but
repository, which is meant to run once per process invocation, but
it ran every time the estimated value was requested.
(merge 67bb65de5d jk/dont-count-existing-objects-twice later to maint).
......@@ -411,8 +419,8 @@ Fixes since v2.28
which has been corrected.
(merge 4e735c1326 ar/fetch-ipversion-in-all later to maint).
* The "unshelve" subcommand of "git p4" used incorrectly used
commit^N where it meant to say commit~N to name the Nth generation
* The "unshelve" subcommand of "git p4" incorrectly used commit^N
where it meant to say commit~N to name the Nth generation
ancestor, which has been corrected.
(merge 0acbf5997f ld/p4-unshelve-fix later to maint).
......
......@@ -473,7 +473,7 @@ Z-Z
-------------
2) starting from the "good" ends of the graph, associate to each
commit the number of ancestors it has plus one
commit the number of ancestors it has plus one
For example with the following graph where H is the "bad" commit and A
and D are some parents of some "good" commits:
......@@ -514,7 +514,7 @@ D---E
-------------
4) the best bisection point is the commit with the highest associated
number
number
So in the above example the best bisection point is commit C.
......@@ -580,8 +580,8 @@ good or a bad commit does not give more or less information).
Let's also suppose that we have a cleaned up graph like one after step
1) in the bisection algorithm above. This means that we can measure
the information we get in terms of number of commit we can remove from
the graph..
the information we get in terms of number of commit we can remove
from the graph..
And let's take a commit X in the graph.
......@@ -689,18 +689,18 @@ roughly the following steps:
6) sort the commit by decreasing associated value
7) if the first commit has not been skipped, we can return it and stop
here
here
8) otherwise filter out all the skipped commits in the sorted list
9) use a pseudo random number generator (PRNG) to generate a random
number between 0 and 1
number between 0 and 1
10) multiply this random number with its square root to bias it toward
0
0
11) multiply the result by the number of commits in the filtered list
to get an index into this list
to get an index into this list
12) return the commit at the computed index
......
......@@ -209,7 +209,7 @@ providing this option will cause it to die.
Use \0 as the delimiter for pathnames in the output, and print
them verbatim. Without this option, pathnames with "unusual"
characters are quoted as explained for the configuration
variable core.quotePath (see git-config(1)).
variable core.quotePath (see linkgit:git-config[1]).
-o::
--only-matching::
......
......@@ -70,7 +70,7 @@ repository.
+
If this is reinitialization, the repository will be moved to the specified path.
-b <branch-name::
-b <branch-name>::
--initial-branch=<branch-name>::
Use the specified name for the initial branch in the newly created repository.
......
......@@ -10,7 +10,7 @@ SYNOPSIS
--------
[verse]
'git remote' [-v | --verbose]
'git remote add' [-t <branch>] [-m <master>] [-f] [--[no-]tags] [--mirror=<fetch|push>] <name> <url>
'git remote add' [-t <branch>] [-m <master>] [-f] [--[no-]tags] [--mirror=(fetch|push)] <name> <url>
'git remote rename' <old> <new>
'git remote remove' <name>
'git remote set-head' <name> (-a | --auto | -d | --delete | <branch>)
......@@ -35,7 +35,7 @@ OPTIONS
-v::
--verbose::
Be a little more verbose and show remote url after name.
NOTE: This must be placed between `remote` and `subcommand`.
NOTE: This must be placed between `remote` and subcommand.
COMMANDS
......@@ -46,7 +46,7 @@ subcommands are available to perform operations on the remotes.
'add'::
Adds a remote named <name> for the repository at
Add 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>.
+
......@@ -109,13 +109,13 @@ With `-d` or `--delete`, the symbolic ref `refs/remotes/<name>/HEAD` is deleted.
+
With `-a` or `--auto`, the remote is queried to determine its `HEAD`, then the
symbolic-ref `refs/remotes/<name>/HEAD` is set to the same branch. e.g., if the remote
`HEAD` is pointed at `next`, "`git remote set-head origin -a`" will set
`HEAD` is pointed at `next`, `git remote set-head origin -a` will set
the symbolic-ref `refs/remotes/origin/HEAD` to `refs/remotes/origin/next`. This will
only work if `refs/remotes/origin/next` already exists; if not it must be
fetched first.
+
Use `<branch>` to set the symbolic-ref `refs/remotes/<name>/HEAD` explicitly. e.g., "git
remote set-head origin master" will set the symbolic-ref `refs/remotes/origin/HEAD` to
Use `<branch>` to set the symbolic-ref `refs/remotes/<name>/HEAD` explicitly. e.g., `git
remote set-head origin master` will set the symbolic-ref `refs/remotes/origin/HEAD` to
`refs/remotes/origin/master`. This will only work if
`refs/remotes/origin/master` already exists; if not it must be fetched first.
+
......@@ -127,7 +127,7 @@ This can be used to track a subset of the available remote branches
after the initial setup for a remote.
+
The named branches will be interpreted as if specified with the
`-t` option on the 'git remote add' command line.
`-t` option on the `git remote add` command line.
+
With `--add`, instead of replacing the list of currently tracked
branches, adds to that list.
......@@ -181,16 +181,16 @@ fetch --prune <name>`, except that no new references will be fetched.
See the PRUNING section of linkgit:git-fetch[1] for what it'll prune
depending on various configuration.
+
With `--dry-run` option, report what branches will be pruned, but do not
With `--dry-run` option, report what branches would be pruned, but do not
actually prune them.
'update'::
Fetch updates for remotes or remote groups in the repository as defined by
remotes.<group>. If neither group nor remote is specified on the command line,
`remotes.<group>`. If neither group nor remote is specified on the command line,
the configuration parameter remotes.default will be used; if
remotes.default is not defined, all remotes which do not have the
configuration parameter remote.<name>.skipDefaultUpdate set to true will
configuration parameter `remote.<name>.skipDefaultUpdate` set to true will
be updated. (See linkgit:git-config[1]).
+
With `--prune` option, run pruning against all the remotes that are updated.
......
#!/bin/sh
GVF=GIT-VERSION-FILE
DEF_VER=v2.29.0-rc0
DEF_VER=v2.29.0-rc1
LF='
'
......
......@@ -820,8 +820,8 @@ TEST_SHELL_PATH = $(SHELL_PATH)
LIB_FILE = libgit.a
XDIFF_LIB = xdiff/lib.a
GENERATED_H += config-list.h
GENERATED_H += command-list.h
GENERATED_H += config-list.h
LIB_H := $(sort $(patsubst ./%,%,$(shell git ls-files '*.h' ':!t/' ':!Documentation/' 2>/dev/null || \
$(FIND) . \
......@@ -998,9 +998,9 @@ LIB_OBJS += sigchain.o
LIB_OBJS += split-index.o
LIB_OBJS += stable-qsort.o
LIB_OBJS += strbuf.o
LIB_OBJS += strvec.o
LIB_OBJS += streaming.o
LIB_OBJS += string-list.o
LIB_OBJS += strvec.o
LIB_OBJS += sub-process.o
LIB_OBJS += submodule-config.o
LIB_OBJS += submodule.o
......@@ -1066,15 +1066,15 @@ BUILTIN_OBJS += builtin/checkout-index.o
BUILTIN_OBJS += builtin/checkout.o
BUILTIN_OBJS += builtin/clean.o
BUILTIN_OBJS += builtin/clone.o
BUILTIN_OBJS += builtin/credential-cache.o
BUILTIN_OBJS += builtin/credential-cache--daemon.o
BUILTIN_OBJS += builtin/credential-store.o
BUILTIN_OBJS += builtin/column.o
BUILTIN_OBJS += builtin/commit-graph.o
BUILTIN_OBJS += builtin/commit-tree.o
BUILTIN_OBJS += builtin/commit.o
BUILTIN_OBJS += builtin/config.o
BUILTIN_OBJS += builtin/count-objects.o
BUILTIN_OBJS += builtin/credential-cache--daemon.o
BUILTIN_OBJS += builtin/credential-cache.o
BUILTIN_OBJS += builtin/credential-store.o
BUILTIN_OBJS += builtin/credential.o
BUILTIN_OBJS += builtin/describe.o
BUILTIN_OBJS += builtin/diff-files.o
......
......@@ -159,10 +159,6 @@ static pthread_mutex_t deepest_delta_mutex;
#define deepest_delta_lock() lock_mutex(&deepest_delta_mutex)
#define deepest_delta_unlock() unlock_mutex(&deepest_delta_mutex)
static pthread_mutex_t type_cas_mutex;
#define type_cas_lock() lock_mutex(&type_cas_mutex)
#define type_cas_unlock() unlock_mutex(&type_cas_mutex)
static pthread_key_t key;
static inline void lock_mutex(pthread_mutex_t *mutex)
......@@ -186,7 +182,6 @@ static void init_thread(void)
init_recursive_mutex(&read_mutex);
pthread_mutex_init(&counter_mutex, NULL);
pthread_mutex_init(&work_mutex, NULL);
pthread_mutex_init(&type_cas_mutex, NULL);
if (show_stat)
pthread_mutex_init(&deepest_delta_mutex, NULL);
pthread_key_create(&key, NULL);
......@@ -209,7 +204,6 @@ static void cleanup_thread(void)
pthread_mutex_destroy(&read_mutex);
pthread_mutex_destroy(&counter_mutex);
pthread_mutex_destroy(&work_mutex);
pthread_mutex_destroy(&type_cas_mutex);
if (show_stat)
pthread_mutex_destroy(&deepest_delta_mutex);
for (i = 0; i < nr_threads; i++)
......@@ -894,18 +888,15 @@ static void sha1_object(const void *data, struct object_entry *obj_entry,
}
/*
* Walk from current node up
* to top parent if necessary to deflate the node. In normal
* situation, its parent node would be already deflated, so it just
* needs to apply delta.
*
* In the worst case scenario, parent node is no longer deflated because
* we're running out of delta_base_cache_limit; we need to re-deflate
* parents, possibly up to the top base.
* Ensure that this node has been reconstructed and return its contents.
*
* All deflated objects here are subject to be freed if we exceed
* delta_base_cache_limit, just like in find_unresolved_deltas(), we
* just need to make sure the last node is not freed.
* In the typical and best case, this node would already be reconstructed
* (through the invocation to resolve_delta() in threaded_second_pass()) and it
* would not be pruned. However, if pruning of this node was necessary due to
* reaching delta_base_cache_limit, this function will find the closest
* ancestor with reconstructed data that has not been pruned (or if there is
* none, the ultimate base object), and reconstruct each node in the delta
* chain in order to generate the reconstructed data for this node.
*/
static void *get_base_data(struct base_data *c)
{
......@@ -1028,6 +1019,10 @@ static void *threaded_second_pass(void *data)
struct object_entry *child_obj;
struct base_data *child;
counter_lock();
display_progress(progress, nr_resolved_deltas);
counter_unlock();
work_lock();
if (list_empty(&work_head)) {
/*
......
......@@ -1308,7 +1308,7 @@ static int module_summary(int argc, const char **argv, const char *prefix)
};
const char *const git_submodule_helper_usage[] = {
N_("git submodule--helper summary [<options>] [commit] [--] [<path>]"),
N_("git submodule--helper summary [<options>] [<commit>] [--] [<path>]"),
NULL
};
......
......@@ -149,6 +149,7 @@ then
CI_REPO_SLUG="$GITHUB_REPOSITORY"
CI_JOB_ID="$GITHUB_RUN_ID"
CC="${CC:-gcc}"
DONT_SKIP_TAGS=t
cache_dir="$HOME/none"
......@@ -167,6 +168,7 @@ good_trees_file="$cache_dir/good-trees"
mkdir -p "$cache_dir"
test -n "${DONT_SKIP_TAGS-}" ||
skip_branch_tip_with_tag
skip_good_tree
......
......@@ -606,7 +606,7 @@ int main(int argc, const char **argv);
* Call this function to open a new MinTTY (this assumes you are in Git for
* Windows' SDK) with a GDB that attaches to the current process right away.
*/
extern void open_in_gdb(void);
void open_in_gdb(void);
/*
* Used by Pthread API implementation for Windows
......
......@@ -638,6 +638,25 @@ static void list_builtins(struct string_list *out, unsigned int exclude_option)
}
}
void load_builtin_commands(const char *prefix, struct cmdnames *cmds)
{
const char *name;
int i;
/*
* Callers can ask for a subset of the commands based on a certain
* prefix, which is then dropped from the added names. The names in
* the `commands[]` array do not have the `git-` prefix, though,
* therefore we must expect the `prefix` to at least start with `git-`.
*/
if (!skip_prefix(prefix, "git-", &prefix))
BUG("prefix '%s' must start with 'git-'", prefix);
for (i = 0; i < ARRAY_SIZE(commands); i++)
if (skip_prefix(commands[i].cmd, prefix, &name))
add_cmdname(cmds, name, strlen(name));
}
#ifdef STRIP_EXTENSION
static void strip_extension(const char **argv)
{
......
......@@ -263,6 +263,8 @@ void load_command_list(const char *prefix,
const char *env_path = getenv("PATH");
const char *exec_path = git_exec_path();
load_builtin_commands(prefix, main_cmds);
if (exec_path) {
list_commands_in_dir(main_cmds, exec_path, prefix);
QSORT(main_cmds->names, main_cmds->cnt, cmdname_compare);
......
......@@ -32,6 +32,7 @@ const char *help_unknown_cmd(const char *cmd);
void load_command_list(const char *prefix,
struct cmdnames *main_cmds,
struct cmdnames *other_cmds);
void load_builtin_commands(const char *prefix, struct cmdnames *cmds);
void add_cmdname(struct cmdnames *cmds, const char *name, int len);
/* Here we require that excludes is a sorted list. */
void exclude_cmds(struct cmdnames *cmds, struct cmdnames *excludes);
......
......@@ -76,24 +76,24 @@ test_expect_success 'reflog of worktrees/xx/HEAD' '
test_cmp expected actual.wt2
'
test_expect_success 'for-each-ref from main repo' '
test_expect_success 'for-each-ref from main worktree' '
mkdir fer1 &&
git -C fer1 init repo &&
test_commit -C fer1/repo initial &&
git -C fer1/repo worktree add ../second &&
git -C fer1/repo update-ref refs/bisect/main HEAD &&
git -C fer1/repo update-ref refs/rewritten/main HEAD &&
git -C fer1/repo update-ref refs/worktree/main HEAD &&
git -C fer1/repo for-each-ref --format="%(refname)" | grep main >actual &&
git -C fer1/repo update-ref refs/bisect/first HEAD &&
git -C fer1/repo update-ref refs/rewritten/first HEAD &&
git -C fer1/repo update-ref refs/worktree/first HEAD &&
git -C fer1/repo for-each-ref --format="%(refname)" | grep first >actual &&
cat >expected <<-\EOF &&
refs/bisect/main
refs/rewritten/main
refs/worktree/main
refs/bisect/first
refs/rewritten/first
refs/worktree/first
EOF
test_cmp expected actual
'
test_expect_success 'for-each-ref from linked repo' '
test_expect_success 'for-each-ref from linked worktree' '
mkdir fer2 &&
git -C fer2 init repo &&
test_commit -C fer2/repo initial &&
......
......@@ -277,4 +277,11 @@ test_expect_success 'index-pack --fsck-objects also warns upon missing tagger in
grep "^warning:.* expected .tagger. line" err
'
test_expect_success 'index-pack -v --stdin produces progress for both phases' '
pack=$(git pack-objects --all pack </dev/null) &&
GIT_PROGRESS_DELAY=0 git index-pack -v --stdin <pack-$pack.pack 2>err &&
test_i18ngrep "Receiving objects" err &&
test_i18ngrep "Resolving deltas" err
'
test_done
......@@ -282,10 +282,9 @@ test_expect_success GPG 'failed atomic push does not execute GPG' '
EOF
test_must_fail env PATH="$TRASH_DIRECTORY:$PATH" git push \
--signed --atomic --porcelain \
dst noop ff noff >out 2>&1 &&
dst noop ff noff >out 2>err &&
test_i18ngrep ! "gpg failed to sign" out &&
sed -n -e "/^To dst/,$ p" out >actual &&
test_i18ngrep ! "gpg failed to sign" err &&
cat >expect <<-EOF &&
To dst
= refs/heads/noop:refs/heads/noop [up to date]
......@@ -293,7 +292,7 @@ test_expect_success GPG 'failed atomic push does not execute GPG' '
! refs/heads/noff:refs/heads/noff [rejected] (non-fast-forward)
Done
EOF
test_i18ncmp expect actual
test_cmp expect out
'
test_done
......@@ -171,7 +171,7 @@ test_expect_success '--full-diff is not affected by --parents' '
test_expect_success 'rebuild repo' '
rm -rf .git * &&
git init &&
git switch -c main &&
git switch -c topic &&
echo base >file &&
git add file &&
......@@ -186,7 +186,7 @@ test_expect_success 'rebuild repo' '
git add file &&
test_commit B &&
git switch main &&
git switch topic &&
test_must_fail git merge -m "M" B &&
echo A >file &&
echo B >>file &&
......@@ -207,7 +207,7 @@ test_expect_success 'rebuild repo' '
git merge -m R -Xtheirs X &&
note R &&
git switch main &&
git switch topic &&
git merge -m N R &&
note N &&
......@@ -221,7 +221,7 @@ test_expect_success 'rebuild repo' '
git add z &&
test_commit Z &&
git switch main &&
git switch topic &&
git merge -m O Z &&
note O &&
......
......@@ -124,7 +124,7 @@ test_expect_success 'Simple merge in repo with interesting pathnames' '
git add . &&
git commit -m initial &&
git branch main &&
git branch topic &&
git branch other &&
git checkout other &&
......@@ -132,10 +132,10 @@ test_expect_success 'Simple merge in repo with interesting pathnames' '
git add -u &&
git commit -m other &&
git checkout main &&
echo main >foo/bar/baz &&
git checkout topic &&
echo topic >foo/bar/baz &&
git add -u &&
git commit -m main &&
git commit -m topic &&
git merge other &&
git ls-files -s >out &&
......
......@@ -35,11 +35,11 @@ test_expect_success 'setup branch sub' '
test_commit foo
'
test_expect_success 'setup branch main' '
git checkout -b main master &&
test_expect_success 'setup topic branch' '
git checkout -b topic master &&
git merge -s ours --no-commit --allow-unrelated-histories sub &&
git read-tree --prefix=dir/ -u sub &&
git commit -m "initial merge of sub into main" &&
git commit -m "initial merge of sub into topic" &&
test_path_is_file dir/foo.t &&
test_path_is_file hello
'
......@@ -49,9 +49,9 @@ test_expect_success 'update branch sub' '
test_commit bar
'
test_expect_success 'update branch main' '
git checkout main &&
git merge -s subtree sub -m "second merge of sub into main" &&
test_expect_success 'update topic branch' '
git checkout topic &&
git merge -s subtree sub -m "second merge of sub into topic" &&
test_path_is_file dir/bar.t &&
test_path_is_file dir/foo.t &&
test_path_is_file hello
......
......@@ -663,7 +663,7 @@ test_expect_failure 'merge-recursive rename vs. rename/symlink' '
test_expect_success 'merging with triple rename across D/F conflict' '
git reset --hard HEAD &&
git checkout -b main &&
git checkout -b topic &&
git rm -rf . &&
echo "just a file" >sub1 &&
......@@ -682,7 +682,7 @@ test_expect_success 'merging with triple rename across D/F conflict' '
test_tick &&
git commit -a -m changesimplefile &&
git checkout main &&
git checkout topic &&
git rm sub1 &&
git mv sub2 sub1 &&
test_tick &&
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册