Merge branch 'master' of github.com:git/git
* 'master' of github.com:git/git: (762 commits) Git 2.34-rc0 wrapper: remove xunsetenv() log: document --encoding behavior on iconv() failure Revert "logmsg_reencode(): warn when iconv() fails" completion: fix incorrect bash/zsh string equality check add, rm, mv: fix bug that prevents the update of non-sparse dirs git-bundle.txt: add missing words and punctuation Documentation/Makefile: fix lint-docs mkdir dependency submodule: drop unused sm_name parameter from append_fetch_remotes() The fifteenth batch gitweb.txt: change "folder" to "directory" gitignore.txt: change "folder" to "directory" git-multi-pack-index.txt: change "folder" to "directory" git.txt: fix typo archive: describe compression level option config.txt: fix typo command-list.txt: remove 'sparse-index' from main help userdiff-cpp: back out the digit-separators in numbers submodule--helper: fix incorrect newlines in an error message branch (doc): -m/-c copies config and reflog ...
This commit is contained in:
commit
cd9ef9ce67
@ -2,8 +2,15 @@ env:
|
||||
CIRRUS_CLONE_DEPTH: 1
|
||||
|
||||
freebsd_12_task:
|
||||
env:
|
||||
GIT_PROVE_OPTS: "--timer --jobs 10"
|
||||
GIT_TEST_OPTS: "--no-chain-lint --no-bin-wrappers"
|
||||
MAKEFLAGS: "-j4"
|
||||
DEFAULT_TEST_TARGET: prove
|
||||
DEVELOPER: 1
|
||||
freebsd_instance:
|
||||
image: freebsd-12-1-release-amd64
|
||||
image_family: freebsd-12-2
|
||||
memory: 2G
|
||||
install_script:
|
||||
pkg install -y gettext gmake perl5
|
||||
create_user_script:
|
||||
|
105
.github/workflows/l10n.yml
vendored
Normal file
105
.github/workflows/l10n.yml
vendored
Normal file
@ -0,0 +1,105 @@
|
||||
name: git-l10n
|
||||
|
||||
on: [push, pull_request_target]
|
||||
|
||||
jobs:
|
||||
git-po-helper:
|
||||
if: >-
|
||||
endsWith(github.repository, '/git-po') ||
|
||||
contains(github.head_ref, 'l10n') ||
|
||||
contains(github.ref, 'l10n')
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
pull-requests: write
|
||||
steps:
|
||||
- name: Setup base and head objects
|
||||
id: setup-tips
|
||||
run: |
|
||||
if test "${{ github.event_name }}" = "pull_request_target"
|
||||
then
|
||||
base=${{ github.event.pull_request.base.sha }}
|
||||
head=${{ github.event.pull_request.head.sha }}
|
||||
else
|
||||
base=${{ github.event.before }}
|
||||
head=${{ github.event.after }}
|
||||
fi
|
||||
echo "::set-output name=base::$base"
|
||||
echo "::set-output name=head::$head"
|
||||
- name: Run partial clone
|
||||
run: |
|
||||
git -c init.defaultBranch=master init --bare .
|
||||
git remote add \
|
||||
--mirror=fetch \
|
||||
origin \
|
||||
https://github.com/${{ github.repository }}
|
||||
# Fetch tips that may be unreachable from github.ref:
|
||||
# - For a forced push, "$base" may be unreachable.
|
||||
# - For a "pull_request_target" event, "$head" may be unreachable.
|
||||
args=
|
||||
for commit in \
|
||||
${{ steps.setup-tips.outputs.base }} \
|
||||
${{ steps.setup-tips.outputs.head }}
|
||||
do
|
||||
case $commit in
|
||||
*[^0]*)
|
||||
args="$args $commit"
|
||||
;;
|
||||
*)
|
||||
# Should not fetch ZERO-OID.
|
||||
;;
|
||||
esac
|
||||
done
|
||||
git -c protocol.version=2 fetch \
|
||||
--progress \
|
||||
--no-tags \
|
||||
--no-write-fetch-head \
|
||||
--filter=blob:none \
|
||||
origin \
|
||||
${{ github.ref }} \
|
||||
$args
|
||||
- uses: actions/setup-go@v2
|
||||
with:
|
||||
go-version: '>=1.16'
|
||||
- name: Install git-po-helper
|
||||
run: go install github.com/git-l10n/git-po-helper@main
|
||||
- name: Install other dependencies
|
||||
run: |
|
||||
sudo apt-get update -q &&
|
||||
sudo apt-get install -q -y gettext
|
||||
- name: Run git-po-helper
|
||||
id: check-commits
|
||||
run: |
|
||||
exit_code=0
|
||||
git-po-helper check-commits \
|
||||
--github-action-event="${{ github.event_name }}" -- \
|
||||
${{ steps.setup-tips.outputs.base }}..${{ steps.setup-tips.outputs.head }} \
|
||||
>git-po-helper.out 2>&1 || exit_code=$?
|
||||
if test $exit_code -ne 0 || grep -q WARNING git-po-helper.out
|
||||
then
|
||||
# Remove ANSI colors which are proper for console logs but not
|
||||
# proper for PR comment.
|
||||
echo "COMMENT_BODY<<EOF" >>$GITHUB_ENV
|
||||
perl -pe 's/\e\[[0-9;]*m//g; s/\bEOF$//g' git-po-helper.out >>$GITHUB_ENV
|
||||
echo "EOF" >>$GITHUB_ENV
|
||||
fi
|
||||
cat git-po-helper.out
|
||||
exit $exit_code
|
||||
- name: Create comment in pull request for report
|
||||
uses: mshick/add-pr-comment@v1
|
||||
if: >-
|
||||
always() &&
|
||||
github.event_name == 'pull_request_target' &&
|
||||
env.COMMENT_BODY != ''
|
||||
with:
|
||||
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
repo-token-user-login: 'github-actions[bot]'
|
||||
message: >
|
||||
${{ steps.check-commits.outcome == 'failure' && 'Errors and warnings' || 'Warnings' }}
|
||||
found by [git-po-helper](https://github.com/git-l10n/git-po-helper#readme) in workflow
|
||||
[#${{ github.run_number }}](${{ env.GITHUB_SERVER_URL }}/${{ github.repository }}/actions/runs/${{ github.run_id }}):
|
||||
|
||||
```
|
||||
|
||||
${{ env.COMMENT_BODY }}
|
||||
|
||||
```
|
14
.github/workflows/main.yml
vendored
14
.github/workflows/main.yml
vendored
@ -88,7 +88,7 @@ jobs:
|
||||
env:
|
||||
HOME: ${{runner.workspace}}
|
||||
NO_PERL: 1
|
||||
run: ci/make-test-artifacts.sh artifacts
|
||||
run: . /etc/profile && ci/make-test-artifacts.sh artifacts
|
||||
- name: zip up tracked files
|
||||
run: git archive -o artifacts/tracked.tar.gz HEAD
|
||||
- name: upload tracked files and build artifacts
|
||||
@ -115,7 +115,7 @@ jobs:
|
||||
- uses: git-for-windows/setup-git-for-windows-sdk@v1
|
||||
- name: test
|
||||
shell: bash
|
||||
run: ci/run-test-slice.sh ${{matrix.nr}} 10
|
||||
run: . /etc/profile && ci/run-test-slice.sh ${{matrix.nr}} 10
|
||||
- name: ci/print-test-failures.sh
|
||||
if: failure()
|
||||
shell: bash
|
||||
@ -198,8 +198,7 @@ jobs:
|
||||
shell: bash
|
||||
env:
|
||||
NO_SVN_TESTS: 1
|
||||
GIT_TEST_SKIP_REBASE_P: 1
|
||||
run: ci/run-test-slice.sh ${{matrix.nr}} 10
|
||||
run: . /etc/profile && ci/run-test-slice.sh ${{matrix.nr}} 10
|
||||
- name: ci/print-test-failures.sh
|
||||
if: failure()
|
||||
shell: bash
|
||||
@ -232,6 +231,9 @@ jobs:
|
||||
- jobname: linux-gcc-default
|
||||
cc: gcc
|
||||
pool: ubuntu-latest
|
||||
- jobname: linux-leaks
|
||||
cc: gcc
|
||||
pool: ubuntu-latest
|
||||
env:
|
||||
CC: ${{matrix.vector.cc}}
|
||||
jobname: ${{matrix.vector.jobname}}
|
||||
@ -259,6 +261,8 @@ jobs:
|
||||
image: alpine
|
||||
- jobname: Linux32
|
||||
image: daald/ubuntu32:xenial
|
||||
- jobname: pedantic
|
||||
image: fedora
|
||||
env:
|
||||
jobname: ${{matrix.vector.jobname}}
|
||||
runs-on: ubuntu-latest
|
||||
@ -271,7 +275,7 @@ jobs:
|
||||
if: failure()
|
||||
- name: Upload failed tests' directories
|
||||
if: failure() && env.FAILED_TEST_ARTIFACTS != ''
|
||||
uses: actions/upload-artifact@v2
|
||||
uses: actions/upload-artifact@v1
|
||||
with:
|
||||
name: failed-tests-${{matrix.vector.jobname}}
|
||||
path: ${{env.FAILED_TEST_ARTIFACTS}}
|
||||
|
3
.gitignore
vendored
3
.gitignore
vendored
@ -125,7 +125,6 @@
|
||||
/git-range-diff
|
||||
/git-read-tree
|
||||
/git-rebase
|
||||
/git-rebase--preserve-merges
|
||||
/git-receive-pack
|
||||
/git-reflog
|
||||
/git-remote
|
||||
@ -190,6 +189,7 @@
|
||||
/gitweb/static/gitweb.min.*
|
||||
/config-list.h
|
||||
/command-list.h
|
||||
/hook-list.h
|
||||
*.tar.gz
|
||||
*.dsc
|
||||
*.deb
|
||||
@ -224,6 +224,7 @@
|
||||
*.lib
|
||||
*.res
|
||||
*.sln
|
||||
*.sp
|
||||
*.suo
|
||||
*.ncb
|
||||
*.vcproj
|
||||
|
1
Documentation/.gitignore
vendored
1
Documentation/.gitignore
vendored
@ -14,4 +14,5 @@ manpage-base-url.xsl
|
||||
SubmittingPatches.txt
|
||||
tmp-doc-diff/
|
||||
GIT-ASCIIDOCFLAGS
|
||||
/.build/
|
||||
/GIT-EXCLUDED-PROGRAMS
|
||||
|
@ -90,6 +90,7 @@ SP_ARTICLES += $(API_DOCS)
|
||||
TECH_DOCS += MyFirstContribution
|
||||
TECH_DOCS += MyFirstObjectWalk
|
||||
TECH_DOCS += SubmittingPatches
|
||||
TECH_DOCS += technical/bundle-format
|
||||
TECH_DOCS += technical/hash-function-transition
|
||||
TECH_DOCS += technical/http-protocol
|
||||
TECH_DOCS += technical/index-format
|
||||
@ -225,6 +226,7 @@ endif
|
||||
|
||||
ifneq ($(findstring $(MAKEFLAGS),s),s)
|
||||
ifndef V
|
||||
QUIET = @
|
||||
QUIET_ASCIIDOC = @echo ' ' ASCIIDOC $@;
|
||||
QUIET_XMLTO = @echo ' ' XMLTO $@;
|
||||
QUIET_DB2TEXI = @echo ' ' DB2TEXI $@;
|
||||
@ -232,11 +234,15 @@ ifndef V
|
||||
QUIET_DBLATEX = @echo ' ' DBLATEX $@;
|
||||
QUIET_XSLTPROC = @echo ' ' XSLTPROC $@;
|
||||
QUIET_GEN = @echo ' ' GEN $@;
|
||||
QUIET_LINT = @echo ' ' LINT $@;
|
||||
QUIET_STDERR = 2> /dev/null
|
||||
QUIET_SUBDIR0 = +@subdir=
|
||||
QUIET_SUBDIR1 = ;$(NO_SUBDIR) echo ' ' SUBDIR $$subdir; \
|
||||
$(MAKE) $(PRINT_DIR) -C $$subdir
|
||||
|
||||
QUIET_LINT_GITLINK = @echo ' ' LINT GITLINK $<;
|
||||
QUIET_LINT_MANSEC = @echo ' ' LINT MAN SEC $<;
|
||||
QUIET_LINT_MANEND = @echo ' ' LINT MAN END $<;
|
||||
|
||||
export V
|
||||
endif
|
||||
endif
|
||||
@ -284,7 +290,7 @@ install-html: html
|
||||
../GIT-VERSION-FILE: FORCE
|
||||
$(QUIET_SUBDIR0)../ $(QUIET_SUBDIR1) GIT-VERSION-FILE
|
||||
|
||||
ifneq ($(MAKECMDGOALS),clean)
|
||||
ifneq ($(filter-out lint-docs clean,$(MAKECMDGOALS)),)
|
||||
-include ../GIT-VERSION-FILE
|
||||
endif
|
||||
|
||||
@ -343,6 +349,7 @@ GIT-ASCIIDOCFLAGS: FORCE
|
||||
fi
|
||||
|
||||
clean:
|
||||
$(RM) -rf .build/
|
||||
$(RM) *.xml *.xml+ *.html *.html+ *.1 *.5 *.7
|
||||
$(RM) *.texi *.texi+ *.texi++ git.info gitman.info
|
||||
$(RM) *.pdf
|
||||
@ -456,14 +463,61 @@ quick-install-html: require-htmlrepo
|
||||
print-man1:
|
||||
@for i in $(MAN1_TXT); do echo $$i; done
|
||||
|
||||
lint-docs::
|
||||
$(QUIET_LINT)$(PERL_PATH) lint-gitlink.perl \
|
||||
## Lint: Common
|
||||
.build:
|
||||
$(QUIET)mkdir $@
|
||||
.build/lint-docs: | .build
|
||||
$(QUIET)mkdir $@
|
||||
|
||||
## Lint: gitlink
|
||||
.build/lint-docs/gitlink: | .build/lint-docs
|
||||
$(QUIET)mkdir $@
|
||||
.build/lint-docs/gitlink/howto: | .build/lint-docs/gitlink
|
||||
$(QUIET)mkdir $@
|
||||
.build/lint-docs/gitlink/config: | .build/lint-docs/gitlink
|
||||
$(QUIET)mkdir $@
|
||||
LINT_DOCS_GITLINK = $(patsubst %.txt,.build/lint-docs/gitlink/%.ok,$(HOWTO_TXT) $(DOC_DEP_TXT))
|
||||
$(LINT_DOCS_GITLINK): | .build/lint-docs/gitlink
|
||||
$(LINT_DOCS_GITLINK): | .build/lint-docs/gitlink/howto
|
||||
$(LINT_DOCS_GITLINK): | .build/lint-docs/gitlink/config
|
||||
$(LINT_DOCS_GITLINK): lint-gitlink.perl
|
||||
$(LINT_DOCS_GITLINK): .build/lint-docs/gitlink/%.ok: %.txt
|
||||
$(QUIET_LINT_GITLINK)$(PERL_PATH) lint-gitlink.perl \
|
||||
$< \
|
||||
$(HOWTO_TXT) $(DOC_DEP_TXT) \
|
||||
--section=1 $(MAN1_TXT) \
|
||||
--section=5 $(MAN5_TXT) \
|
||||
--section=7 $(MAN7_TXT); \
|
||||
$(PERL_PATH) lint-man-end-blurb.perl $(MAN_TXT); \
|
||||
$(PERL_PATH) lint-man-section-order.perl $(MAN_TXT);
|
||||
--section=7 $(MAN7_TXT) >$@
|
||||
.PHONY: lint-docs-gitlink
|
||||
lint-docs-gitlink: $(LINT_DOCS_GITLINK)
|
||||
|
||||
## Lint: man-end-blurb
|
||||
.build/lint-docs/man-end-blurb: | .build/lint-docs
|
||||
$(QUIET)mkdir $@
|
||||
LINT_DOCS_MAN_END_BLURB = $(patsubst %.txt,.build/lint-docs/man-end-blurb/%.ok,$(MAN_TXT))
|
||||
$(LINT_DOCS_MAN_END_BLURB): | .build/lint-docs/man-end-blurb
|
||||
$(LINT_DOCS_MAN_END_BLURB): lint-man-end-blurb.perl
|
||||
$(LINT_DOCS_MAN_END_BLURB): .build/lint-docs/man-end-blurb/%.ok: %.txt
|
||||
$(QUIET_LINT_MANEND)$(PERL_PATH) lint-man-end-blurb.perl $< >$@
|
||||
.PHONY: lint-docs-man-end-blurb
|
||||
lint-docs-man-end-blurb: $(LINT_DOCS_MAN_END_BLURB)
|
||||
|
||||
## Lint: man-section-order
|
||||
.build/lint-docs/man-section-order: | .build/lint-docs
|
||||
$(QUIET)mkdir $@
|
||||
LINT_DOCS_MAN_SECTION_ORDER = $(patsubst %.txt,.build/lint-docs/man-section-order/%.ok,$(MAN_TXT))
|
||||
$(LINT_DOCS_MAN_SECTION_ORDER): | .build/lint-docs/man-section-order
|
||||
$(LINT_DOCS_MAN_SECTION_ORDER): lint-man-section-order.perl
|
||||
$(LINT_DOCS_MAN_SECTION_ORDER): .build/lint-docs/man-section-order/%.ok: %.txt
|
||||
$(QUIET_LINT_MANSEC)$(PERL_PATH) lint-man-section-order.perl $< >$@
|
||||
.PHONY: lint-docs-man-section-order
|
||||
lint-docs-man-section-order: $(LINT_DOCS_MAN_SECTION_ORDER)
|
||||
|
||||
## Lint: list of targets above
|
||||
.PHONY: lint-docs
|
||||
lint-docs: lint-docs-gitlink
|
||||
lint-docs: lint-docs-man-end-blurb
|
||||
lint-docs: lint-docs-man-section-order
|
||||
|
||||
ifeq ($(wildcard po/Makefile),po/Makefile)
|
||||
doc-l10n install-l10n::
|
||||
|
@ -1029,22 +1029,42 @@ kidding - be patient!)
|
||||
[[v2-git-send-email]]
|
||||
=== Sending v2
|
||||
|
||||
Skip ahead to <<reviewing,Responding to Reviews>> for information on how to
|
||||
handle comments from reviewers. Continue this section when your topic branch is
|
||||
shaped the way you want it to look for your patchset v2.
|
||||
This section will focus on how to send a v2 of your patchset. To learn what
|
||||
should go into v2, skip ahead to <<reviewing,Responding to Reviews>> for
|
||||
information on how to handle comments from reviewers.
|
||||
|
||||
When you're ready with the next iteration of your patch, the process is fairly
|
||||
similar.
|
||||
|
||||
First, generate your v2 patches again:
|
||||
We'll reuse our `psuh` topic branch for v2. Before we make any changes, we'll
|
||||
mark the tip of our v1 branch for easy reference:
|
||||
|
||||
----
|
||||
$ git format-patch -v2 --cover-letter -o psuh/ master..psuh
|
||||
$ git checkout psuh
|
||||
$ git branch psuh-v1
|
||||
----
|
||||
|
||||
This will add your v2 patches, all named like `v2-000n-my-commit-subject.patch`,
|
||||
to the `psuh/` directory. You may notice that they are sitting alongside the v1
|
||||
patches; that's fine, but be careful when you are ready to send them.
|
||||
Refine your patch series by using `git rebase -i` to adjust commits based upon
|
||||
reviewer comments. Once the patch series is ready for submission, generate your
|
||||
patches again, but with some new flags:
|
||||
|
||||
----
|
||||
$ git format-patch -v2 --cover-letter -o psuh/ --range-diff master..psuh-v1 master..
|
||||
----
|
||||
|
||||
The `--range-diff master..psuh-v1` parameter tells `format-patch` to include a
|
||||
range-diff between `psuh-v1` and `psuh` in the cover letter (see
|
||||
linkgit:git-range-diff[1]). This helps tell reviewers about the differences
|
||||
between your v1 and v2 patches.
|
||||
|
||||
The `-v2` parameter tells `format-patch` to output your patches
|
||||
as version "2". For instance, you may notice that your v2 patches are
|
||||
all named like `v2-000n-my-commit-subject.patch`. `-v2` will also format
|
||||
your patches by prefixing them with "[PATCH v2]" instead of "[PATCH]",
|
||||
and your range-diff will be prefaced with "Range-diff against v1".
|
||||
|
||||
Afer you run this command, `format-patch` will output the patches to the `psuh/`
|
||||
directory, alongside the v1 patches. Using a single directory makes it easy to
|
||||
refer to the old v1 patches while proofreading the v2 patches, but you will need
|
||||
to be careful to send out only the v2 patches. We will use a pattern like
|
||||
"psuh/v2-*.patch" (not "psuh/*.patch", which would match v1 and v2 patches).
|
||||
|
||||
Edit your cover letter again. Now is a good time to mention what's different
|
||||
between your last version and now, if it's something significant. You do not
|
||||
@ -1082,7 +1102,7 @@ to the command:
|
||||
----
|
||||
$ git send-email --to=target@example.com
|
||||
--in-reply-to="<foo.12345.author@example.com>"
|
||||
psuh/v2*
|
||||
psuh/v2-*.patch
|
||||
----
|
||||
|
||||
[[single-patch]]
|
||||
|
@ -691,7 +691,7 @@ help understand. In our case, that means we omit trees and blobs not directly
|
||||
referenced by `HEAD` or `HEAD`'s history, because we begin the walk with only
|
||||
`HEAD` in the `pending` list.)
|
||||
|
||||
First, we'll need to `#include "list-objects-filter-options.h`" and set up the
|
||||
First, we'll need to `#include "list-objects-filter-options.h"` and set up the
|
||||
`struct list_objects_filter_options` at the top of the function.
|
||||
|
||||
----
|
||||
@ -779,7 +779,7 @@ Count all the objects within and modify the print statement:
|
||||
while ((oid = oidset_iter_next(&oit)))
|
||||
omitted_count++;
|
||||
|
||||
printf("commits %d\nblobs %d\ntags %d\ntrees%d\nomitted %d\n",
|
||||
printf("commits %d\nblobs %d\ntags %d\ntrees %d\nomitted %d\n",
|
||||
commit_count, blob_count, tag_count, tree_count, omitted_count);
|
||||
----
|
||||
|
||||
|
@ -12,10 +12,6 @@ UI, Workflows & Features
|
||||
"smtp-server" that is meant to name the server to instead name the
|
||||
command to talk to the server.
|
||||
|
||||
* The "-m" option in "git log -m" that does not specify which format,
|
||||
if any, of diff is desired did not have any visible effect; it now
|
||||
implies some form of diff (by default "--patch") is produced.
|
||||
|
||||
* The userdiff pattern for C# learned the token "record".
|
||||
|
||||
* "git rev-list" learns to omit the "commit <object-name>" header
|
||||
|
138
Documentation/RelNotes/2.33.1.txt
Normal file
138
Documentation/RelNotes/2.33.1.txt
Normal file
@ -0,0 +1,138 @@
|
||||
Git 2.33.1 Release Notes
|
||||
========================
|
||||
|
||||
This primarily is to backport various fixes accumulated during the
|
||||
development towards Git 2.34, the next feature release.
|
||||
|
||||
|
||||
Fixes since v2.33
|
||||
-----------------
|
||||
|
||||
* The unicode character width table (used for output alignment) has
|
||||
been updated.
|
||||
|
||||
* Input validation of "git pack-objects --stdin-packs" has been
|
||||
corrected.
|
||||
|
||||
* Bugfix for common ancestor negotiation recently introduced in "git
|
||||
push" codepath.
|
||||
|
||||
* "git pull" had various corner cases that were not well thought out
|
||||
around its --rebase backend, e.g. "git pull --ff-only" did not stop
|
||||
but went ahead and rebased when the history on other side is not a
|
||||
descendant of our history. The series tries to fix them up.
|
||||
|
||||
* "git apply" miscounted the bytes and failed to read to the end of
|
||||
binary hunks.
|
||||
|
||||
* "git range-diff" code clean-up.
|
||||
|
||||
* "git commit --fixup" now works with "--edit" again, after it was
|
||||
broken in v2.32.
|
||||
|
||||
* Use upload-artifacts v1 (instead of v2) for 32-bit linux, as the
|
||||
new version has a blocker bug for that architecture.
|
||||
|
||||
* Checking out all the paths from HEAD during the last conflicted
|
||||
step in "git rebase" and continuing would cause the step to be
|
||||
skipped (which is expected), but leaves MERGE_MSG file behind in
|
||||
$GIT_DIR and confuses the next "git commit", which has been
|
||||
corrected.
|
||||
|
||||
* Various bugs in "git rebase -r" have been fixed.
|
||||
|
||||
* mmap() imitation used to call xmalloc() that dies upon malloc()
|
||||
failure, which has been corrected to just return an error to the
|
||||
caller to be handled.
|
||||
|
||||
* "git diff --relative" segfaulted and/or produced incorrect result
|
||||
when there are unmerged paths.
|
||||
|
||||
* The delayed checkout code path in "git checkout" etc. were chatty
|
||||
even when --quiet and/or --no-progress options were given.
|
||||
|
||||
* "git branch -D <branch>" used to refuse to remove a broken branch
|
||||
ref that points at a missing commit, which has been corrected.
|
||||
|
||||
* Build update for Apple clang.
|
||||
|
||||
* The parser for the "--nl" option of "git column" has been
|
||||
corrected.
|
||||
|
||||
* "git upload-pack" which runs on the other side of "git fetch"
|
||||
forgot to take the ref namespaces into account when handling
|
||||
want-ref requests.
|
||||
|
||||
* The sparse-index support can corrupt the index structure by storing
|
||||
a stale and/or uninitialized data, which has been corrected.
|
||||
|
||||
* Buggy tests could damage repositories outside the throw-away test
|
||||
area we created. We now by default export GIT_CEILING_DIRECTORIES
|
||||
to limit the damage from such a stray test.
|
||||
|
||||
* Even when running "git send-email" without its own threaded
|
||||
discussion support, a threading related header in one message is
|
||||
carried over to the subsequent message to result in an unwanted
|
||||
threading, which has been corrected.
|
||||
|
||||
* The output from "git fast-export", when its anonymization feature
|
||||
is in use, showed an annotated tag incorrectly.
|
||||
|
||||
* Recent "diff -m" changes broke "gitk", which has been corrected.
|
||||
|
||||
* "git maintenance" scheduler fix for macOS.
|
||||
|
||||
* A pathname in an advice message has been made cut-and-paste ready.
|
||||
|
||||
* The "git apply -3" code path learned not to bother the lower level
|
||||
merge machinery when the three-way merge can be trivially resolved
|
||||
without the content level merge.
|
||||
|
||||
* The code that optionally creates the *.rev reverse index file has
|
||||
been optimized to avoid needless computation when it is not writing
|
||||
the file out.
|
||||
|
||||
* "git range-diff -I... <range> <range>" segfaulted, which has been
|
||||
corrected.
|
||||
|
||||
* The order in which various files that make up a single (conceptual)
|
||||
packfile has been reevaluated and straightened up. This matters in
|
||||
correctness, as an incomplete set of files must not be shown to a
|
||||
running Git.
|
||||
|
||||
* The "mode" word is useless in a call to open(2) that does not
|
||||
create a new file. Such a call in the files backend of the ref
|
||||
subsystem has been cleaned up.
|
||||
|
||||
* "git update-ref --stdin" failed to flush its output as needed,
|
||||
which potentially led the conversation to a deadlock.
|
||||
|
||||
* When "git am --abort" fails to abort correctly, it still exited
|
||||
with exit status of 0, which has been corrected.
|
||||
|
||||
* Correct nr and alloc members of strvec struct to be of type size_t.
|
||||
|
||||
* "git stash", where the tentative change involves changing a
|
||||
directory to a file (or vice versa), was confused, which has been
|
||||
corrected.
|
||||
|
||||
* "git clone" from a repository whose HEAD is unborn into a bare
|
||||
repository didn't follow the branch name the other side used, which
|
||||
is corrected.
|
||||
|
||||
* "git cvsserver" had a long-standing bug in its authentication code,
|
||||
which has finally been corrected (it is unclear and is a separate
|
||||
question if anybody is seriously using it, though).
|
||||
|
||||
* "git difftool --dir-diff" mishandled symbolic links.
|
||||
|
||||
* Sensitive data in the HTTP trace were supposed to be redacted, but
|
||||
we failed to do so in HTTP/2 requests.
|
||||
|
||||
* "make clean" has been updated to remove leftover .depend/
|
||||
directories, even when it is not told to use them to compute header
|
||||
dependencies.
|
||||
|
||||
* Protocol v0 clients can get stuck parsing a malformed feature line.
|
||||
|
||||
Also contains various documentation updates and code clean-ups.
|
409
Documentation/RelNotes/2.34.0.txt
Normal file
409
Documentation/RelNotes/2.34.0.txt
Normal file
@ -0,0 +1,409 @@
|
||||
Git 2.34 Release Notes
|
||||
======================
|
||||
|
||||
Updates since Git 2.33
|
||||
----------------------
|
||||
|
||||
Backward compatibility notes
|
||||
|
||||
* The "--preserve-merges" option of "git rebase" has been removed.
|
||||
|
||||
|
||||
UI, Workflows & Features
|
||||
|
||||
* Pathname expansion (like "~username/") learned a way to specify a
|
||||
location relative to Git installation (e.g. its $sharedir which is
|
||||
$(prefix)/share), with "%(prefix)".
|
||||
|
||||
* Use `ort` instead of `recursive` as the default merge strategy.
|
||||
|
||||
* The userdiff pattern for "java" language has been updated.
|
||||
|
||||
* "git rebase" by default skips changes that are equivalent to
|
||||
commits that are already in the history the branch is rebased onto;
|
||||
give messages when this happens to let the users be aware of
|
||||
skipped commits, and also teach them how to tell "rebase" to keep
|
||||
duplicated changes.
|
||||
|
||||
* The advice message that "git cherry-pick" gives when it asks
|
||||
conflicted replay of a commit to be resolved by the end user has
|
||||
been updated.
|
||||
|
||||
* After "git clone --recurse-submodules", all submodules are cloned
|
||||
but they are not by default recursed into by other commands. With
|
||||
submodule.stickyRecursiveClone configuration set, submodule.recurse
|
||||
configuration is set to true in a repository created by "clone"
|
||||
with "--recurse-submodules" option.
|
||||
|
||||
* The logic for auto-correction of misspelt subcommands learned to go
|
||||
interactive when the help.autocorrect configuration variable is set
|
||||
to 'prompt'.
|
||||
|
||||
* "git maintenance" scheduler learned to use systemd timers as a
|
||||
possible backend.
|
||||
|
||||
* "git diff --submodule=diff" showed failure from run_command() when
|
||||
trying to run diff inside a submodule, when the user manually
|
||||
removes the submodule directory.
|
||||
|
||||
* "git bundle unbundle" learned to show progress display.
|
||||
|
||||
* In cone mode, the sparse-index code path learned to remove ignored
|
||||
files (like build artifacts) outside the sparse cone, allowing the
|
||||
entire directory outside the sparse cone to be removed, which is
|
||||
especially useful when the sparse patterns change.
|
||||
|
||||
* Taking advantage of the CGI interface, http-backend has been
|
||||
updated to enable protocol v2 automatically when the other side
|
||||
asks for it.
|
||||
|
||||
* The credential-cache helper has been adjusted to Windows.
|
||||
|
||||
* The error in "git help no-such-git-command" is handled better.
|
||||
|
||||
* The unicode character width table (used for output alignment) has
|
||||
been updated.
|
||||
|
||||
* The ref iteration code used to optionally allow dangling refs to be
|
||||
shown, which has been tightened up.
|
||||
|
||||
* "git add", "git mv", and "git rm" have been adjusted to avoid
|
||||
updating paths outside of the sparse-checkout definition unless
|
||||
the user specifies a "--sparse" option.
|
||||
|
||||
* "git repack" has been taught to generate multi-pack reachability
|
||||
bitmaps.
|
||||
|
||||
* "git fsck" has been taught to report mismatch between expected and
|
||||
actual types of an object better.
|
||||
|
||||
* Use ssh public crypto for object and push-cert signing.
|
||||
|
||||
|
||||
Performance, Internal Implementation, Development Support etc.
|
||||
|
||||
* "git bisect" spawned "git show-branch" only to pretty-print the
|
||||
title of the commit after checking out the next version to be
|
||||
tested; this has been rewritten in C.
|
||||
|
||||
* "git add" can work better with the sparse index.
|
||||
|
||||
* Support for ancient versions of cURL library (pre 7.19.4) has been
|
||||
dropped.
|
||||
|
||||
* A handful of tests that assumed implementation details of files
|
||||
backend for refs have been cleaned up.
|
||||
|
||||
* trace2 logs learned to show parent process name to see in what
|
||||
context Git was invoked.
|
||||
|
||||
* Loading of ref tips to prepare for common ancestry negotiation in
|
||||
"git fetch-pack" has been optimized by taking advantage of the
|
||||
commit graph when available.
|
||||
|
||||
* Remind developers that the userdiff patterns should be kept simple
|
||||
and permissive, assuming that the contents they apply are always
|
||||
syntactically correct.
|
||||
|
||||
* The current implementation of GIT_TEST_FAIL_PREREQS is broken in
|
||||
that checking for the lack of a prerequisite would not work. Avoid
|
||||
the use of "if ! test_have_prereq X" in a test script.
|
||||
|
||||
* The revision traversal API has been optimized by taking advantage
|
||||
of the commit-graph, when available, to determine if a commit is
|
||||
reachable from any of the existing refs.
|
||||
|
||||
* "git fetch --quiet" optimization to avoid useless computation of
|
||||
info that will never be displayed.
|
||||
|
||||
* Callers from older advice_config[] based API has been updated to
|
||||
use the newer advice_if_enabled() and advice_enabled() API.
|
||||
|
||||
* Teach "test_pause" and "debug" helpers to allow using the HOME and
|
||||
TERM environment variables the user usually uses.
|
||||
|
||||
* "make INSTALL_STRIP=-s install" allows the installation step to use
|
||||
"install -s" to strip the binaries as they get installed.
|
||||
|
||||
* Code that handles large number of refs in the "git fetch" code
|
||||
path has been optimized.
|
||||
|
||||
* The reachability bitmap file used to be generated only for a single
|
||||
pack, but now we've learned to generate bitmaps for history that
|
||||
span across multiple packfiles.
|
||||
|
||||
* The code to make "git grep" recurse into submodules has been
|
||||
updated to migrate away from the "add submodule's object store as
|
||||
an alternate object store" mechanism (which is suboptimal).
|
||||
|
||||
* The tracing of process ancestry information has been enhanced.
|
||||
|
||||
* Reduce number of write(2) system calls while sending the
|
||||
ref advertisement.
|
||||
|
||||
* Update the build procedure to use the "-pedantic" build when
|
||||
DEVELOPER makefile macro is in effect.
|
||||
|
||||
* Large part of "git submodule add" gets rewritten in C.
|
||||
|
||||
* The run-command API has been updated so that the callers can easily
|
||||
ask the file descriptors open for packfiles to be closed immediately
|
||||
before spawning commands that may trigger auto-gc.
|
||||
|
||||
* An oddball OPTION_ARGUMENT feature has been removed from the
|
||||
parse-options API.
|
||||
|
||||
* The mergesort implementation used to sort linked list has been
|
||||
optimized.
|
||||
|
||||
* Remove external declaration of functions that no longer exist.
|
||||
|
||||
* "git multi-pack-index write --bitmap" learns to propagate the
|
||||
hashcache from original bitmap to resulting bitmap.
|
||||
|
||||
* CI learns to run the leak sanitizer builds.
|
||||
|
||||
* "git grep --recurse-submodules" takes trees and blobs from the
|
||||
submodule repository, but the textconv settings when processing a
|
||||
blob from the submodule is not taken from the submodule repository.
|
||||
A test is added to demonstrate the issue, without fixing it.
|
||||
|
||||
* Teach "git help -c" into helping the command line completion of
|
||||
configuration variables.
|
||||
|
||||
* When "git cmd -h" shows more than one line of usage text (e.g.
|
||||
the cmd subcommand may take sub-sub-command), parse-options API
|
||||
learned to align these lines, even across i18n/l10n.
|
||||
|
||||
* Prevent "make sparse" from running for the source files that
|
||||
haven't been modified.
|
||||
|
||||
* The codepath to write a new version of .midx multi-pack index files
|
||||
has learned to release the mmaped memory holding the current
|
||||
version of .midx before removing them from the disk, as some
|
||||
platforms do not allow removal of a file that still has mapping.
|
||||
|
||||
* A new feature has been added to abort early in the test framework.
|
||||
|
||||
|
||||
Fixes since v2.33
|
||||
-----------------
|
||||
|
||||
* Input validation of "git pack-objects --stdin-packs" has been
|
||||
corrected.
|
||||
|
||||
* Bugfix for common ancestor negotiation recently introduced in "git
|
||||
push" code path.
|
||||
|
||||
* "git pull" had various corner cases that were not well thought out
|
||||
around its --rebase backend, e.g. "git pull --ff-only" did not stop
|
||||
but went ahead and rebased when the history on other side is not a
|
||||
descendant of our history. The series tries to fix them up.
|
||||
|
||||
* "git apply" miscounted the bytes and failed to read to the end of
|
||||
binary hunks.
|
||||
|
||||
* "git range-diff" code clean-up.
|
||||
|
||||
* "git commit --fixup" now works with "--edit" again, after it was
|
||||
broken in v2.32.
|
||||
|
||||
* Use upload-artifacts v1 (instead of v2) for 32-bit linux, as the
|
||||
new version has a blocker bug for that architecture.
|
||||
|
||||
* Checking out all the paths from HEAD during the last conflicted
|
||||
step in "git rebase" and continuing would cause the step to be
|
||||
skipped (which is expected), but leaves MERGE_MSG file behind in
|
||||
$GIT_DIR and confuses the next "git commit", which has been
|
||||
corrected.
|
||||
|
||||
* Various bugs in "git rebase -r" have been fixed.
|
||||
|
||||
* mmap() imitation used to call xmalloc() that dies upon malloc()
|
||||
failure, which has been corrected to just return an error to the
|
||||
caller to be handled.
|
||||
|
||||
* "git diff --relative" segfaulted and/or produced incorrect result
|
||||
when there are unmerged paths.
|
||||
|
||||
* The delayed checkout code path in "git checkout" etc. were chatty
|
||||
even when --quiet and/or --no-progress options were given.
|
||||
|
||||
* "git branch -D <branch>" used to refuse to remove a broken branch
|
||||
ref that points at a missing commit, which has been corrected.
|
||||
|
||||
* Build update for Apple clang.
|
||||
|
||||
* The parser for the "--nl" option of "git column" has been
|
||||
corrected.
|
||||
|
||||
* "git upload-pack" which runs on the other side of "git fetch"
|
||||
forgot to take the ref namespaces into account when handling
|
||||
want-ref requests.
|
||||
|
||||
* The sparse-index support can corrupt the index structure by storing
|
||||
a stale and/or uninitialized data, which has been corrected.
|
||||
|
||||
* Buggy tests could damage repositories outside the throw-away test
|
||||
area we created. We now by default export GIT_CEILING_DIRECTORIES
|
||||
to limit the damage from such a stray test.
|
||||
|
||||
* Even when running "git send-email" without its own threaded
|
||||
discussion support, a threading related header in one message is
|
||||
carried over to the subsequent message to result in an unwanted
|
||||
threading, which has been corrected.
|
||||
|
||||
* The output from "git fast-export", when its anonymization feature
|
||||
is in use, showed an annotated tag incorrectly.
|
||||
|
||||
* Doc update plus improved error reporting.
|
||||
|
||||
* Recent "diff -m" changes broke "gitk", which has been corrected.
|
||||
|
||||
* Regression fix.
|
||||
|
||||
* The "git apply -3" code path learned not to bother the lower level
|
||||
merge machinery when the three-way merge can be trivially resolved
|
||||
without the content level merge. This fixes a regression caused by
|
||||
recent "-3way first and fall back to direct application" change.
|
||||
|
||||
* The code that optionally creates the *.rev reverse index file has
|
||||
been optimized to avoid needless computation when it is not writing
|
||||
the file out.
|
||||
|
||||
* "git range-diff -I... <range> <range>" segfaulted, which has been
|
||||
corrected.
|
||||
|
||||
* The order in which various files that make up a single (conceptual)
|
||||
packfile has been reevaluated and straightened up. This matters in
|
||||
correctness, as an incomplete set of files must not be shown to a
|
||||
running Git.
|
||||
|
||||
* The "mode" word is useless in a call to open(2) that does not
|
||||
create a new file. Such a call in the files backend of the ref
|
||||
subsystem has been cleaned up.
|
||||
|
||||
* "git update-ref --stdin" failed to flush its output as needed,
|
||||
which potentially led the conversation to a deadlock.
|
||||
|
||||
* When "git am --abort" fails to abort correctly, it still exited
|
||||
with exit status of 0, which has been corrected.
|
||||
|
||||
* Correct nr and alloc members of strvec struct to be of type size_t.
|
||||
|
||||
* "git stash", where the tentative change involves changing a
|
||||
directory to a file (or vice versa), was confused, which has been
|
||||
corrected.
|
||||
|
||||
* "git clone" from a repository whose HEAD is unborn into a bare
|
||||
repository didn't follow the branch name the other side used, which
|
||||
is corrected.
|
||||
|
||||
* "git cvsserver" had a long-standing bug in its authentication code,
|
||||
which has finally been corrected (it is unclear and is a separate
|
||||
question if anybody is seriously using it, though).
|
||||
|
||||
* "git difftool --dir-diff" mishandled symbolic links.
|
||||
|
||||
* Sensitive data in the HTTP trace were supposed to be redacted, but
|
||||
we failed to do so in HTTP/2 requests.
|
||||
|
||||
* "make clean" has been updated to remove leftover .depend/
|
||||
directories, even when it is not told to use them to compute header
|
||||
dependencies.
|
||||
|
||||
* Protocol v0 clients can get stuck parsing a malformed feature line.
|
||||
|
||||
* A few kinds of changes "git status" can show were not documented.
|
||||
(merge d2a534c515 ja/doc-status-types-and-copies later to maint).
|
||||
|
||||
* The mergesort implementation used to sort linked list has been
|
||||
optimized.
|
||||
(merge c90cfc225b rs/mergesort later to maint).
|
||||
|
||||
* An editor session launched during a Git operation (e.g. during 'git
|
||||
commit') can leave the terminal in a funny state. The code path
|
||||
has updated to save the terminal state before, and restore it
|
||||
after, it spawns an editor.
|
||||
(merge 3d411afabc cm/save-restore-terminal later to maint).
|
||||
|
||||
* "git cat-file --batch" with the "--batch-all-objects" option is
|
||||
supposed to iterate over all the objects found in a repository, but
|
||||
it used to translate these object names using the replace mechanism,
|
||||
which defeats the point of enumerating all objects in the repository.
|
||||
This has been corrected.
|
||||
(merge bf972896d7 jk/cat-file-batch-all-wo-replace later to maint).
|
||||
|
||||
* Recent sparse-index work broke safety against attempts to add paths
|
||||
with trailing slashes to the index, which has been corrected.
|
||||
(merge c8ad9d04c6 rs/make-verify-path-really-verify-again later to maint).
|
||||
|
||||
* The "--color-lines" and "--color-by-age" options of "git blame"
|
||||
have been missing, which are now documented.
|
||||
(merge 8c32856133 bs/doc-blame-color-lines later to maint).
|
||||
|
||||
* The PATH used in CI job may be too wide and let incompatible dlls
|
||||
to be grabbed, which can cause the build&test to fail. Tighten it.
|
||||
(merge 7491ef6198 js/windows-ci-path-fix later to maint).
|
||||
|
||||
* Avoid performance measurements from getting ruined by gc and other
|
||||
housekeeping pauses interfering in the middle.
|
||||
(merge be79131a53 rs/disable-gc-during-perf-tests later to maint).
|
||||
|
||||
* Stop "git add --dry-run" from creating new blob and tree objects.
|
||||
(merge e578d0311d rs/add-dry-run-without-objects later to maint).
|
||||
|
||||
* "git commit" gave duplicated error message when the object store
|
||||
was unwritable, which has been corrected.
|
||||
(merge 4ef91a2d79 ab/fix-commit-error-message-upon-unwritable-object-store later to maint).
|
||||
|
||||
* Recent sparse-index addition, namely any use of index_name_pos(),
|
||||
can expand sparse index entries and breaks any code that walks
|
||||
cache-tree or existing index entries. One such instance of such a
|
||||
breakage has been corrected.
|
||||
|
||||
* The xxdiff difftool backend can exit with status 128, which the
|
||||
difftool-helper that launches the backend takes as a significant
|
||||
failure, when it is not significant at all. Work it around.
|
||||
(merge 571f4348dd da/mergetools-special-case-xxdiff-exit-128 later to maint).
|
||||
|
||||
* Improve test framework around unwritable directories.
|
||||
(merge 5d22e18965 ab/test-cleanly-recreate-trash-directory later to maint).
|
||||
|
||||
* "git push" client talking to an HTTP server did not diagnose the
|
||||
lack of the final status report from the other side correctly,
|
||||
which has been corrected.
|
||||
(merge c5c3486f38 jk/http-push-status-fix later to maint).
|
||||
|
||||
* Update "git archive" documentation and give explicit mention on the
|
||||
compression level for both zip and tar.gz format.
|
||||
(merge c4b208c309 bs/archive-doc-compression-level later to maint).
|
||||
|
||||
* Drop "git sparse-index" from the list of common commands.
|
||||
(merge 6a9a50a8af sg/sparse-index-not-that-common-a-command later to maint).
|
||||
|
||||
* "git branch -c/-m new old" was not described to copy config, which
|
||||
has been corrected.
|
||||
(merge 8252ec300e jc/branch-copy-doc later to maint).
|
||||
|
||||
* Squelch over-eager warning message added during this cycle.
|
||||
(merge 9e8fe7b1c7 jk/log-warn-on-bogus-encoding later to maint).
|
||||
|
||||
* Fix long-standing shell syntax error in the completion script.
|
||||
(merge 46b0585286 re/completion-fix-test-equality later to maint).
|
||||
|
||||
* Other code cleanup, docfix, build fix, etc.
|
||||
(merge f188160be9 ab/bundle-remove-verbose-option later to maint).
|
||||
(merge 8c6b4332b4 rs/close-pack-leakfix later to maint).
|
||||
(merge 51b04c05b7 bs/difftool-msg-tweak later to maint).
|
||||
(merge dd20e4a6db ab/make-compdb-fix later to maint).
|
||||
(merge 6ffb990dc4 os/status-docfix later to maint).
|
||||
(merge 100c2da2d3 rs/p3400-lose-tac later to maint).
|
||||
(merge 76f3b69896 tb/aggregate-ignore-leading-whitespaces later to maint).
|
||||
(merge 6e4fd8bfcd tz/doc-link-to-bundle-format-fix later to maint).
|
||||
(merge f6c013dfa1 jc/doc-commit-header-continuation-line later to maint).
|
||||
(merge ec9a37d69b ab/pkt-line-cleanup later to maint).
|
||||
(merge 8650c6298c ab/fix-make-lint-docs later to maint).
|
||||
(merge 1c720357ce ab/test-lib-diff-cleanup later to maint).
|
||||
(merge 6b615dbece ks/submodule-add-message-fix later to maint).
|
||||
(merge 82a57cd13f ma/doc-git-version later to maint).
|
@ -136,5 +136,16 @@ take effect.
|
||||
option. An empty file name, `""`, will clear the list of revs from
|
||||
previously processed files.
|
||||
|
||||
--color-lines::
|
||||
Color line annotations in the default format differently if they come from
|
||||
the same commit as the preceding line. This makes it easier to distinguish
|
||||
code blocks introduced by different commits. The color defaults to cyan and
|
||||
can be adjusted using the `color.blame.repeatedLines` config option.
|
||||
|
||||
--color-by-age::
|
||||
Color line annotations depending on the age of the line in the default format.
|
||||
The `color.blame.highlightRecent` config option controls what color is used for
|
||||
each range of age.
|
||||
|
||||
-h::
|
||||
Show help message.
|
||||
|
@ -298,6 +298,15 @@ pathname::
|
||||
tilde expansion happens to such a string: `~/`
|
||||
is expanded to the value of `$HOME`, and `~user/` to the
|
||||
specified user's home directory.
|
||||
+
|
||||
If a path starts with `%(prefix)/`, the remainder is interpreted as a
|
||||
path relative to Git's "runtime prefix", i.e. relative to the location
|
||||
where Git itself was installed. For example, `%(prefix)/bin/` refers to
|
||||
the directory in which the Git executable itself lives. If Git was
|
||||
compiled without runtime prefix support, the compiled-in prefix will be
|
||||
substituted instead. In the unlikely event that a literal path needs to
|
||||
be specified that should _not_ be expanded, it needs to be prefixed by
|
||||
`./`, like so: `./%(prefix)/bin`.
|
||||
|
||||
|
||||
Variables
|
||||
|
@ -44,6 +44,9 @@ advice.*::
|
||||
Shown when linkgit:git-push[1] rejects a forced update of
|
||||
a branch when its remote-tracking ref has updates that we
|
||||
do not have locally.
|
||||
skippedCherryPicks::
|
||||
Shown when linkgit:git-rebase[1] skips a commit that has already
|
||||
been cherry-picked onto the upstream branch.
|
||||
statusAheadBehind::
|
||||
Shown when linkgit:git-status[1] computes the ahead/behind
|
||||
counts for a local ref compared to its remote tracking ref,
|
||||
|
@ -85,10 +85,6 @@ When `merges` (or just 'm'), pass the `--rebase-merges` option to 'git rebase'
|
||||
so that the local merge commits are included in the rebase (see
|
||||
linkgit:git-rebase[1] for details).
|
||||
+
|
||||
When `preserve` (or just 'p', deprecated in favor of `merges`), also pass
|
||||
`--preserve-merges` along to 'git rebase' so that locally committed merge
|
||||
commits will not be flattened by running 'git pull'.
|
||||
+
|
||||
When the value is `interactive` (or just 'i'), the rebase is run in interactive
|
||||
mode.
|
||||
+
|
||||
|
@ -9,26 +9,27 @@ color.advice.hint::
|
||||
Use customized color for hints.
|
||||
|
||||
color.blame.highlightRecent::
|
||||
This can be used to color the metadata of a blame line depending
|
||||
on age of the line.
|
||||
Specify the line annotation color for `git blame --color-by-age`
|
||||
depending upon the age of the line.
|
||||
+
|
||||
This setting should be set to a comma-separated list of color and date settings,
|
||||
starting and ending with a color, the dates should be set from oldest to newest.
|
||||
The metadata will be colored given the colors if the line was introduced
|
||||
before the given timestamp, overwriting older timestamped colors.
|
||||
This setting should be set to a comma-separated list of color and
|
||||
date settings, starting and ending with a color, the dates should be
|
||||
set from oldest to newest. The metadata will be colored with the
|
||||
specified colors if the line was introduced before the given
|
||||
timestamp, overwriting older timestamped colors.
|
||||
+
|
||||
Instead of an absolute timestamp relative timestamps work as well, e.g.
|
||||
2.weeks.ago is valid to address anything older than 2 weeks.
|
||||
Instead of an absolute timestamp relative timestamps work as well,
|
||||
e.g. `2.weeks.ago` is valid to address anything older than 2 weeks.
|
||||
+
|
||||
It defaults to 'blue,12 month ago,white,1 month ago,red', which colors
|
||||
everything older than one year blue, recent changes between one month and
|
||||
one year old are kept white, and lines introduced within the last month are
|
||||
colored red.
|
||||
It defaults to `blue,12 month ago,white,1 month ago,red`, which
|
||||
colors everything older than one year blue, recent changes between
|
||||
one month and one year old are kept white, and lines introduced
|
||||
within the last month are colored red.
|
||||
|
||||
color.blame.repeatedLines::
|
||||
Use the customized color for the part of git-blame output that
|
||||
is repeated meta information per line (such as commit id,
|
||||
author name, date and timezone). Defaults to cyan.
|
||||
Use the specified color to colorize line annotations for
|
||||
`git blame --color-lines`, if they come from the same commit as the
|
||||
preceding line. Defaults to cyan.
|
||||
|
||||
color.branch::
|
||||
A boolean to enable/disable color in the output of
|
||||
|
@ -11,13 +11,13 @@ gpg.program::
|
||||
|
||||
gpg.format::
|
||||
Specifies which key format to use when signing with `--gpg-sign`.
|
||||
Default is "openpgp" and another possible value is "x509".
|
||||
Default is "openpgp". Other possible values are "x509", "ssh".
|
||||
|
||||
gpg.<format>.program::
|
||||
Use this to customize the program used for the signing format you
|
||||
chose. (see `gpg.program` and `gpg.format`) `gpg.program` can still
|
||||
be used as a legacy synonym for `gpg.openpgp.program`. The default
|
||||
value for `gpg.x509.program` is "gpgsm".
|
||||
value for `gpg.x509.program` is "gpgsm" and `gpg.ssh.program` is "ssh-keygen".
|
||||
|
||||
gpg.minTrustLevel::
|
||||
Specifies a minimum trust level for signature verification. If
|
||||
@ -33,3 +33,42 @@ gpg.minTrustLevel::
|
||||
* `marginal`
|
||||
* `fully`
|
||||
* `ultimate`
|
||||
|
||||
gpg.ssh.defaultKeyCommand:
|
||||
This command that will be run when user.signingkey is not set and a ssh
|
||||
signature is requested. On successful exit a valid ssh public key is
|
||||
expected in the first line of its output. To automatically use the first
|
||||
available key from your ssh-agent set this to "ssh-add -L".
|
||||
|
||||
gpg.ssh.allowedSignersFile::
|
||||
A file containing ssh public keys which you are willing to trust.
|
||||
The file consists of one or more lines of principals followed by an ssh
|
||||
public key.
|
||||
e.g.: user1@example.com,user2@example.com ssh-rsa AAAAX1...
|
||||
See ssh-keygen(1) "ALLOWED SIGNERS" for details.
|
||||
The principal is only used to identify the key and is available when
|
||||
verifying a signature.
|
||||
+
|
||||
SSH has no concept of trust levels like gpg does. To be able to differentiate
|
||||
between valid signatures and trusted signatures the trust level of a signature
|
||||
verification is set to `fully` when the public key is present in the allowedSignersFile.
|
||||
Otherwise the trust level is `undefined` and git verify-commit/tag will fail.
|
||||
+
|
||||
This file can be set to a location outside of the repository and every developer
|
||||
maintains their own trust store. A central repository server could generate this
|
||||
file automatically from ssh keys with push access to verify the code against.
|
||||
In a corporate setting this file is probably generated at a global location
|
||||
from automation that already handles developer ssh keys.
|
||||
+
|
||||
A repository that only allows signed commits can store the file
|
||||
in the repository itself using a path relative to the top-level of the working tree.
|
||||
This way only committers with an already valid key can add or change keys in the keyring.
|
||||
+
|
||||
Using a SSH CA key with the cert-authority option
|
||||
(see ssh-keygen(1) "CERTIFICATES") is also valid.
|
||||
|
||||
gpg.ssh.revocationFile::
|
||||
Either a SSH KRL or a list of revoked public keys (without the principal prefix).
|
||||
See ssh-keygen(1) for details.
|
||||
If a public key is found in this file then it will always be treated
|
||||
as having trust level "never" and signatures will show as invalid.
|
||||
|
@ -11,7 +11,7 @@ gui.displayUntracked::
|
||||
in the file list. The default is "true".
|
||||
|
||||
gui.encoding::
|
||||
Specifies the default encoding to use for displaying of
|
||||
Specifies the default character encoding to use for displaying of
|
||||
file contents in linkgit:git-gui[1] and linkgit:gitk[1].
|
||||
It can be overridden by setting the 'encoding' attribute
|
||||
for relevant files (see linkgit:gitattributes[5]).
|
||||
|
@ -9,13 +9,15 @@ help.format::
|
||||
|
||||
help.autoCorrect::
|
||||
If git detects typos and can identify exactly one valid command similar
|
||||
to the error, git will automatically run the intended command after
|
||||
waiting a duration of time defined by this configuration value in
|
||||
deciseconds (0.1 sec). If this value is 0, the suggested corrections
|
||||
will be shown, but not executed. If it is a negative integer, or
|
||||
"immediate", the suggested command
|
||||
is run immediately. If "never", suggestions are not shown at all. The
|
||||
default value is zero.
|
||||
to the error, git will try to suggest the correct command or even
|
||||
run the suggestion automatically. Possible config values are:
|
||||
- 0 (default): show the suggested command.
|
||||
- positive number: run the suggested command after specified
|
||||
deciseconds (0.1 sec).
|
||||
- "immediate": run the suggested command immediately.
|
||||
- "prompt": show the suggestion and prompt for confirmation to run
|
||||
the command.
|
||||
- "never": don't run or show any suggested command.
|
||||
|
||||
help.htmlPath::
|
||||
Specify the path where the HTML documentation resides. File system paths
|
||||
|
@ -159,6 +159,10 @@ pack.writeBitmapHashCache::
|
||||
between an older, bitmapped pack and objects that have been
|
||||
pushed since the last gc). The downside is that it consumes 4
|
||||
bytes per object of disk space. Defaults to true.
|
||||
+
|
||||
When writing a multi-pack reachability bitmap, no new namehashes are
|
||||
computed; instead, any namehashes stored in an existing bitmap are
|
||||
permuted into their appropriate location when writing a new bitmap.
|
||||
|
||||
pack.writeReverseIndex::
|
||||
When true, git will write a corresponding .rev file (see:
|
||||
|
@ -18,10 +18,6 @@ When `merges` (or just 'm'), pass the `--rebase-merges` option to 'git rebase'
|
||||
so that the local merge commits are included in the rebase (see
|
||||
linkgit:git-rebase[1] for details).
|
||||
+
|
||||
When `preserve` (or just 'p', deprecated in favor of `merges`), also pass
|
||||
`--preserve-merges` along to 'git rebase' so that locally committed merge
|
||||
commits will not be flattened by running 'git pull'.
|
||||
+
|
||||
When the value is `interactive` (or just 'i'), the rebase is run in interactive
|
||||
mode.
|
||||
+
|
||||
|
@ -52,13 +52,17 @@ If you have multiple hideRefs values, later entries override earlier ones
|
||||
(and entries in more-specific config files override less-specific ones).
|
||||
+
|
||||
If a namespace is in use, the namespace prefix is stripped from each
|
||||
reference before it is matched against `transfer.hiderefs` patterns.
|
||||
reference before it is matched against `transfer.hiderefs` patterns. In
|
||||
order to match refs before stripping, add a `^` in front of the ref name. If
|
||||
you combine `!` and `^`, `!` must be specified first.
|
||||
+
|
||||
For example, if `refs/heads/master` is specified in `transfer.hideRefs` and
|
||||
the current namespace is `foo`, then `refs/namespaces/foo/refs/heads/master`
|
||||
is omitted from the advertisements but `refs/heads/master` and
|
||||
`refs/namespaces/bar/refs/heads/master` are still advertised as so-called
|
||||
"have" lines. In order to match refs before stripping, add a `^` in front of
|
||||
the ref name. If you combine `!` and `^`, `!` must be specified first.
|
||||
is omitted from the advertisements. If `uploadpack.allowRefInWant` is set,
|
||||
`upload-pack` will treat `want-ref refs/heads/master` in a protocol v2
|
||||
`fetch` command as if `refs/namespaces/foo/refs/heads/master` did not exist.
|
||||
`receive-pack`, on the other hand, will still advertise the object id the
|
||||
ref is pointing to without mentioning its name (a so-called ".have" line).
|
||||
+
|
||||
Even if you hide refs, a client may still be able to steal the target
|
||||
objects via the techniques described in the "SECURITY" section of the
|
||||
|
@ -36,3 +36,10 @@ user.signingKey::
|
||||
commit, you can override the default selection with this variable.
|
||||
This option is passed unchanged to gpg's --local-user parameter,
|
||||
so you may specify a key using any method that gpg supports.
|
||||
If gpg.format is set to "ssh" this can contain the literal ssh public
|
||||
key (e.g.: "ssh-rsa XXXXXX identifier") or a file which contains it and
|
||||
corresponds to the private key used for signing. The private key
|
||||
needs to be available via ssh-agent. Alternatively it can be set to
|
||||
a file containing a private key directly. If not set git will call
|
||||
gpg.ssh.defaultKeyCommand (e.g.: "ssh-add -L") and try to use the first
|
||||
key available.
|
||||
|
@ -59,7 +59,7 @@ Possible status letters are:
|
||||
- D: deletion of a file
|
||||
- M: modification of the contents or mode of a file
|
||||
- R: renaming of a file
|
||||
- T: change in the type of the file
|
||||
- T: change in the type of the file (regular file, symbolic link or submodule)
|
||||
- U: file is unmerged (you must complete the merge before it can
|
||||
be committed)
|
||||
- X: "unknown" change type (most probably a bug, please report it)
|
||||
|
@ -9,7 +9,7 @@ SYNOPSIS
|
||||
--------
|
||||
[verse]
|
||||
'git add' [--verbose | -v] [--dry-run | -n] [--force | -f] [--interactive | -i] [--patch | -p]
|
||||
[--edit | -e] [--[no-]all | --[no-]ignore-removal | [--update | -u]]
|
||||
[--edit | -e] [--[no-]all | --[no-]ignore-removal | [--update | -u]] [--sparse]
|
||||
[--intent-to-add | -N] [--refresh] [--ignore-errors] [--ignore-missing] [--renormalize]
|
||||
[--chmod=(+|-)x] [--pathspec-from-file=<file> [--pathspec-file-nul]]
|
||||
[--] [<pathspec>...]
|
||||
@ -79,6 +79,13 @@ in linkgit:gitglossary[7].
|
||||
--force::
|
||||
Allow adding otherwise ignored files.
|
||||
|
||||
--sparse::
|
||||
Allow updating index entries outside of the sparse-checkout cone.
|
||||
Normally, `git add` refuses to update index entries whose paths do
|
||||
not fit within the sparse-checkout cone, since those files might
|
||||
be removed from the working tree without warning. See
|
||||
linkgit:git-sparse-checkout[1] for more details.
|
||||
|
||||
-i::
|
||||
--interactive::
|
||||
Add modified contents in the working tree interactively to
|
||||
|
@ -178,6 +178,8 @@ default. You can use `--no-utf8` to override this.
|
||||
|
||||
--abort::
|
||||
Restore the original branch and abort the patching operation.
|
||||
Revert contents of files involved in the am operation to their
|
||||
pre-am state.
|
||||
|
||||
--quit::
|
||||
Abort the patching operation but keep HEAD and the index
|
||||
|
@ -93,12 +93,19 @@ BACKEND EXTRA OPTIONS
|
||||
|
||||
zip
|
||||
~~~
|
||||
-0::
|
||||
Store the files instead of deflating them.
|
||||
-9::
|
||||
Highest and slowest compression level. You can specify any
|
||||
number from 1 to 9 to adjust compression speed and ratio.
|
||||
-<digit>::
|
||||
Specify compression level. Larger values allow the command
|
||||
to spend more time to compress to smaller size. Supported
|
||||
values are from `-0` (store-only) to `-9` (best ratio).
|
||||
Default is `-6` if not given.
|
||||
|
||||
tar
|
||||
~~~
|
||||
-<number>::
|
||||
Specify compression level. The value will be passed to the
|
||||
compression command configured in `tar.<format>.command`. See
|
||||
manual page of the configured command for the list of supported
|
||||
levels and the default level if this option isn't specified.
|
||||
|
||||
CONFIGURATION
|
||||
-------------
|
||||
|
@ -11,8 +11,8 @@ SYNOPSIS
|
||||
'git blame' [-c] [-b] [-l] [--root] [-t] [-f] [-n] [-s] [-e] [-p] [-w] [--incremental]
|
||||
[-L <range>] [-S <revs-file>] [-M] [-C] [-C] [-C] [--since=<date>]
|
||||
[--ignore-rev <rev>] [--ignore-revs-file <file>]
|
||||
[--progress] [--abbrev=<n>] [<rev> | --contents <file> | --reverse <rev>..<rev>]
|
||||
[--] <file>
|
||||
[--color-lines] [--color-by-age] [--progress] [--abbrev=<n>]
|
||||
[<rev> | --contents <file> | --reverse <rev>..<rev>] [--] <file>
|
||||
|
||||
DESCRIPTION
|
||||
-----------
|
||||
@ -93,6 +93,19 @@ include::blame-options.txt[]
|
||||
is used for a caret to mark the boundary commit.
|
||||
|
||||
|
||||
THE DEFAULT FORMAT
|
||||
------------------
|
||||
|
||||
When neither `--porcelain` nor `--incremental` option is specified,
|
||||
`git blame` will output annotation for each line with:
|
||||
|
||||
- abbreviated object name for the commit the line came from;
|
||||
- author ident (by default author name and date, unless `-s` or `-e`
|
||||
is specified); and
|
||||
- line number
|
||||
|
||||
before the line contents.
|
||||
|
||||
THE PORCELAIN FORMAT
|
||||
--------------------
|
||||
|
||||
|
@ -118,20 +118,21 @@ OPTIONS
|
||||
Reset <branchname> to <startpoint>, even if <branchname> exists
|
||||
already. Without `-f`, 'git branch' refuses to change an existing branch.
|
||||
In combination with `-d` (or `--delete`), allow deleting the
|
||||
branch irrespective of its merged status. In combination with
|
||||
branch irrespective of its merged status, or whether it even
|
||||
points to a valid commit. In combination with
|
||||
`-m` (or `--move`), allow renaming the branch even if the new
|
||||
branch name already exists, the same applies for `-c` (or `--copy`).
|
||||
|
||||
-m::
|
||||
--move::
|
||||
Move/rename a branch and the corresponding reflog.
|
||||
Move/rename a branch, together with its config and reflog.
|
||||
|
||||
-M::
|
||||
Shortcut for `--move --force`.
|
||||
|
||||
-c::
|
||||
--copy::
|
||||
Copy a branch and the corresponding reflog.
|
||||
Copy a branch, together with its config and reflog.
|
||||
|
||||
-C::
|
||||
Shortcut for `--copy --force`.
|
||||
|
@ -40,8 +40,8 @@ OPTIONS
|
||||
-------
|
||||
-o <path>::
|
||||
--output-directory <path>::
|
||||
Place the resulting bug report file in `<path>` instead of the root of
|
||||
the Git repository.
|
||||
Place the resulting bug report file in `<path>` instead of the current
|
||||
directory.
|
||||
|
||||
-s <format>::
|
||||
--suffix <format>::
|
||||
|
@ -13,26 +13,53 @@ SYNOPSIS
|
||||
[--version=<version>] <file> <git-rev-list-args>
|
||||
'git bundle' verify [-q | --quiet] <file>
|
||||
'git bundle' list-heads <file> [<refname>...]
|
||||
'git bundle' unbundle <file> [<refname>...]
|
||||
'git bundle' unbundle [--progress] <file> [<refname>...]
|
||||
|
||||
DESCRIPTION
|
||||
-----------
|
||||
|
||||
Some workflows require that one or more branches of development on one
|
||||
machine be replicated on another machine, but the two machines cannot
|
||||
be directly connected, and therefore the interactive Git protocols (git,
|
||||
ssh, http) cannot be used.
|
||||
Create, unpack, and manipulate "bundle" files. Bundles are used for
|
||||
the "offline" transfer of Git objects without an active "server"
|
||||
sitting on the other side of the network connection.
|
||||
|
||||
The 'git bundle' command packages objects and references in an archive
|
||||
at the originating machine, which can then be imported into another
|
||||
repository using 'git fetch', 'git pull', or 'git clone',
|
||||
after moving the archive by some means (e.g., by sneakernet).
|
||||
They can be used to create both incremental and full backups of a
|
||||
repository, and to relay the state of the references in one repository
|
||||
to another.
|
||||
|
||||
As no
|
||||
direct connection between the repositories exists, the user must specify a
|
||||
basis for the bundle that is held by the destination repository: the
|
||||
bundle assumes that all objects in the basis are already in the
|
||||
destination repository.
|
||||
Git commands that fetch or otherwise "read" via protocols such as
|
||||
`ssh://` and `https://` can also operate on bundle files. It is
|
||||
possible linkgit:git-clone[1] a new repository from a bundle, to use
|
||||
linkgit:git-fetch[1] to fetch from one, and to list the references
|
||||
contained within it with linkgit:git-ls-remote[1]. There's no
|
||||
corresponding "write" support, i.e.a 'git push' into a bundle is not
|
||||
supported.
|
||||
|
||||
See the "EXAMPLES" section below for examples of how to use bundles.
|
||||
|
||||
BUNDLE FORMAT
|
||||
-------------
|
||||
|
||||
Bundles are `.pack` files (see linkgit:git-pack-objects[1]) with a
|
||||
header indicating what references are contained within the bundle.
|
||||
|
||||
Like the the packed archive format itself bundles can either be
|
||||
self-contained, or be created using exclusions.
|
||||
See the "OBJECT PREREQUISITES" section below.
|
||||
|
||||
Bundles created using revision exclusions are "thin packs" created
|
||||
using the `--thin` option to linkgit:git-pack-objects[1], and
|
||||
unbundled using the `--fix-thin` option to linkgit:git-index-pack[1].
|
||||
|
||||
There is no option to create a "thick pack" when using revision
|
||||
exclusions, and users should not be concerned about the difference. By
|
||||
using "thin packs", bundles created using exclusions are smaller in
|
||||
size. That they're "thin" under the hood is merely noted here as a
|
||||
curiosity, and as a reference to other documentation.
|
||||
|
||||
See link:technical/bundle-format.html[the `bundle-format`
|
||||
documentation] for more details and the discussion of "thin pack" in
|
||||
link:technical/pack-format.html[the pack format documentation] for
|
||||
further details.
|
||||
|
||||
OPTIONS
|
||||
-------
|
||||
@ -117,28 +144,88 @@ unbundle <file>::
|
||||
SPECIFYING REFERENCES
|
||||
---------------------
|
||||
|
||||
'git bundle' will only package references that are shown by
|
||||
'git show-ref': this includes heads, tags, and remote heads. References
|
||||
such as `master~1` cannot be packaged, but are perfectly suitable for
|
||||
defining the basis. More than one reference may be packaged, and more
|
||||
than one basis can be specified. The objects packaged are those not
|
||||
contained in the union of the given bases. Each basis can be
|
||||
specified explicitly (e.g. `^master~10`), or implicitly (e.g.
|
||||
`master~10..master`, `--since=10.days.ago master`).
|
||||
Revisions must be accompanied by reference names to be packaged in a
|
||||
bundle.
|
||||
|
||||
More than one reference may be packaged, and more than one set of prerequisite objects can
|
||||
be specified. The objects packaged are those not contained in the
|
||||
union of the prerequisites.
|
||||
|
||||
The 'git bundle create' command resolves the reference names for you
|
||||
using the same rules as `git rev-parse --abbrev-ref=loose`. Each
|
||||
prerequisite can be specified explicitly (e.g. `^master~10`), or implicitly
|
||||
(e.g. `master~10..master`, `--since=10.days.ago master`).
|
||||
|
||||
All of these simple cases are OK (assuming we have a "master" and
|
||||
"next" branch):
|
||||
|
||||
----------------
|
||||
$ git bundle create master.bundle master
|
||||
$ echo master | git bundle create master.bundle --stdin
|
||||
$ git bundle create master-and-next.bundle master next
|
||||
$ (echo master; echo next) | git bundle create master-and-next.bundle --stdin
|
||||
----------------
|
||||
|
||||
And so are these (and the same but omitted `--stdin` examples):
|
||||
|
||||
----------------
|
||||
$ git bundle create recent-master.bundle master~10..master
|
||||
$ git bundle create recent-updates.bundle master~10..master next~5..next
|
||||
----------------
|
||||
|
||||
A revision name or a range whose right-hand-side cannot be resolved to
|
||||
a reference is not accepted:
|
||||
|
||||
----------------
|
||||
$ git bundle create HEAD.bundle $(git rev-parse HEAD)
|
||||
fatal: Refusing to create empty bundle.
|
||||
$ git bundle create master-yesterday.bundle master~10..master~5
|
||||
fatal: Refusing to create empty bundle.
|
||||
----------------
|
||||
|
||||
OBJECT PREREQUISITES
|
||||
--------------------
|
||||
|
||||
When creating bundles it is possible to create a self-contained bundle
|
||||
that can be unbundled in a repository with no common history, as well
|
||||
as providing negative revisions to exclude objects needed in the
|
||||
earlier parts of the history.
|
||||
|
||||
Feeding a revision such as `new` to `git bundle create` will create a
|
||||
bundle file that contains all the objects reachable from the revision
|
||||
`new`. That bundle can be unbundled in any repository to obtain a full
|
||||
history that leads to the revision `new`:
|
||||
|
||||
----------------
|
||||
$ git bundle create full.bundle new
|
||||
----------------
|
||||
|
||||
A revision range such as `old..new` will produce a bundle file that
|
||||
will require the revision `old` (and any objects reachable from it)
|
||||
to exist for the bundle to be "unbundle"-able:
|
||||
|
||||
----------------
|
||||
$ git bundle create full.bundle old..new
|
||||
----------------
|
||||
|
||||
A self-contained bundle without any prerequisites can be extracted
|
||||
into anywhere, even into an empty repository, or be cloned from
|
||||
(i.e., `new`, but not `old..new`).
|
||||
|
||||
It is very important that the basis used be held by the destination.
|
||||
It is okay to err on the side of caution, causing the bundle file
|
||||
to contain objects already in the destination, as these are ignored
|
||||
when unpacking at the destination.
|
||||
|
||||
`git clone` can use any bundle created without negative refspecs
|
||||
(e.g., `new`, but not `old..new`).
|
||||
If you want to match `git clone --mirror`, which would include your
|
||||
refs such as `refs/remotes/*`, use `--all`.
|
||||
If you want to provide the same set of refs that a clone directly
|
||||
from the source repository would get, use `--branches --tags` for
|
||||
the `<git-rev-list-args>`.
|
||||
|
||||
The 'git bundle verify' command can be used to check whether your
|
||||
recipient repository has the required prerequisite commits for a
|
||||
bundle.
|
||||
|
||||
EXAMPLES
|
||||
--------
|
||||
|
||||
@ -149,7 +236,7 @@ but we can move data from A to B via some mechanism (CD, email, etc.).
|
||||
We want to update R2 with development made on the branch master in R1.
|
||||
|
||||
To bootstrap the process, you can first create a bundle that does not have
|
||||
any basis. You can use a tag to remember up to what commit you last
|
||||
any prerequisites. You can use a tag to remember up to what commit you last
|
||||
processed, in order to make it easy to later update the other repository
|
||||
with an incremental bundle:
|
||||
|
||||
@ -200,7 +287,7 @@ machineB$ git pull
|
||||
|
||||
If you know up to what commit the intended recipient repository should
|
||||
have the necessary objects, you can use that knowledge to specify the
|
||||
basis, giving a cut-off point to limit the revisions and objects that go
|
||||
prerequisites, giving a cut-off point to limit the revisions and objects that go
|
||||
in the resulting bundle. The previous example used the lastR2bundle tag
|
||||
for this purpose, but you can use any other options that you would give to
|
||||
the linkgit:git-log[1] command. Here are more examples:
|
||||
@ -211,7 +298,7 @@ You can use a tag that is present in both:
|
||||
$ git bundle create mybundle v1.0.0..master
|
||||
----------------
|
||||
|
||||
You can use a basis based on time:
|
||||
You can use a prerequisite based on time:
|
||||
|
||||
----------------
|
||||
$ git bundle create mybundle --since=10.days master
|
||||
@ -224,7 +311,7 @@ $ git bundle create mybundle -10 master
|
||||
----------------
|
||||
|
||||
You can run `git-bundle verify` to see if you can extract from a bundle
|
||||
that was created with a basis:
|
||||
that was created with a prerequisite:
|
||||
|
||||
----------------
|
||||
$ git bundle verify mybundle
|
||||
|
@ -94,8 +94,10 @@ OPTIONS
|
||||
Instead of reading a list of objects on stdin, perform the
|
||||
requested batch operation on all objects in the repository and
|
||||
any alternate object stores (not just reachable objects).
|
||||
Requires `--batch` or `--batch-check` be specified. Note that
|
||||
the objects are visited in order sorted by their hashes.
|
||||
Requires `--batch` or `--batch-check` be specified. By default,
|
||||
the objects are visited in order sorted by their hashes; see
|
||||
also `--unordered` below. Objects are presented as-is, without
|
||||
respecting the "replace" mechanism of linkgit:git-replace[1].
|
||||
|
||||
--buffer::
|
||||
Normally batch output is flushed after each object is output, so
|
||||
|
@ -118,8 +118,9 @@ OPTIONS
|
||||
-f::
|
||||
--force::
|
||||
When switching branches, proceed even if the index or the
|
||||
working tree differs from `HEAD`. This is used to throw away
|
||||
local changes.
|
||||
working tree differs from `HEAD`, and even if there are untracked
|
||||
files in the way. This is used to throw away local changes and
|
||||
any untracked files or directories that are in the way.
|
||||
+
|
||||
When checking out paths from the index, do not fail upon unmerged
|
||||
entries; instead, unmerged entries are ignored.
|
||||
|
@ -39,7 +39,7 @@ OPTIONS
|
||||
--indent=<string>::
|
||||
String to be printed at the beginning of each line.
|
||||
|
||||
--nl=<N>::
|
||||
--nl=<string>::
|
||||
String to be printed at the end of each line,
|
||||
including newline character.
|
||||
|
||||
|
@ -71,6 +71,9 @@ codes are:
|
||||
|
||||
On success, the command returns the exit code 0.
|
||||
|
||||
A list of all available configuration variables can be obtained using the
|
||||
`git help --config` command.
|
||||
|
||||
[[OPTIONS]]
|
||||
OPTIONS
|
||||
-------
|
||||
|
@ -99,7 +99,7 @@ looks like
|
||||
|
||||
------
|
||||
|
||||
Only anonymous access is provided by pserve by default. To commit you
|
||||
Only anonymous access is provided by pserver by default. To commit you
|
||||
will have to create pserver accounts, simply add a gitcvs.authdb
|
||||
setting in the config file of the repositories you want the cvsserver
|
||||
to allow writes to, for example:
|
||||
@ -114,21 +114,20 @@ The format of these files is username followed by the encrypted password,
|
||||
for example:
|
||||
|
||||
------
|
||||
myuser:$1Oyx5r9mdGZ2
|
||||
myuser:$1$BA)@$vbnMJMDym7tA32AamXrm./
|
||||
myuser:sqkNi8zPf01HI
|
||||
myuser:$1$9K7FzU28$VfF6EoPYCJEYcVQwATgOP/
|
||||
myuser:$5$.NqmNH1vwfzGpV8B$znZIcumu1tNLATgV2l6e1/mY8RzhUDHMOaVOeL1cxV3
|
||||
------
|
||||
You can use the 'htpasswd' facility that comes with Apache to make these
|
||||
files, but Apache's MD5 crypt method differs from the one used by most C
|
||||
library's crypt() function, so don't use the -m option.
|
||||
files, but only with the -d option (or -B if your system suports it).
|
||||
|
||||
Alternatively you can produce the password with perl's crypt() operator:
|
||||
-----
|
||||
perl -e 'my ($user, $pass) = @ARGV; printf "%s:%s\n", $user, crypt($user, $pass)' $USER password
|
||||
-----
|
||||
Preferably use the system specific utility that manages password hash
|
||||
creation in your platform (e.g. mkpasswd in Linux, encrypt in OpenBSD or
|
||||
pwhash in NetBSD) and paste it in the right location.
|
||||
|
||||
Then provide your password via the pserver method, for example:
|
||||
------
|
||||
cvs -d:pserver:someuser:somepassword <at> server/path/repo.git co <HEAD_name>
|
||||
cvs -d:pserver:someuser:somepassword@server:/path/repo.git co <HEAD_name>
|
||||
------
|
||||
No special setup is needed for SSH access, other than having Git tools
|
||||
in the PATH. If you have clients that do not accept the CVS_SERVER
|
||||
@ -138,7 +137,7 @@ Note: Newer CVS versions (>= 1.12.11) also support specifying
|
||||
CVS_SERVER directly in CVSROOT like
|
||||
|
||||
------
|
||||
cvs -d ":ext;CVS_SERVER=git cvsserver:user@server/path/repo.git" co <HEAD_name>
|
||||
cvs -d ":ext;CVS_SERVER=git cvsserver:user@server/path/repo.git" co <HEAD_name>
|
||||
------
|
||||
This has the advantage that it will be saved in your 'CVS/Root' files and
|
||||
you don't need to worry about always setting the correct environment
|
||||
@ -186,8 +185,8 @@ allowing access over SSH.
|
||||
+
|
||||
--
|
||||
------
|
||||
export CVSROOT=:ext:user@server:/var/git/project.git
|
||||
export CVS_SERVER="git cvsserver"
|
||||
export CVSROOT=:ext:user@server:/var/git/project.git
|
||||
export CVS_SERVER="git cvsserver"
|
||||
------
|
||||
--
|
||||
4. For SSH clients that will make commits, make sure their server-side
|
||||
@ -203,7 +202,7 @@ allowing access over SSH.
|
||||
`project-master` directory:
|
||||
+
|
||||
------
|
||||
cvs co -d project-master master
|
||||
cvs co -d project-master master
|
||||
------
|
||||
|
||||
[[dbbackend]]
|
||||
|
@ -235,6 +235,15 @@ and `date` to extract the named component. For email fields (`authoremail`,
|
||||
without angle brackets, and `:localpart` to get the part before the `@` symbol
|
||||
out of the trimmed email.
|
||||
|
||||
The raw data in an object is `raw`.
|
||||
|
||||
raw:size::
|
||||
The raw data size of the object.
|
||||
|
||||
Note that `--format=%(raw)` can not be used with `--python`, `--shell`, `--tcl`,
|
||||
because such language may not support arbitrary binary data in their string
|
||||
variable type.
|
||||
|
||||
The message in a commit or a tag object is `contents`, from which
|
||||
`contents:<part>` can be used to extract various parts out of:
|
||||
|
||||
|
@ -8,8 +8,10 @@ git-help - Display help information about Git
|
||||
SYNOPSIS
|
||||
--------
|
||||
[verse]
|
||||
'git help' [-a|--all [--[no-]verbose]] [-g|--guides]
|
||||
[-i|--info|-m|--man|-w|--web] [COMMAND|GUIDE]
|
||||
'git help' [-a|--all [--[no-]verbose]]
|
||||
[[-i|--info] [-m|--man] [-w|--web]] [COMMAND|GUIDE]
|
||||
'git help' [-g|--guides]
|
||||
'git help' [-c|--config]
|
||||
|
||||
DESCRIPTION
|
||||
-----------
|
||||
@ -58,8 +60,7 @@ OPTIONS
|
||||
|
||||
-g::
|
||||
--guides::
|
||||
Prints a list of the Git concept guides on the standard output. This
|
||||
option overrides any given command or guide name.
|
||||
Prints a list of the Git concept guides on the standard output.
|
||||
|
||||
-i::
|
||||
--info::
|
||||
|
@ -16,7 +16,9 @@ A simple CGI program to serve the contents of a Git repository to Git
|
||||
clients accessing the repository over http:// and https:// protocols.
|
||||
The program supports clients fetching using both the smart HTTP protocol
|
||||
and the backwards-compatible dumb HTTP protocol, as well as clients
|
||||
pushing using the smart HTTP protocol.
|
||||
pushing using the smart HTTP protocol. It also supports Git's
|
||||
more-efficient "v2" protocol if properly configured; see the
|
||||
discussion of `GIT_PROTOCOL` in the ENVIRONMENT section below.
|
||||
|
||||
It verifies that the directory has the magic file
|
||||
"git-daemon-export-ok", and it will refuse to export any Git directory
|
||||
@ -77,6 +79,18 @@ Apache 2.x::
|
||||
SetEnv GIT_PROJECT_ROOT /var/www/git
|
||||
SetEnv GIT_HTTP_EXPORT_ALL
|
||||
ScriptAlias /git/ /usr/libexec/git-core/git-http-backend/
|
||||
|
||||
# This is not strictly necessary using Apache and a modern version of
|
||||
# git-http-backend, as the webserver will pass along the header in the
|
||||
# environment as HTTP_GIT_PROTOCOL, and http-backend will copy that into
|
||||
# GIT_PROTOCOL. But you may need this line (or something similar if you
|
||||
# are using a different webserver), or if you want to support older Git
|
||||
# versions that did not do that copying.
|
||||
#
|
||||
# Having the webserver set up GIT_PROTOCOL is perfectly fine even with
|
||||
# modern versions (and will take precedence over HTTP_GIT_PROTOCOL,
|
||||
# which means it can be used to override the client's request).
|
||||
SetEnvIf Git-Protocol ".*" GIT_PROTOCOL=$0
|
||||
----------------------------------------------------------------
|
||||
+
|
||||
To enable anonymous read access but authenticated write access,
|
||||
@ -264,6 +278,16 @@ a repository with an extremely large number of refs. The value can be
|
||||
specified with a unit (e.g., `100M` for 100 megabytes). The default is
|
||||
10 megabytes.
|
||||
|
||||
Clients may probe for optional protocol capabilities (like the v2
|
||||
protocol) using the `Git-Protocol` HTTP header. In order to support
|
||||
these, the contents of that header must appear in the `GIT_PROTOCOL`
|
||||
environment variable. Most webservers will pass this header to the CGI
|
||||
via the `HTTP_GIT_PROTOCOL` variable, and `git-http-backend` will
|
||||
automatically copy that to `GIT_PROTOCOL`. However, some webservers may
|
||||
be more selective about which headers they'll pass, in which case they
|
||||
need to be configured explicitly (see the mention of `Git-Protocol` in
|
||||
the Apache config from the earlier EXAMPLES section).
|
||||
|
||||
The backend process sets GIT_COMMITTER_NAME to '$REMOTE_USER' and
|
||||
GIT_COMMITTER_EMAIL to '$\{REMOTE_USER}@http.$\{REMOTE_ADDR\}',
|
||||
ensuring that any reflogs created by 'git-receive-pack' contain some
|
||||
|
@ -82,6 +82,12 @@ OPTIONS
|
||||
--strict::
|
||||
Die, if the pack contains broken objects or links.
|
||||
|
||||
--progress-title::
|
||||
For internal use only.
|
||||
+
|
||||
Set the title of the progress bar. The title is "Receiving objects" by
|
||||
default and "Indexing objects" when `--stdin` is specified.
|
||||
|
||||
--check-self-contained-and-connected::
|
||||
Die if the pack contains broken links. For internal use only.
|
||||
|
||||
|
@ -179,6 +179,17 @@ OPTIONS
|
||||
`maintenance.<task>.enabled` configured as `true` are considered.
|
||||
See the 'TASKS' section for the list of accepted `<task>` values.
|
||||
|
||||
--scheduler=auto|crontab|systemd-timer|launchctl|schtasks::
|
||||
When combined with the `start` subcommand, specify the scheduler
|
||||
for running the hourly, daily and weekly executions of
|
||||
`git maintenance run`.
|
||||
Possible values for `<scheduler>` are `auto`, `crontab`
|
||||
(POSIX), `systemd-timer` (Linux), `launchctl` (macOS), and
|
||||
`schtasks` (Windows). When `auto` is specified, the
|
||||
appropriate platform-specific scheduler is used; on Linux,
|
||||
`systemd-timer` is used if available, otherwise
|
||||
`crontab`. Default is `auto`.
|
||||
|
||||
|
||||
TROUBLESHOOTING
|
||||
---------------
|
||||
@ -277,6 +288,52 @@ schedule to ensure you are executing the correct binaries in your
|
||||
schedule.
|
||||
|
||||
|
||||
BACKGROUND MAINTENANCE ON LINUX SYSTEMD SYSTEMS
|
||||
-----------------------------------------------
|
||||
|
||||
While Linux supports `cron`, depending on the distribution, `cron` may
|
||||
be an optional package not necessarily installed. On modern Linux
|
||||
distributions, systemd timers are superseding it.
|
||||
|
||||
If user systemd timers are available, they will be used as a replacement
|
||||
of `cron`.
|
||||
|
||||
In this case, `git maintenance start` will create user systemd timer units
|
||||
and start the timers. The current list of user-scheduled tasks can be found
|
||||
by running `systemctl --user list-timers`. The timers written by `git
|
||||
maintenance start` are similar to this:
|
||||
|
||||
-----------------------------------------------------------------------
|
||||
$ systemctl --user list-timers
|
||||
NEXT LEFT LAST PASSED UNIT ACTIVATES
|
||||
Thu 2021-04-29 19:00:00 CEST 42min left Thu 2021-04-29 18:00:11 CEST 17min ago git-maintenance@hourly.timer git-maintenance@hourly.service
|
||||
Fri 2021-04-30 00:00:00 CEST 5h 42min left Thu 2021-04-29 00:00:11 CEST 18h ago git-maintenance@daily.timer git-maintenance@daily.service
|
||||
Mon 2021-05-03 00:00:00 CEST 3 days left Mon 2021-04-26 00:00:11 CEST 3 days ago git-maintenance@weekly.timer git-maintenance@weekly.service
|
||||
-----------------------------------------------------------------------
|
||||
|
||||
One timer is registered for each `--schedule=<frequency>` option.
|
||||
|
||||
The definition of the systemd units can be inspected in the following files:
|
||||
|
||||
-----------------------------------------------------------------------
|
||||
~/.config/systemd/user/git-maintenance@.timer
|
||||
~/.config/systemd/user/git-maintenance@.service
|
||||
~/.config/systemd/user/timers.target.wants/git-maintenance@hourly.timer
|
||||
~/.config/systemd/user/timers.target.wants/git-maintenance@daily.timer
|
||||
~/.config/systemd/user/timers.target.wants/git-maintenance@weekly.timer
|
||||
-----------------------------------------------------------------------
|
||||
|
||||
`git maintenance start` will overwrite these files and start the timer
|
||||
again with `systemctl --user`, so any customization should be done by
|
||||
creating a drop-in file, i.e. a `.conf` suffixed file in the
|
||||
`~/.config/systemd/user/git-maintenance@.service.d` directory.
|
||||
|
||||
`git maintenance stop` will stop the user systemd timers and delete
|
||||
the above mentioned files.
|
||||
|
||||
For more details, see `systemd.timer(5)`.
|
||||
|
||||
|
||||
BACKGROUND MAINTENANCE ON MACOS SYSTEMS
|
||||
---------------------------------------
|
||||
|
||||
|
@ -61,6 +61,8 @@ merge has resulted in conflicts.
|
||||
|
||||
OPTIONS
|
||||
-------
|
||||
:git-merge: 1
|
||||
|
||||
include::merge-options.txt[]
|
||||
|
||||
-m <msg>::
|
||||
|
@ -9,8 +9,7 @@ git-multi-pack-index - Write and verify multi-pack-indexes
|
||||
SYNOPSIS
|
||||
--------
|
||||
[verse]
|
||||
'git multi-pack-index' [--object-dir=<dir>] [--[no-]progress]
|
||||
[--preferred-pack=<pack>] <subcommand>
|
||||
'git multi-pack-index' [--object-dir=<dir>] [--[no-]bitmap] <sub-command>
|
||||
|
||||
DESCRIPTION
|
||||
-----------
|
||||
@ -23,10 +22,13 @@ OPTIONS
|
||||
Use given directory for the location of Git objects. We check
|
||||
`<dir>/packs/multi-pack-index` for the current MIDX file, and
|
||||
`<dir>/packs` for the pack-files to index.
|
||||
+
|
||||
`<dir>` must be an alternate of the current repository.
|
||||
|
||||
--[no-]progress::
|
||||
Turn progress on/off explicitly. If neither is specified, progress is
|
||||
shown if standard error is connected to a terminal.
|
||||
shown if standard error is connected to a terminal. Supported by
|
||||
sub-commands `write`, `verify`, `expire`, and `repack.
|
||||
|
||||
The following subcommands are available:
|
||||
|
||||
@ -37,9 +39,31 @@ write::
|
||||
--
|
||||
--preferred-pack=<pack>::
|
||||
Optionally specify the tie-breaking pack used when
|
||||
multiple packs contain the same object. If not given,
|
||||
ties are broken in favor of the pack with the lowest
|
||||
mtime.
|
||||
multiple packs contain the same object. `<pack>` must
|
||||
contain at least one object. If not given, ties are
|
||||
broken in favor of the pack with the lowest mtime.
|
||||
|
||||
--[no-]bitmap::
|
||||
Control whether or not a multi-pack bitmap is written.
|
||||
|
||||
--stdin-packs::
|
||||
Write a multi-pack index containing only the set of
|
||||
line-delimited pack index basenames provided over stdin.
|
||||
|
||||
--refs-snapshot=<path>::
|
||||
With `--bitmap`, optionally specify a file which
|
||||
contains a "refs snapshot" taken prior to repacking.
|
||||
+
|
||||
A reference snapshot is composed of line-delimited OIDs corresponding to
|
||||
the reference tips, usually taken by `git repack` prior to generating a
|
||||
new pack. A line may optionally start with a `+` character to indicate
|
||||
that the reference which corresponds to that OID is "preferred" (see
|
||||
linkgit:git-config[1]'s `pack.preferBitmapTips`.)
|
||||
+
|
||||
The file given at `<path>` is expected to be readable, and can contain
|
||||
duplicates. (If a given OID is given more than once, it is marked as
|
||||
preferred if at least one instance of it begins with the special `+`
|
||||
marker).
|
||||
--
|
||||
|
||||
verify::
|
||||
@ -75,19 +99,26 @@ associated `.keep` file will not be selected for the batch to repack.
|
||||
EXAMPLES
|
||||
--------
|
||||
|
||||
* Write a MIDX file for the packfiles in the current .git folder.
|
||||
* Write a MIDX file for the packfiles in the current `.git` directory.
|
||||
+
|
||||
-----------------------------------------------
|
||||
$ git multi-pack-index write
|
||||
-----------------------------------------------
|
||||
|
||||
* Write a MIDX file for the packfiles in the current `.git` directory with a
|
||||
corresponding bitmap.
|
||||
+
|
||||
-------------------------------------------------------------
|
||||
$ git multi-pack-index write --preferred-pack=<pack> --bitmap
|
||||
-------------------------------------------------------------
|
||||
|
||||
* Write a MIDX file for the packfiles in an alternate object store.
|
||||
+
|
||||
-----------------------------------------------
|
||||
$ git multi-pack-index --object-dir <alt> write
|
||||
-----------------------------------------------
|
||||
|
||||
* Verify the MIDX file for the packfiles in the current .git folder.
|
||||
* Verify the MIDX file for the packfiles in the current `.git` directory.
|
||||
+
|
||||
-----------------------------------------------
|
||||
$ git multi-pack-index verify
|
||||
|
@ -15,14 +15,17 @@ SYNOPSIS
|
||||
DESCRIPTION
|
||||
-----------
|
||||
|
||||
Incorporates changes from a remote repository into the current
|
||||
branch. In its default mode, `git pull` is shorthand for
|
||||
`git fetch` followed by `git merge FETCH_HEAD`.
|
||||
Incorporates changes from a remote repository into the current branch.
|
||||
If the current branch is behind the remote, then by default it will
|
||||
fast-forward the current branch to match the remote. If the current
|
||||
branch and the remote have diverged, the user needs to specify how to
|
||||
reconcile the divergent branches with `--rebase` or `--no-rebase` (or
|
||||
the corresponding configuration option in `pull.rebase`).
|
||||
|
||||
More precisely, 'git pull' runs 'git fetch' with the given
|
||||
parameters and calls 'git merge' to merge the retrieved branch
|
||||
heads into the current branch.
|
||||
With `--rebase`, it runs 'git rebase' instead of 'git merge'.
|
||||
More precisely, `git pull` runs `git fetch` with the given parameters
|
||||
and then depending on configuration options or command line flags,
|
||||
will call either `git rebase` or `git merge` to reconcile diverging
|
||||
branches.
|
||||
|
||||
<repository> should be the name of a remote repository as
|
||||
passed to linkgit:git-fetch[1]. <refspec> can name an
|
||||
@ -102,7 +105,7 @@ Options related to merging
|
||||
include::merge-options.txt[]
|
||||
|
||||
-r::
|
||||
--rebase[=false|true|merges|preserve|interactive]::
|
||||
--rebase[=false|true|merges|interactive]::
|
||||
When true, rebase the current branch on top of the upstream
|
||||
branch after fetching. If there is a remote-tracking branch
|
||||
corresponding to the upstream branch and the upstream branch
|
||||
@ -113,10 +116,6 @@ When set to `merges`, rebase using `git rebase --rebase-merges` so that
|
||||
the local merge commits are included in the rebase (see
|
||||
linkgit:git-rebase[1] for details).
|
||||
+
|
||||
When set to `preserve` (deprecated in favor of `merges`), rebase with the
|
||||
`--preserve-merges` option passed to `git rebase` so that locally created
|
||||
merge commits will not be flattened.
|
||||
+
|
||||
When false, merge the upstream branch into the current branch.
|
||||
+
|
||||
When `interactive`, enable the interactive mode of rebase.
|
||||
@ -132,7 +131,7 @@ published that history already. Do *not* use this option
|
||||
unless you have read linkgit:git-rebase[1] carefully.
|
||||
|
||||
--no-rebase::
|
||||
Override earlier --rebase.
|
||||
This is shorthand for --rebase=false.
|
||||
|
||||
Options related to fetching
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
@ -10,8 +10,7 @@ SYNOPSIS
|
||||
--------
|
||||
[verse]
|
||||
'git read-tree' [[-m [--trivial] [--aggressive] | --reset | --prefix=<prefix>]
|
||||
[-u [--exclude-per-directory=<gitignore>] | -i]]
|
||||
[--index-output=<file>] [--no-sparse-checkout]
|
||||
[-u | -i]] [--index-output=<file>] [--no-sparse-checkout]
|
||||
(--empty | <tree-ish1> [<tree-ish2> [<tree-ish3>]])
|
||||
|
||||
|
||||
@ -39,8 +38,9 @@ OPTIONS
|
||||
|
||||
--reset::
|
||||
Same as -m, except that unmerged entries are discarded instead
|
||||
of failing. When used with `-u`, updates leading to loss of
|
||||
working tree changes will not abort the operation.
|
||||
of failing. When used with `-u`, updates leading to loss of
|
||||
working tree changes or untracked files or directories will not
|
||||
abort the operation.
|
||||
|
||||
-u::
|
||||
After a successful merge, update the files in the work
|
||||
@ -88,21 +88,6 @@ OPTIONS
|
||||
The command will refuse to overwrite entries that already
|
||||
existed in the original index file.
|
||||
|
||||
--exclude-per-directory=<gitignore>::
|
||||
When running the command with `-u` and `-m` options, the
|
||||
merge result may need to overwrite paths that are not
|
||||
tracked in the current branch. The command usually
|
||||
refuses to proceed with the merge to avoid losing such a
|
||||
path. However this safety valve sometimes gets in the
|
||||
way. For example, it often happens that the other
|
||||
branch added a file that used to be a generated file in
|
||||
your branch, and the safety valve triggers when you try
|
||||
to switch to that branch after you ran `make` but before
|
||||
running `make clean` to remove the generated file. This
|
||||
option tells the command to read per-directory exclude
|
||||
file (usually '.gitignore') and allows such an untracked
|
||||
but explicitly ignored file to be overwritten.
|
||||
|
||||
--index-output=<file>::
|
||||
Instead of writing the results out to `$GIT_INDEX_FILE`,
|
||||
write the resulting index in the named file. While the
|
||||
|
@ -79,9 +79,10 @@ remain the checked-out branch.
|
||||
|
||||
If the upstream branch already contains a change you have made (e.g.,
|
||||
because you mailed a patch which was applied upstream), then that commit
|
||||
will be skipped. For example, running `git rebase master` on the
|
||||
following history (in which `A'` and `A` introduce the same set of changes,
|
||||
but have different committer information):
|
||||
will be skipped and warnings will be issued (if the `merge` backend is
|
||||
used). For example, running `git rebase master` on the following
|
||||
history (in which `A'` and `A` introduce the same set of changes, but
|
||||
have different committer information):
|
||||
|
||||
------------
|
||||
A---B---C topic
|
||||
@ -312,7 +313,10 @@ See also INCOMPATIBLE OPTIONS below.
|
||||
By default (or if `--no-reapply-cherry-picks` is given), these commits
|
||||
will be automatically dropped. Because this necessitates reading all
|
||||
upstream commits, this can be expensive in repos with a large number
|
||||
of upstream commits that need to be read.
|
||||
of upstream commits that need to be read. When using the `merge`
|
||||
backend, warnings will be issued for each dropped commit (unless
|
||||
`--quiet` is given). Advice will also be issued unless
|
||||
`advice.skippedCherryPicks` is set to false (see linkgit:git-config[1]).
|
||||
+
|
||||
`--reapply-cherry-picks` allows rebase to forgo reading all upstream
|
||||
commits, potentially improving performance.
|
||||
@ -340,9 +344,7 @@ See also INCOMPATIBLE OPTIONS below.
|
||||
|
||||
-m::
|
||||
--merge::
|
||||
Use merging strategies to rebase. When the recursive (default) merge
|
||||
strategy is used, this allows rebase to be aware of renames on the
|
||||
upstream side. This is the default.
|
||||
Using merging strategies to rebase (default).
|
||||
+
|
||||
Note that a rebase merge works by replaying each commit from the working
|
||||
branch on top of the <upstream> branch. Because of this, when a merge
|
||||
@ -354,9 +356,8 @@ See also INCOMPATIBLE OPTIONS below.
|
||||
|
||||
-s <strategy>::
|
||||
--strategy=<strategy>::
|
||||
Use the given merge strategy.
|
||||
If there is no `-s` option 'git merge-recursive' is used
|
||||
instead. This implies --merge.
|
||||
Use the given merge strategy, instead of the default `ort`.
|
||||
This implies `--merge`.
|
||||
+
|
||||
Because 'git rebase' replays each commit from the working branch
|
||||
on top of the <upstream> branch using the given strategy, using
|
||||
@ -369,7 +370,7 @@ See also INCOMPATIBLE OPTIONS below.
|
||||
--strategy-option=<strategy-option>::
|
||||
Pass the <strategy-option> through to the merge strategy.
|
||||
This implies `--merge` and, if no strategy has been
|
||||
specified, `-s recursive`. Note the reversal of 'ours' and
|
||||
specified, `-s ort`. Note the reversal of 'ours' and
|
||||
'theirs' as noted above for the `-m` option.
|
||||
+
|
||||
See also INCOMPATIBLE OPTIONS below.
|
||||
@ -445,7 +446,8 @@ When --fork-point is active, 'fork_point' will be used instead of
|
||||
ends up being empty, the <upstream> will be used as a fallback.
|
||||
+
|
||||
If <upstream> is given on the command line, then the default is
|
||||
`--no-fork-point`, otherwise the default is `--fork-point`.
|
||||
`--no-fork-point`, otherwise the default is `--fork-point`. See also
|
||||
`rebase.forkpoint` in linkgit:git-config[1].
|
||||
+
|
||||
If your branch was based on <upstream> but <upstream> was rewound and
|
||||
your branch contains commits which were dropped, this option can be used
|
||||
@ -525,29 +527,12 @@ i.e. commits that would be excluded by linkgit:git-log[1]'s
|
||||
the `rebase-cousins` mode is turned on, such commits are instead rebased
|
||||
onto `<upstream>` (or `<onto>`, if specified).
|
||||
+
|
||||
The `--rebase-merges` mode is similar in spirit to the deprecated
|
||||
`--preserve-merges` but works with interactive rebases,
|
||||
where commits can be reordered, inserted and dropped at will.
|
||||
+
|
||||
It is currently only possible to recreate the merge commits using the
|
||||
`recursive` merge strategy; Different merge strategies can be used only via
|
||||
`ort` merge strategy; different merge strategies can be used only via
|
||||
explicit `exec git merge -s <strategy> [...]` commands.
|
||||
+
|
||||
See also REBASING MERGES and INCOMPATIBLE OPTIONS below.
|
||||
|
||||
-p::
|
||||
--preserve-merges::
|
||||
[DEPRECATED: use `--rebase-merges` instead] Recreate merge commits
|
||||
instead of flattening the history by replaying commits a merge commit
|
||||
introduces. Merge conflict resolutions or manual amendments to merge
|
||||
commits are not preserved.
|
||||
+
|
||||
This uses the `--interactive` machinery internally, but combining it
|
||||
with the `--interactive` option explicitly is generally not a good
|
||||
idea unless you know what you are doing (see BUGS below).
|
||||
+
|
||||
See also INCOMPATIBLE OPTIONS below.
|
||||
|
||||
-x <cmd>::
|
||||
--exec <cmd>::
|
||||
Append "exec <cmd>" after each line creating a commit in the
|
||||
@ -579,9 +564,6 @@ See also INCOMPATIBLE OPTIONS below.
|
||||
the root commit(s) on a branch. When used with --onto, it
|
||||
will skip changes already contained in <newbase> (instead of
|
||||
<upstream>) whereas without --onto it will operate on every change.
|
||||
When used together with both --onto and --preserve-merges,
|
||||
'all' root commits will be rewritten to have <newbase> as parent
|
||||
instead.
|
||||
+
|
||||
See also INCOMPATIBLE OPTIONS below.
|
||||
|
||||
@ -643,7 +625,6 @@ are incompatible with the following options:
|
||||
* --allow-empty-message
|
||||
* --[no-]autosquash
|
||||
* --rebase-merges
|
||||
* --preserve-merges
|
||||
* --interactive
|
||||
* --exec
|
||||
* --no-keep-empty
|
||||
@ -654,13 +635,6 @@ are incompatible with the following options:
|
||||
|
||||
In addition, the following pairs of options are incompatible:
|
||||
|
||||
* --preserve-merges and --interactive
|
||||
* --preserve-merges and --signoff
|
||||
* --preserve-merges and --rebase-merges
|
||||
* --preserve-merges and --empty=
|
||||
* --preserve-merges and --ignore-whitespace
|
||||
* --preserve-merges and --committer-date-is-author-date
|
||||
* --preserve-merges and --ignore-date
|
||||
* --keep-base and --onto
|
||||
* --keep-base and --root
|
||||
* --fork-point and --root
|
||||
@ -1219,12 +1193,16 @@ successful merge so that the user can edit the message.
|
||||
If a `merge` command fails for any reason other than merge conflicts (i.e.
|
||||
when the merge operation did not even start), it is rescheduled immediately.
|
||||
|
||||
At this time, the `merge` command will *always* use the `recursive`
|
||||
merge strategy for regular merges, and `octopus` for octopus merges,
|
||||
with no way to choose a different one. To work around
|
||||
this, an `exec` command can be used to call `git merge` explicitly,
|
||||
using the fact that the labels are worktree-local refs (the ref
|
||||
`refs/rewritten/onto` would correspond to the label `onto`, for example).
|
||||
By default, the `merge` command will use the `ort` merge strategy for
|
||||
regular merges, and `octopus` for octopus merges. One can specify a
|
||||
default strategy for all merges using the `--strategy` argument when
|
||||
invoking rebase, or can override specific merges in the interactive
|
||||
list of commands by using an `exec` command to call `git merge`
|
||||
explicitly with a `--strategy` argument. Note that when calling `git
|
||||
merge` explicitly like this, you can make use of the fact that the
|
||||
labels are worktree-local refs (the ref `refs/rewritten/onto` would
|
||||
correspond to the label `onto`, for example) in order to refer to the
|
||||
branches you want to merge.
|
||||
|
||||
Note: the first command (`label onto`) labels the revision onto which
|
||||
the commits are rebased; The name `onto` is just a convention, as a nod
|
||||
@ -1274,29 +1252,6 @@ CONFIGURATION
|
||||
include::config/rebase.txt[]
|
||||
include::config/sequencer.txt[]
|
||||
|
||||
BUGS
|
||||
----
|
||||
The todo list presented by the deprecated `--preserve-merges --interactive`
|
||||
does not represent the topology of the revision graph (use `--rebase-merges`
|
||||
instead). Editing commits and rewording their commit messages should work
|
||||
fine, but attempts to reorder commits tend to produce counterintuitive results.
|
||||
Use `--rebase-merges` in such scenarios instead.
|
||||
|
||||
For example, an attempt to rearrange
|
||||
------------
|
||||
1 --- 2 --- 3 --- 4 --- 5
|
||||
------------
|
||||
to
|
||||
------------
|
||||
1 --- 2 --- 4 --- 3 --- 5
|
||||
------------
|
||||
by moving the "pick 4" line will result in the following history:
|
||||
------------
|
||||
3
|
||||
/
|
||||
1 --- 2 --- 4 --- 5
|
||||
------------
|
||||
|
||||
GIT
|
||||
---
|
||||
Part of the linkgit:git[1] suite
|
||||
|
@ -41,6 +41,11 @@ OPTIONS
|
||||
<directory>::
|
||||
The repository to sync into.
|
||||
|
||||
--http-backend-info-refs::
|
||||
Used by linkgit:git-http-backend[1] to serve up
|
||||
`$GIT_URL/info/refs?service=git-receive-pack` requests. See
|
||||
`--http-backend-info-refs` in linkgit:git-upload-pack[1].
|
||||
|
||||
PRE-RECEIVE HOOK
|
||||
----------------
|
||||
Before any ref is updated, if $GIT_DIR/hooks/pre-receive file exists
|
||||
|
@ -9,7 +9,7 @@ git-repack - Pack unpacked objects in a repository
|
||||
SYNOPSIS
|
||||
--------
|
||||
[verse]
|
||||
'git repack' [-a] [-A] [-d] [-f] [-F] [-l] [-n] [-q] [-b] [--window=<n>] [--depth=<n>] [--threads=<n>] [--keep-pack=<pack-name>]
|
||||
'git repack' [-a] [-A] [-d] [-f] [-F] [-l] [-n] [-q] [-b] [-m] [--window=<n>] [--depth=<n>] [--threads=<n>] [--keep-pack=<pack-name>] [--write-midx]
|
||||
|
||||
DESCRIPTION
|
||||
-----------
|
||||
@ -128,10 +128,11 @@ depth is 4095.
|
||||
-b::
|
||||
--write-bitmap-index::
|
||||
Write a reachability bitmap index as part of the repack. This
|
||||
only makes sense when used with `-a` or `-A`, as the bitmaps
|
||||
only makes sense when used with `-a`, `-A` or `-m`, as the bitmaps
|
||||
must be able to refer to all reachable objects. This option
|
||||
overrides the setting of `repack.writeBitmaps`. This option
|
||||
has no effect if multiple packfiles are created.
|
||||
overrides the setting of `repack.writeBitmaps`. This option
|
||||
has no effect if multiple packfiles are created, unless writing a
|
||||
MIDX (in which case a multi-pack bitmap is created).
|
||||
|
||||
--pack-kept-objects::
|
||||
Include objects in `.keep` files when repacking. Note that we
|
||||
@ -189,6 +190,15 @@ this "roll-up", without respect to their reachability. This is subject
|
||||
to change in the future. This option (implying a drastically different
|
||||
repack mode) is not guaranteed to work with all other combinations of
|
||||
option to `git repack`.
|
||||
+
|
||||
When writing a multi-pack bitmap, `git repack` selects the largest resulting
|
||||
pack as the preferred pack for object selection by the MIDX (see
|
||||
linkgit:git-multi-pack-index[1]).
|
||||
|
||||
-m::
|
||||
--write-midx::
|
||||
Write a multi-pack index (see linkgit:git-multi-pack-index[1])
|
||||
containing the non-redundant packs.
|
||||
|
||||
CONFIGURATION
|
||||
-------------
|
||||
|
@ -69,7 +69,8 @@ linkgit:git-add[1]).
|
||||
|
||||
--hard::
|
||||
Resets the index and working tree. Any changes to tracked files in the
|
||||
working tree since `<commit>` are discarded.
|
||||
working tree since `<commit>` are discarded. Any untracked files or
|
||||
directories in the way of writing any tracked files are simply deleted.
|
||||
|
||||
--merge::
|
||||
Resets the index and updates the files in the working tree that are
|
||||
|
@ -72,6 +72,12 @@ For more details, see the 'pathspec' entry in linkgit:gitglossary[7].
|
||||
--ignore-unmatch::
|
||||
Exit with a zero status even if no files matched.
|
||||
|
||||
--sparse::
|
||||
Allow updating index entries outside of the sparse-checkout cone.
|
||||
Normally, `git rm` refuses to update index entries whose paths do
|
||||
not fit within the sparse-checkout cone. See
|
||||
linkgit:git-sparse-checkout[1] for more.
|
||||
|
||||
-q::
|
||||
--quiet::
|
||||
`git rm` normally outputs one line (in the form of an `rm` command)
|
||||
|
@ -9,10 +9,10 @@ git-send-pack - Push objects over Git protocol to another repository
|
||||
SYNOPSIS
|
||||
--------
|
||||
[verse]
|
||||
'git send-pack' [--all] [--dry-run] [--force] [--receive-pack=<git-receive-pack>]
|
||||
'git send-pack' [--dry-run] [--force] [--receive-pack=<git-receive-pack>]
|
||||
[--verbose] [--thin] [--atomic]
|
||||
[--[no-]signed|--signed=(true|false|if-asked)]
|
||||
[<host>:]<directory> [<ref>...]
|
||||
[<host>:]<directory> (--all | <ref>...)
|
||||
|
||||
DESCRIPTION
|
||||
-----------
|
||||
|
@ -210,6 +210,16 @@ case-insensitive check. This corrects for case mismatched filenames in the
|
||||
'git sparse-checkout set' command to reflect the expected cone in the working
|
||||
directory.
|
||||
|
||||
When changing the sparse-checkout patterns in cone mode, Git will inspect each
|
||||
tracked directory that is not within the sparse-checkout cone to see if it
|
||||
contains any untracked files. If all of those files are ignored due to the
|
||||
`.gitignore` patterns, then the directory will be deleted. If any of the
|
||||
untracked files within that directory is not ignored, then no deletions will
|
||||
occur within that directory and a warning message will appear. If these files
|
||||
are important, then reset your sparse-checkout definition so they are included,
|
||||
use `git add` and `git commit` to store them, then remove any remaining files
|
||||
manually to ensure Git can behave optimally.
|
||||
|
||||
|
||||
SUBMODULES
|
||||
----------
|
||||
|
@ -207,26 +207,29 @@ show tracked paths:
|
||||
|
||||
* ' ' = unmodified
|
||||
* 'M' = modified
|
||||
* 'T' = file type changed (regular file, symbolic link or submodule)
|
||||
* 'A' = added
|
||||
* 'D' = deleted
|
||||
* 'R' = renamed
|
||||
* 'C' = copied
|
||||
* 'C' = copied (if config option status.renames is set to "copies")
|
||||
* 'U' = updated but unmerged
|
||||
|
||||
....
|
||||
X Y Meaning
|
||||
-------------------------------------------------
|
||||
[AMD] not updated
|
||||
M [ MD] updated in index
|
||||
A [ MD] added to index
|
||||
M [ MTD] updated in index
|
||||
T [ MTD] type changed in index
|
||||
A [ MTD] added to index
|
||||
D deleted from index
|
||||
R [ MD] renamed in index
|
||||
C [ MD] copied in index
|
||||
[MARC] index and work tree matches
|
||||
[ MARC] M work tree changed since index
|
||||
[ MARC] D deleted in work tree
|
||||
[ D] R renamed in work tree
|
||||
[ D] C copied in work tree
|
||||
R [ MTD] renamed in index
|
||||
C [ MTD] copied in index
|
||||
[MTARC] index and work tree matches
|
||||
[ MTARC] M work tree changed since index
|
||||
[ MTARC] T type changed in work tree since index
|
||||
[ MTARC] D deleted in work tree
|
||||
R renamed in work tree
|
||||
C copied in work tree
|
||||
-------------------------------------------------
|
||||
D D unmerged, both deleted
|
||||
A U unmerged, added by us
|
||||
@ -363,7 +366,7 @@ Field Meaning
|
||||
Unmerged entries have the following format; the first character is
|
||||
a "u" to distinguish from ordinary changed entries.
|
||||
|
||||
u <xy> <sub> <m1> <m2> <m3> <mW> <h1> <h2> <h3> <path>
|
||||
u <XY> <sub> <m1> <m2> <m3> <mW> <h1> <h2> <h3> <path>
|
||||
|
||||
....
|
||||
Field Meaning
|
||||
|
@ -678,7 +678,6 @@ config key: svn.authorsProg
|
||||
--strategy=<strategy>::
|
||||
-p::
|
||||
--rebase-merges::
|
||||
--preserve-merges (DEPRECATED)::
|
||||
These are only used with the 'dcommit' and 'rebase' commands.
|
||||
+
|
||||
Passed directly to 'git rebase' when using 'dcommit' if a
|
||||
|
@ -36,14 +36,26 @@ OPTIONS
|
||||
This fits with the HTTP POST request processing model where
|
||||
a program may read the request, write a response, and must exit.
|
||||
|
||||
--advertise-refs::
|
||||
Only the initial ref advertisement is output, and the program exits
|
||||
immediately. This fits with the HTTP GET request model, where
|
||||
no request content is received but a response must be produced.
|
||||
--http-backend-info-refs::
|
||||
Used by linkgit:git-http-backend[1] to serve up
|
||||
`$GIT_URL/info/refs?service=git-upload-pack` requests. See
|
||||
"Smart Clients" in link:technical/http-protocol.html[the HTTP
|
||||
transfer protocols] documentation and "HTTP Transport" in
|
||||
link:technical/protocol-v2.html[the Git Wire Protocol, Version
|
||||
2] documentation. Also understood by
|
||||
linkgit:git-receive-pack[1].
|
||||
|
||||
<directory>::
|
||||
The repository to sync from.
|
||||
|
||||
ENVIRONMENT
|
||||
-----------
|
||||
|
||||
`GIT_PROTOCOL`::
|
||||
Internal variable used for handshaking the wire protocol. Server
|
||||
admins may need to configure some transports to allow this
|
||||
variable to be passed. See the discussion in linkgit:git[1].
|
||||
|
||||
SEE ALSO
|
||||
--------
|
||||
linkgit:gitnamespaces[7]
|
||||
|
28
Documentation/git-version.txt
Normal file
28
Documentation/git-version.txt
Normal file
@ -0,0 +1,28 @@
|
||||
git-version(1)
|
||||
==============
|
||||
|
||||
NAME
|
||||
----
|
||||
git-version - Display version information about Git
|
||||
|
||||
SYNOPSIS
|
||||
--------
|
||||
[verse]
|
||||
'git version' [--build-options]
|
||||
|
||||
DESCRIPTION
|
||||
-----------
|
||||
With no options given, the version of 'git' is printed on the standard output.
|
||||
|
||||
Note that `git --version` is identical to `git version` because the
|
||||
former is internally converted into the latter.
|
||||
|
||||
OPTIONS
|
||||
-------
|
||||
--build-options::
|
||||
Include additional information about how git was built for diagnostic
|
||||
purposes.
|
||||
|
||||
GIT
|
||||
---
|
||||
Part of the linkgit:git[1] suite
|
@ -41,6 +41,10 @@ OPTIONS
|
||||
-------
|
||||
--version::
|
||||
Prints the Git suite version that the 'git' program came from.
|
||||
+
|
||||
This option is internally converted to `git version ...` and accepts
|
||||
the same options as the linkgit:git-version[1] command. If `--help` is
|
||||
also given, it takes precedence over `--version`.
|
||||
|
||||
--help::
|
||||
Prints the synopsis and a list of the most commonly used
|
||||
@ -863,15 +867,16 @@ for full details.
|
||||
end user, to be recorded in the body of the reflog.
|
||||
|
||||
`GIT_REF_PARANOIA`::
|
||||
If set to `1`, include broken or badly named refs when iterating
|
||||
over lists of refs. In a normal, non-corrupted repository, this
|
||||
does nothing. However, enabling it may help git to detect and
|
||||
abort some operations in the presence of broken refs. Git sets
|
||||
this variable automatically when performing destructive
|
||||
operations like linkgit:git-prune[1]. You should not need to set
|
||||
it yourself unless you want to be paranoid about making sure
|
||||
an operation has touched every ref (e.g., because you are
|
||||
cloning a repository to make a backup).
|
||||
If set to `0`, ignore broken or badly named refs when iterating
|
||||
over lists of refs. Normally Git will try to include any such
|
||||
refs, which may cause some operations to fail. This is usually
|
||||
preferable, as potentially destructive operations (e.g.,
|
||||
linkgit:git-prune[1]) are better off aborting rather than
|
||||
ignoring broken refs (and thus considering the history they
|
||||
point to as not worth saving). The default value is `1` (i.e.,
|
||||
be paranoid about detecting and aborting all operations). You
|
||||
should not normally need to set this to `0`, but it may be
|
||||
useful when trying to salvage data from a corrupted repository.
|
||||
|
||||
`GIT_ALLOW_PROTOCOL`::
|
||||
If set to a colon-separated list of protocols, behave as if
|
||||
@ -894,6 +899,21 @@ for full details.
|
||||
Contains a colon ':' separated list of keys with optional values
|
||||
'key[=value]'. Presence of unknown keys and values must be
|
||||
ignored.
|
||||
+
|
||||
Note that servers may need to be configured to allow this variable to
|
||||
pass over some transports. It will be propagated automatically when
|
||||
accessing local repositories (i.e., `file://` or a filesystem path), as
|
||||
well as over the `git://` protocol. For git-over-http, it should work
|
||||
automatically in most configurations, but see the discussion in
|
||||
linkgit:git-http-backend[1]. For git-over-ssh, the ssh server may need
|
||||
to be configured to allow clients to pass this variable (e.g., by using
|
||||
`AcceptEnv GIT_PROTOCOL` with OpenSSH).
|
||||
+
|
||||
This configuration is optional. If the variable is not propagated, then
|
||||
clients will fall back to the original "v0" protocol (but may miss out
|
||||
on some performance improvements or features). This variable currently
|
||||
only affects clones and fetches; it is not yet used for pushes (but may
|
||||
be in the future).
|
||||
|
||||
`GIT_OPTIONAL_LOCKS`::
|
||||
If set to `0`, Git will complete any requested operation without
|
||||
|
@ -275,7 +275,7 @@ best to always use a regular merge commit.
|
||||
|
||||
[[merge-two-revert-one]]
|
||||
If I make a change on two branches but revert it on one, why does the merge of those branches include the change?::
|
||||
By default, when Git does a merge, it uses a strategy called the recursive
|
||||
By default, when Git does a merge, it uses a strategy called the `ort`
|
||||
strategy, which does a fancy three-way merge. In such a case, when Git
|
||||
performs the merge, it considers exactly three points: the two heads and a
|
||||
third point, called the _merge base_, which is usually the common ancestor of
|
||||
|
@ -155,7 +155,7 @@ accessed from the index or a tree versus from the filesystem.
|
||||
EXAMPLES
|
||||
--------
|
||||
|
||||
- The pattern `hello.*` matches any file or folder
|
||||
- The pattern `hello.*` matches any file or directory
|
||||
whose name begins with `hello.`. If one wants to restrict
|
||||
this only to the directory and not in its subdirectories,
|
||||
one can prepend the pattern with a slash, i.e. `/hello.*`;
|
||||
|
@ -547,7 +547,7 @@ like this:
|
||||
# make the front page an internal rewrite to the gitweb script
|
||||
RewriteRule ^/$ /cgi-bin/gitweb.cgi [QSA,L,PT]
|
||||
|
||||
# look for a public_git folder in unix users' home
|
||||
# look for a public_git directory in unix users' home
|
||||
# http://git.example.org/~<user>/
|
||||
RewriteRule ^/\~([^\/]+)(/|/gitweb.cgi)?$ /cgi-bin/gitweb.cgi \
|
||||
[QSA,E=GITWEB_PROJECTROOT:/home/$1/public_git/,L,PT]
|
||||
|
@ -5,11 +5,12 @@ use warnings;
|
||||
|
||||
# Parse arguments, a simple state machine for input like:
|
||||
#
|
||||
# howto/*.txt config/*.txt --section=1 git.txt git-add.txt [...] --to-lint git-add.txt a-file.txt [...]
|
||||
# <file-to-check.txt> <valid-files-to-link-to> --section=1 git.txt git-add.txt [...] --to-lint git-add.txt a-file.txt [...]
|
||||
my %TXT;
|
||||
my %SECTION;
|
||||
my $section;
|
||||
my $lint_these = 0;
|
||||
my $to_check = shift @ARGV;
|
||||
for my $arg (@ARGV) {
|
||||
if (my ($sec) = $arg =~ /^--section=(\d+)$/s) {
|
||||
$section = $sec;
|
||||
@ -30,13 +31,14 @@ sub report {
|
||||
my ($pos, $line, $target, $msg) = @_;
|
||||
substr($line, $pos) = "' <-- HERE";
|
||||
$line =~ s/^\s+//;
|
||||
print "$ARGV:$.: error: $target: $msg, shown with 'HERE' below:\n";
|
||||
print "$ARGV:$.:\t'$line\n";
|
||||
print STDERR "$ARGV:$.: error: $target: $msg, shown with 'HERE' below:\n";
|
||||
print STDERR "$ARGV:$.:\t'$line\n";
|
||||
$exit_code = 1;
|
||||
}
|
||||
|
||||
@ARGV = sort values %TXT;
|
||||
die "BUG: Nothing to process!" unless @ARGV;
|
||||
die "BUG: No list of valid linkgit:* files given" unless @ARGV;
|
||||
@ARGV = $to_check;
|
||||
while (<>) {
|
||||
my $line = $_;
|
||||
while ($line =~ m/linkgit:((.*?)\[(\d)\])/g) {
|
||||
|
@ -6,7 +6,7 @@ use warnings;
|
||||
my $exit_code = 0;
|
||||
sub report {
|
||||
my ($target, $msg) = @_;
|
||||
print "error: $target: $msg\n";
|
||||
print STDERR "error: $target: $msg\n";
|
||||
$exit_code = 1;
|
||||
}
|
||||
|
||||
|
@ -46,7 +46,7 @@ my $SECTION_RX = do {
|
||||
my $exit_code = 0;
|
||||
sub report {
|
||||
my ($msg) = @_;
|
||||
print "$ARGV:$.: $msg\n";
|
||||
print STDERR "$ARGV:$.: $msg\n";
|
||||
$exit_code = 1;
|
||||
}
|
||||
|
||||
|
@ -2,6 +2,9 @@
|
||||
--no-commit::
|
||||
Perform the merge and commit the result. This option can
|
||||
be used to override --no-commit.
|
||||
ifdef::git-pull[]
|
||||
Only useful when merging.
|
||||
endif::git-pull[]
|
||||
+
|
||||
With --no-commit perform the merge and stop just before creating
|
||||
a merge commit, to give the user a chance to inspect and further
|
||||
@ -39,6 +42,7 @@ set to `no` at the beginning of them.
|
||||
to `MERGE_MSG` before being passed on to the commit machinery in the
|
||||
case of a merge conflict.
|
||||
|
||||
ifdef::git-merge[]
|
||||
--ff::
|
||||
--no-ff::
|
||||
--ff-only::
|
||||
@ -47,6 +51,22 @@ set to `no` at the beginning of them.
|
||||
default unless merging an annotated (and possibly signed) tag
|
||||
that is not stored in its natural place in the `refs/tags/`
|
||||
hierarchy, in which case `--no-ff` is assumed.
|
||||
endif::git-merge[]
|
||||
ifdef::git-pull[]
|
||||
--ff-only::
|
||||
Only update to the new history if there is no divergent local
|
||||
history. This is the default when no method for reconciling
|
||||
divergent histories is provided (via the --rebase=* flags).
|
||||
|
||||
--ff::
|
||||
--no-ff::
|
||||
When merging rather than rebasing, specifies how a merge is
|
||||
handled when the merged-in history is already a descendant of
|
||||
the current history. If merging is requested, `--ff` is the
|
||||
default unless merging an annotated (and possibly signed) tag
|
||||
that is not stored in its natural place in the `refs/tags/`
|
||||
hierarchy, in which case `--no-ff` is assumed.
|
||||
endif::git-pull[]
|
||||
+
|
||||
With `--ff`, when possible resolve the merge as a fast-forward (only
|
||||
update the branch pointer to match the merged branch; do not create a
|
||||
@ -55,9 +75,11 @@ descendant of the current history), create a merge commit.
|
||||
+
|
||||
With `--no-ff`, create a merge commit in all cases, even when the merge
|
||||
could instead be resolved as a fast-forward.
|
||||
ifdef::git-merge[]
|
||||
+
|
||||
With `--ff-only`, resolve the merge as a fast-forward when possible.
|
||||
When not possible, refuse to merge and exit with a non-zero status.
|
||||
endif::git-merge[]
|
||||
|
||||
-S[<keyid>]::
|
||||
--gpg-sign[=<keyid>]::
|
||||
@ -73,6 +95,9 @@ When not possible, refuse to merge and exit with a non-zero status.
|
||||
In addition to branch names, populate the log message with
|
||||
one-line descriptions from at most <n> actual commits that are being
|
||||
merged. See also linkgit:git-fmt-merge-msg[1].
|
||||
ifdef::git-pull[]
|
||||
Only useful when merging.
|
||||
endif::git-pull[]
|
||||
+
|
||||
With --no-log do not list one-line descriptions from the
|
||||
actual commits being merged.
|
||||
@ -102,18 +127,25 @@ With --no-squash perform the merge and commit the result. This
|
||||
option can be used to override --squash.
|
||||
+
|
||||
With --squash, --commit is not allowed, and will fail.
|
||||
ifdef::git-pull[]
|
||||
+
|
||||
Only useful when merging.
|
||||
endif::git-pull[]
|
||||
|
||||
--no-verify::
|
||||
This option bypasses the pre-merge and commit-msg hooks.
|
||||
See also linkgit:githooks[5].
|
||||
ifdef::git-pull[]
|
||||
Only useful when merging.
|
||||
endif::git-pull[]
|
||||
|
||||
-s <strategy>::
|
||||
--strategy=<strategy>::
|
||||
Use the given merge strategy; can be supplied more than
|
||||
once to specify them in the order they should be tried.
|
||||
If there is no `-s` option, a built-in list of strategies
|
||||
is used instead ('git merge-recursive' when merging a single
|
||||
head, 'git merge-octopus' otherwise).
|
||||
is used instead (`ort` when merging a single head,
|
||||
`octopus` otherwise).
|
||||
|
||||
-X <option>::
|
||||
--strategy-option=<option>::
|
||||
@ -127,6 +159,10 @@ With --squash, --commit is not allowed, and will fail.
|
||||
default trust model, this means the signing key has been signed by
|
||||
a trusted key. If the tip commit of the side branch is not signed
|
||||
with a valid key, the merge is aborted.
|
||||
ifdef::git-pull[]
|
||||
+
|
||||
Only useful when merging.
|
||||
endif::git-pull[]
|
||||
|
||||
--summary::
|
||||
--no-summary::
|
||||
@ -167,3 +203,7 @@ endif::git-pull[]
|
||||
projects that started their lives independently. As that is
|
||||
a very rare occasion, no configuration variable to enable
|
||||
this by default exists and will not be added.
|
||||
ifdef::git-pull[]
|
||||
+
|
||||
Only useful when merging.
|
||||
endif::git-pull[]
|
||||
|
@ -6,28 +6,23 @@ backend 'merge strategies' to be chosen with `-s` option. Some strategies
|
||||
can also take their own options, which can be passed by giving `-X<option>`
|
||||
arguments to `git merge` and/or `git pull`.
|
||||
|
||||
resolve::
|
||||
This can only resolve two heads (i.e. the current branch
|
||||
and another branch you pulled from) using a 3-way merge
|
||||
algorithm. It tries to carefully detect criss-cross
|
||||
merge ambiguities and is considered generally safe and
|
||||
fast.
|
||||
|
||||
recursive::
|
||||
This can only resolve two heads using a 3-way merge
|
||||
algorithm. When there is more than one common
|
||||
ancestor that can be used for 3-way merge, it creates a
|
||||
merged tree of the common ancestors and uses that as
|
||||
the reference tree for the 3-way merge. This has been
|
||||
reported to result in fewer merge conflicts without
|
||||
causing mismerges by tests done on actual merge commits
|
||||
taken from Linux 2.6 kernel development history.
|
||||
Additionally this can detect and handle merges involving
|
||||
renames, but currently cannot make use of detected
|
||||
copies. This is the default merge strategy when pulling
|
||||
or merging one branch.
|
||||
ort::
|
||||
This is the default merge strategy when pulling or merging one
|
||||
branch. This strategy can only resolve two heads using a
|
||||
3-way merge algorithm. When there is more than one common
|
||||
ancestor that can be used for 3-way merge, it creates a merged
|
||||
tree of the common ancestors and uses that as the reference
|
||||
tree for the 3-way merge. This has been reported to result in
|
||||
fewer merge conflicts without causing mismerges by tests done
|
||||
on actual merge commits taken from Linux 2.6 kernel
|
||||
development history. Additionally this strategy can detect
|
||||
and handle merges involving renames. It does not make use of
|
||||
detected copies. The name for this algorithm is an acronym
|
||||
("Ostensibly Recursive's Twin") and came from the fact that it
|
||||
was written as a replacement for the previous default
|
||||
algorithm, `recursive`.
|
||||
+
|
||||
The 'recursive' strategy can take the following options:
|
||||
The 'ort' strategy can take the following options:
|
||||
|
||||
ours;;
|
||||
This option forces conflicting hunks to be auto-resolved cleanly by
|
||||
@ -43,19 +38,6 @@ theirs;;
|
||||
This is the opposite of 'ours'; note that, unlike 'ours', there is
|
||||
no 'theirs' merge strategy to confuse this merge option with.
|
||||
|
||||
patience;;
|
||||
With this option, 'merge-recursive' spends a little extra time
|
||||
to avoid mismerges that sometimes occur due to unimportant
|
||||
matching lines (e.g., braces from distinct functions). Use
|
||||
this when the branches to be merged have diverged wildly.
|
||||
See also linkgit:git-diff[1] `--patience`.
|
||||
|
||||
diff-algorithm=[patience|minimal|histogram|myers];;
|
||||
Tells 'merge-recursive' to use a different diff algorithm, which
|
||||
can help avoid mismerges that occur due to unimportant matching
|
||||
lines (such as braces from distinct functions). See also
|
||||
linkgit:git-diff[1] `--diff-algorithm`.
|
||||
|
||||
ignore-space-change;;
|
||||
ignore-all-space;;
|
||||
ignore-space-at-eol;;
|
||||
@ -84,11 +66,6 @@ no-renormalize;;
|
||||
Disables the `renormalize` option. This overrides the
|
||||
`merge.renormalize` configuration variable.
|
||||
|
||||
no-renames;;
|
||||
Turn off rename detection. This overrides the `merge.renames`
|
||||
configuration variable.
|
||||
See also linkgit:git-diff[1] `--no-renames`.
|
||||
|
||||
find-renames[=<n>];;
|
||||
Turn on rename detection, optionally setting the similarity
|
||||
threshold. This is the default. This overrides the
|
||||
@ -105,6 +82,46 @@ subtree[=<path>];;
|
||||
is prefixed (or stripped from the beginning) to make the shape of
|
||||
two trees to match.
|
||||
|
||||
recursive::
|
||||
This can only resolve two heads using a 3-way merge
|
||||
algorithm. When there is more than one common
|
||||
ancestor that can be used for 3-way merge, it creates a
|
||||
merged tree of the common ancestors and uses that as
|
||||
the reference tree for the 3-way merge. This has been
|
||||
reported to result in fewer merge conflicts without
|
||||
causing mismerges by tests done on actual merge commits
|
||||
taken from Linux 2.6 kernel development history.
|
||||
Additionally this can detect and handle merges involving
|
||||
renames. It does not make use of detected copies. This was
|
||||
the default strategy for resolving two heads from Git v0.99.9k
|
||||
until v2.33.0.
|
||||
+
|
||||
The 'recursive' strategy takes the same options as 'ort'. However,
|
||||
there are three additional options that 'ort' ignores (not documented
|
||||
above) that are potentially useful with the 'recursive' strategy:
|
||||
|
||||
patience;;
|
||||
Deprecated synonym for `diff-algorithm=patience`.
|
||||
|
||||
diff-algorithm=[patience|minimal|histogram|myers];;
|
||||
Use a different diff algorithm while merging, which can help
|
||||
avoid mismerges that occur due to unimportant matching lines
|
||||
(such as braces from distinct functions). See also
|
||||
linkgit:git-diff[1] `--diff-algorithm`. Note that `ort`
|
||||
specifically uses `diff-algorithm=histogram`, while `recursive`
|
||||
defaults to the `diff.algorithm` config setting.
|
||||
|
||||
no-renames;;
|
||||
Turn off rename detection. This overrides the `merge.renames`
|
||||
configuration variable.
|
||||
See also linkgit:git-diff[1] `--no-renames`.
|
||||
|
||||
resolve::
|
||||
This can only resolve two heads (i.e. the current branch
|
||||
and another branch you pulled from) using a 3-way merge
|
||||
algorithm. It tries to carefully detect criss-cross
|
||||
merge ambiguities. It does not handle renames.
|
||||
|
||||
octopus::
|
||||
This resolves cases with more than two heads, but refuses to do
|
||||
a complex merge that needs manual resolution. It is
|
||||
@ -121,13 +138,13 @@ ours::
|
||||
the 'recursive' merge strategy.
|
||||
|
||||
subtree::
|
||||
This is a modified recursive strategy. When merging trees A and
|
||||
This is a modified `ort` strategy. When merging trees A and
|
||||
B, if B corresponds to a subtree of A, B is first adjusted to
|
||||
match the tree structure of A, instead of reading the trees at
|
||||
the same level. This adjustment is also done to the common
|
||||
ancestor tree.
|
||||
|
||||
With the strategies that use 3-way merge (including the default, 'recursive'),
|
||||
With the strategies that use 3-way merge (including the default, 'ort'),
|
||||
if a change is made on both branches, but later reverted on one of the
|
||||
branches, that change will be present in the merged result; some people find
|
||||
this behavior confusing. It occurs because only the heads and the merge base
|
||||
|
@ -33,14 +33,16 @@ people using 80-column terminals.
|
||||
used together.
|
||||
|
||||
--encoding=<encoding>::
|
||||
The commit objects record the encoding used for the log message
|
||||
Commit objects record the character encoding used for the log message
|
||||
in their encoding header; this option can be used to tell the
|
||||
command to re-code the commit log message in the encoding
|
||||
preferred by the user. For non plumbing commands this
|
||||
defaults to UTF-8. Note that if an object claims to be encoded
|
||||
in `X` and we are outputting in `X`, we will output the object
|
||||
verbatim; this means that invalid sequences in the original
|
||||
commit may be copied to the output.
|
||||
commit may be copied to the output. Likewise, if iconv(3) fails
|
||||
to convert the commit, we will quietly output the original
|
||||
object verbatim.
|
||||
|
||||
--expand-tabs=<n>::
|
||||
--expand-tabs::
|
||||
|
@ -968,6 +968,11 @@ list of the missing objects. Object IDs are prefixed with a ``?'' character.
|
||||
objects.
|
||||
endif::git-rev-list[]
|
||||
|
||||
--unsorted-input::
|
||||
Show commits in the order they were given on the command line instead
|
||||
of sorting them in reverse chronological order by commit time. Cannot
|
||||
be combined with `--no-walk` or `--no-walk=sorted`.
|
||||
|
||||
--no-walk[=(sorted|unsorted)]::
|
||||
Only show the given commits, but do not traverse their ancestors.
|
||||
This has no effect if a range is specified. If the argument
|
||||
@ -975,7 +980,8 @@ endif::git-rev-list[]
|
||||
given on the command line. Otherwise (if `sorted` or no argument
|
||||
was given), the commits are shown in reverse chronological order
|
||||
by commit time.
|
||||
Cannot be combined with `--graph`.
|
||||
Cannot be combined with `--graph`. Cannot be combined with
|
||||
`--unsorted-input` if `sorted` or no argument was given.
|
||||
|
||||
--do-walk::
|
||||
Overrides a previous `--no-walk`.
|
||||
|
@ -198,11 +198,6 @@ There are some macros to easily define options:
|
||||
The filename will be prefixed by passing the filename along with
|
||||
the prefix argument of `parse_options()` to `prefix_filename()`.
|
||||
|
||||
`OPT_ARGUMENT(long, &int_var, description)`::
|
||||
Introduce a long-option argument that will be kept in `argv[]`.
|
||||
If this option was seen, `int_var` will be set to one (except
|
||||
if a `NULL` pointer was passed).
|
||||
|
||||
`OPT_NUMBER_CALLBACK(&var, description, func_ptr)`::
|
||||
Recognize numerical options like -123 and feed the integer as
|
||||
if it was an argument to the function given by `func_ptr`.
|
||||
|
@ -493,6 +493,20 @@ about specific error arguments.
|
||||
}
|
||||
------------
|
||||
|
||||
`"cmd_ancestry"`::
|
||||
This event contains the text command name for the parent (and earlier
|
||||
generations of parents) of the current process, in an array ordered from
|
||||
nearest parent to furthest great-grandparent. It may not be implemented
|
||||
on all platforms.
|
||||
+
|
||||
------------
|
||||
{
|
||||
"event":"cmd_ancestry",
|
||||
...
|
||||
"ancestry":["bash","tmux: server","systemd"]
|
||||
}
|
||||
------------
|
||||
|
||||
`"cmd_name"`::
|
||||
This event contains the command name for this git process
|
||||
and the hierarchy of commands from parent git processes.
|
||||
@ -599,6 +613,46 @@ stopping after the waitpid() and includes OS process creation overhead).
|
||||
So this time will be slightly larger than the atexit time reported by
|
||||
the child process itself.
|
||||
|
||||
`"child_ready"`::
|
||||
This event is generated after the current process has started
|
||||
a background process and released all handles to it.
|
||||
+
|
||||
------------
|
||||
{
|
||||
"event":"child_ready",
|
||||
...
|
||||
"child_id":2,
|
||||
"pid":14708, # child PID
|
||||
"ready":"ready", # child ready state
|
||||
"t_rel":0.110605 # observed run-time of child process
|
||||
}
|
||||
------------
|
||||
+
|
||||
Note that the session-id of the child process is not available to
|
||||
the current/spawning process, so the child's PID is reported here as
|
||||
a hint for post-processing. (But it is only a hint because the child
|
||||
process may be a shell script which doesn't have a session-id.)
|
||||
+
|
||||
This event is generated after the child is started in the background
|
||||
and given a little time to boot up and start working. If the child
|
||||
startups normally and while the parent is still waiting, the "ready"
|
||||
field will have the value "ready".
|
||||
If the child is too slow to start and the parent times out, the field
|
||||
will have the value "timeout".
|
||||
If the child starts but the parent is unable to probe it, the field
|
||||
will have the value "error".
|
||||
+
|
||||
After the parent process emits this event, it will release all of its
|
||||
handles to the child process and treat the child as a background
|
||||
daemon. So even if the child does eventually finish booting up,
|
||||
the parent will not emit an updated event.
|
||||
+
|
||||
Note that the `t_rel` field contains the observed run time in seconds
|
||||
when the parent released the child process into the background.
|
||||
The child is assumed to be a long-running daemon process and may
|
||||
outlive the parent process. So the parent's child event times should
|
||||
not be compared to the child's atexit times.
|
||||
|
||||
`"exec"`::
|
||||
This event is generated before git attempts to `exec()`
|
||||
another command rather than starting a child process.
|
||||
|
@ -1,6 +1,44 @@
|
||||
GIT bitmap v1 format
|
||||
====================
|
||||
|
||||
== Pack and multi-pack bitmaps
|
||||
|
||||
Bitmaps store reachability information about the set of objects in a packfile,
|
||||
or a multi-pack index (MIDX). The former is defined obviously, and the latter is
|
||||
defined as the union of objects in packs contained in the MIDX.
|
||||
|
||||
A bitmap may belong to either one pack, or the repository's multi-pack index (if
|
||||
it exists). A repository may have at most one bitmap.
|
||||
|
||||
An object is uniquely described by its bit position within a bitmap:
|
||||
|
||||
- If the bitmap belongs to a packfile, the __n__th bit corresponds to
|
||||
the __n__th object in pack order. For a function `offset` which maps
|
||||
objects to their byte offset within a pack, pack order is defined as
|
||||
follows:
|
||||
|
||||
o1 <= o2 <==> offset(o1) <= offset(o2)
|
||||
|
||||
- If the bitmap belongs to a MIDX, the __n__th bit corresponds to the
|
||||
__n__th object in MIDX order. With an additional function `pack` which
|
||||
maps objects to the pack they were selected from by the MIDX, MIDX order
|
||||
is defined as follows:
|
||||
|
||||
o1 <= o2 <==> pack(o1) <= pack(o2) /\ offset(o1) <= offset(o2)
|
||||
|
||||
The ordering between packs is done according to the MIDX's .rev file.
|
||||
Notably, the preferred pack sorts ahead of all other packs.
|
||||
|
||||
The on-disk representation (described below) of a bitmap is the same regardless
|
||||
of whether or not that bitmap belongs to a packfile or a MIDX. The only
|
||||
difference is the interpretation of the bits, which is described above.
|
||||
|
||||
Certain bitmap extensions are supported (see: Appendix B). No extensions are
|
||||
required for bitmaps corresponding to packfiles. For bitmaps that correspond to
|
||||
MIDXs, both the bit-cache and rev-cache extensions are required.
|
||||
|
||||
== On-disk format
|
||||
|
||||
- A header appears at the beginning:
|
||||
|
||||
4-byte signature: {'B', 'I', 'T', 'M'}
|
||||
@ -14,17 +52,19 @@ GIT bitmap v1 format
|
||||
The following flags are supported:
|
||||
|
||||
- BITMAP_OPT_FULL_DAG (0x1) REQUIRED
|
||||
This flag must always be present. It implies that the bitmap
|
||||
index has been generated for a packfile with full closure
|
||||
(i.e. where every single object in the packfile can find
|
||||
its parent links inside the same packfile). This is a
|
||||
requirement for the bitmap index format, also present in JGit,
|
||||
that greatly reduces the complexity of the implementation.
|
||||
This flag must always be present. It implies that the
|
||||
bitmap index has been generated for a packfile or
|
||||
multi-pack index (MIDX) with full closure (i.e. where
|
||||
every single object in the packfile/MIDX can find its
|
||||
parent links inside the same packfile/MIDX). This is a
|
||||
requirement for the bitmap index format, also present in
|
||||
JGit, that greatly reduces the complexity of the
|
||||
implementation.
|
||||
|
||||
- BITMAP_OPT_HASH_CACHE (0x4)
|
||||
If present, the end of the bitmap file contains
|
||||
`N` 32-bit name-hash values, one per object in the
|
||||
pack. The format and meaning of the name-hash is
|
||||
pack/MIDX. The format and meaning of the name-hash is
|
||||
described below.
|
||||
|
||||
4-byte entry count (network byte order)
|
||||
@ -33,7 +73,8 @@ GIT bitmap v1 format
|
||||
|
||||
20-byte checksum
|
||||
|
||||
The SHA1 checksum of the pack this bitmap index belongs to.
|
||||
The SHA1 checksum of the pack/MIDX this bitmap index
|
||||
belongs to.
|
||||
|
||||
- 4 EWAH bitmaps that act as type indexes
|
||||
|
||||
@ -50,7 +91,7 @@ GIT bitmap v1 format
|
||||
- Tags
|
||||
|
||||
In each bitmap, the `n`th bit is set to true if the `n`th object
|
||||
in the packfile is of that type.
|
||||
in the packfile or multi-pack index is of that type.
|
||||
|
||||
The obvious consequence is that the OR of all 4 bitmaps will result
|
||||
in a full set (all bits set), and the AND of all 4 bitmaps will
|
||||
@ -62,8 +103,9 @@ GIT bitmap v1 format
|
||||
Each entry contains the following:
|
||||
|
||||
- 4-byte object position (network byte order)
|
||||
The position **in the index for the packfile** where the
|
||||
bitmap for this commit is found.
|
||||
The position **in the index for the packfile or
|
||||
multi-pack index** where the bitmap for this commit is
|
||||
found.
|
||||
|
||||
- 1-byte XOR-offset
|
||||
The xor offset used to compress this bitmap. For an entry
|
||||
@ -146,10 +188,11 @@ Name-hash cache
|
||||
---------------
|
||||
|
||||
If the BITMAP_OPT_HASH_CACHE flag is set, the end of the bitmap contains
|
||||
a cache of 32-bit values, one per object in the pack. The value at
|
||||
a cache of 32-bit values, one per object in the pack/MIDX. The value at
|
||||
position `i` is the hash of the pathname at which the `i`th object
|
||||
(counting in index order) in the pack can be found. This can be fed
|
||||
into the delta heuristics to compare objects with similar pathnames.
|
||||
(counting in index or multi-pack index order) in the pack/MIDX can be found.
|
||||
This can be fed into the delta heuristics to compare objects with similar
|
||||
pathnames.
|
||||
|
||||
The hash algorithm used is:
|
||||
|
||||
|
@ -2,9 +2,9 @@ Directory rename detection
|
||||
==========================
|
||||
|
||||
Rename detection logic in diffcore-rename that checks for renames of
|
||||
individual files is aggregated and analyzed in merge-recursive for cases
|
||||
where combinations of renames indicate that a full directory has been
|
||||
renamed.
|
||||
individual files is also aggregated there and then analyzed in either
|
||||
merge-ort or merge-recursive for cases where combinations of renames
|
||||
indicate that a full directory has been renamed.
|
||||
|
||||
Scope of abilities
|
||||
------------------
|
||||
@ -88,9 +88,11 @@ directory rename detection support in:
|
||||
Folks have requested in the past that `git diff` detect directory
|
||||
renames and somehow simplify its output. It is not clear whether this
|
||||
would be desirable or how the output should be simplified, so this was
|
||||
simply not implemented. Further, to implement this, directory rename
|
||||
detection logic would need to move from merge-recursive to
|
||||
diffcore-rename.
|
||||
simply not implemented. Also, while diffcore-rename has most of the
|
||||
logic for detecting directory renames, some of the logic is still found
|
||||
within merge-ort and merge-recursive. Fully supporting directory
|
||||
rename detection in diffs would require copying or moving the remaining
|
||||
bits of logic to the diff machinery.
|
||||
|
||||
* am
|
||||
|
||||
|
@ -225,6 +225,9 @@ The client may send Extra Parameters (see
|
||||
Documentation/technical/pack-protocol.txt) as a colon-separated string
|
||||
in the Git-Protocol HTTP header.
|
||||
|
||||
Uses the `--http-backend-info-refs` option to
|
||||
linkgit:git-upload-pack[1].
|
||||
|
||||
Dumb Server Response
|
||||
^^^^^^^^^^^^^^^^^^^^
|
||||
Dumb servers MUST respond with the dumb server reply format.
|
||||
|
@ -36,7 +36,9 @@ Design Details
|
||||
directory of an alternate. It refers only to packfiles in that
|
||||
same directory.
|
||||
|
||||
- The core.multiPackIndex config setting must be on to consume MIDX files.
|
||||
- The core.multiPackIndex config setting must be on (which is the
|
||||
default) to consume MIDX files. Setting it to `false` prevents
|
||||
Git from reading a MIDX file, even if one exists.
|
||||
|
||||
- The file format includes parameters for the object ID hash
|
||||
function, so a future change of hash algorithm does not require
|
||||
@ -71,14 +73,10 @@ Future Work
|
||||
still reducing the number of binary searches required for object
|
||||
lookups.
|
||||
|
||||
- The reachability bitmap is currently paired directly with a single
|
||||
packfile, using the pack-order as the object order to hopefully
|
||||
compress the bitmaps well using run-length encoding. This could be
|
||||
extended to pair a reachability bitmap with a multi-pack-index. If
|
||||
the multi-pack-index is extended to store a "stable object order"
|
||||
- If the multi-pack-index is extended to store a "stable object order"
|
||||
(a function Order(hash) = integer that is constant for a given hash,
|
||||
even as the multi-pack-index is updated) then a reachability bitmap
|
||||
could point to a multi-pack-index and be updated independently.
|
||||
even as the multi-pack-index is updated) then MIDX bitmaps could be
|
||||
updated independently of the MIDX.
|
||||
|
||||
- Packfiles can be marked as "special" using empty files that share
|
||||
the initial name but replace ".pack" with ".keep" or ".promisor".
|
||||
|
@ -42,7 +42,8 @@ Initial Client Request
|
||||
In general a client can request to speak protocol v2 by sending
|
||||
`version=2` through the respective side-channel for the transport being
|
||||
used which inevitably sets `GIT_PROTOCOL`. More information can be
|
||||
found in `pack-protocol.txt` and `http-protocol.txt`. In all cases the
|
||||
found in `pack-protocol.txt` and `http-protocol.txt`, as well as the
|
||||
`GIT_PROTOCOL` definition in `git.txt`. In all cases the
|
||||
response from the server is the capability advertisement.
|
||||
|
||||
Git Transport
|
||||
@ -58,6 +59,8 @@ SSH and File Transport
|
||||
|
||||
When using either the ssh:// or file:// transport, the GIT_PROTOCOL
|
||||
environment variable must be set explicitly to include "version=2".
|
||||
The server may need to be configured to allow this environment variable
|
||||
to pass.
|
||||
|
||||
HTTP Transport
|
||||
~~~~~~~~~~~~~~
|
||||
@ -81,6 +84,12 @@ A v2 server would reply:
|
||||
Subsequent requests are then made directly to the service
|
||||
`$GIT_URL/git-upload-pack`. (This works the same for git-receive-pack).
|
||||
|
||||
Uses the `--http-backend-info-refs` option to
|
||||
linkgit:git-upload-pack[1].
|
||||
|
||||
The server may need to be configured to pass this header's contents via
|
||||
the `GIT_PROTOCOL` variable. See the discussion in `git-http-backend.txt`.
|
||||
|
||||
Capability Advertisement
|
||||
------------------------
|
||||
|
||||
@ -190,7 +199,11 @@ ls-refs takes in the following arguments:
|
||||
Show peeled tags.
|
||||
ref-prefix <prefix>
|
||||
When specified, only references having a prefix matching one of
|
||||
the provided prefixes are displayed.
|
||||
the provided prefixes are displayed. Multiple instances may be
|
||||
given, in which case references matching any prefix will be
|
||||
shown. Note that this is purely for optimization; a server MAY
|
||||
show refs not matching the prefix if it chooses, and clients
|
||||
should filter the result themselves.
|
||||
|
||||
If the 'unborn' feature is advertised the following argument can be
|
||||
included in the client's request.
|
||||
|
@ -13,6 +13,22 @@ Signatures always begin with `-----BEGIN PGP SIGNATURE-----`
|
||||
and end with `-----END PGP SIGNATURE-----`, unless gpg is told to
|
||||
produce RFC1991 signatures which use `MESSAGE` instead of `SIGNATURE`.
|
||||
|
||||
Signatures sometimes appear as a part of the normal payload
|
||||
(e.g. a signed tag has the signature block appended after the payload
|
||||
that the signature applies to), and sometimes appear in the value of
|
||||
an object header (e.g. a merge commit that merged a signed tag would
|
||||
have the entire tag contents on its "mergetag" header). In the case
|
||||
of the latter, the usual multi-line formatting rule for object
|
||||
headers applies. I.e. the second and subsequent lines are prefixed
|
||||
with a SP to signal that the line is continued from the previous
|
||||
line.
|
||||
|
||||
This is even true for an originally empty line. In the following
|
||||
examples, the end of line that ends with a whitespace letter is
|
||||
highlighted with a `$` sign; if you are trying to recreate these
|
||||
example by hand, do not cut and paste them---they are there
|
||||
primarily to highlight extra whitespace at the end of some lines.
|
||||
|
||||
The signed payload and the way the signature is embedded depends
|
||||
on the type of the object resp. transaction.
|
||||
|
||||
@ -78,7 +94,7 @@ author A U Thor <author@example.com> 1465981137 +0000
|
||||
committer C O Mitter <committer@example.com> 1465981137 +0000
|
||||
gpgsig -----BEGIN PGP SIGNATURE-----
|
||||
Version: GnuPG v1
|
||||
|
||||
$
|
||||
iQEcBAABAgAGBQJXYRjRAAoJEGEJLoW3InGJ3IwIAIY4SA6GxY3BjL60YyvsJPh/
|
||||
HRCJwH+w7wt3Yc/9/bW2F+gF72kdHOOs2jfv+OZhq0q4OAN6fvVSczISY/82LpS7
|
||||
DVdMQj2/YcHDT4xrDNBnXnviDO9G7am/9OE77kEbXrp7QPxvhjkicHNwy2rEflAA
|
||||
@ -128,13 +144,13 @@ mergetag object 04b871796dc0420f8e7561a895b52484b701d51a
|
||||
type commit
|
||||
tag signedtag
|
||||
tagger C O Mitter <committer@example.com> 1465981006 +0000
|
||||
|
||||
$
|
||||
signed tag
|
||||
|
||||
$
|
||||
signed tag message body
|
||||
-----BEGIN PGP SIGNATURE-----
|
||||
Version: GnuPG v1
|
||||
|
||||
$
|
||||
iQEcBAABAgAGBQJXYRhOAAoJEGEJLoW3InGJklkIAIcnhL7RwEb/+QeX9enkXhxn
|
||||
rxfdqrvWd1K80sl2TOt8Bg/NYwrUBw/RWJ+sg/hhHp4WtvE1HDGHlkEz3y11Lkuh
|
||||
8tSxS3qKTxXUGozyPGuE90sJfExhZlW4knIQ1wt/yWqM+33E9pN4hzPqLwyrdods
|
||||
|
@ -3190,7 +3190,7 @@ that *updated* thing--the old state that you added originally ends up
|
||||
not being pointed to by any commit or tree, so it's now a dangling blob
|
||||
object.
|
||||
|
||||
Similarly, when the "recursive" merge strategy runs, and finds that
|
||||
Similarly, when the "ort" merge strategy runs, and finds that
|
||||
there are criss-cross merges and thus more than one merge base (which is
|
||||
fairly unusual, but it does happen), it will generate one temporary
|
||||
midway tree (or possibly even more, if you had lots of criss-crossing
|
||||
|
@ -1,7 +1,7 @@
|
||||
#!/bin/sh
|
||||
|
||||
GVF=GIT-VERSION-FILE
|
||||
DEF_VER=v2.33.0-rc2
|
||||
DEF_VER=v2.34.0-rc0
|
||||
|
||||
LF='
|
||||
'
|
||||
|
15
INSTALL
15
INSTALL
@ -138,12 +138,15 @@ Issues of note:
|
||||
BLK_SHA1. Also included is a version optimized for PowerPC
|
||||
(PPC_SHA1).
|
||||
|
||||
- "libcurl" library is used by git-http-fetch, git-fetch, and, if
|
||||
the curl version >= 7.34.0, for git-imap-send. You might also
|
||||
want the "curl" executable for debugging purposes. If you do not
|
||||
use http:// or https:// repositories, and do not want to put
|
||||
patches into an IMAP mailbox, you do not have to have them
|
||||
(use NO_CURL).
|
||||
- "libcurl" library is used for fetching and pushing
|
||||
repositories over http:// or https://, as well as by
|
||||
git-imap-send if the curl version is >= 7.34.0. If you do
|
||||
not need that functionality, use NO_CURL to build without
|
||||
it.
|
||||
|
||||
Git requires version "7.19.4" or later of "libcurl" to build
|
||||
without NO_CURL. This version requirement may be bumped in
|
||||
the future.
|
||||
|
||||
- "expat" library; git-http-push uses it for remote lock
|
||||
management over DAV. Similar to "curl" above, this is optional
|
||||
|
143
Makefile
143
Makefile
@ -409,15 +409,6 @@ all::
|
||||
# Define NEEDS_LIBRT if your platform requires linking with librt (glibc version
|
||||
# before 2.17) for clock_gettime and CLOCK_MONOTONIC.
|
||||
#
|
||||
# Define USE_PARENS_AROUND_GETTEXT_N to "yes" if your compiler happily
|
||||
# compiles the following initialization:
|
||||
#
|
||||
# static const char s[] = ("FOO");
|
||||
#
|
||||
# and define it to "no" if you need to remove the parentheses () around the
|
||||
# constant. The default is "auto", which means to use parentheses if your
|
||||
# compiler is detected to support it.
|
||||
#
|
||||
# Define HAVE_BSD_SYSCTL if your platform has a BSD-compatible sysctl function.
|
||||
#
|
||||
# Define HAVE_GETDELIM if your system has the getdelim() function.
|
||||
@ -465,6 +456,9 @@ all::
|
||||
# the global variable _wpgmptr containing the absolute path of the current
|
||||
# executable (this is the case on Windows).
|
||||
#
|
||||
# INSTALL_STRIP can be set to "-s" to strip binaries during installation,
|
||||
# if your $(INSTALL) command supports the option.
|
||||
#
|
||||
# Define GENERATE_COMPILATION_DATABASE to "yes" to generate JSON compilation
|
||||
# database entries during compilation if your compiler supports it, using the
|
||||
# `-MJ` flag. The JSON entries will be placed in the `compile_commands/`
|
||||
@ -495,10 +489,9 @@ all::
|
||||
# setting this flag the exceptions are removed, and all of
|
||||
# -Wextra is used.
|
||||
#
|
||||
# pedantic:
|
||||
# no-pedantic:
|
||||
#
|
||||
# Enable -pedantic compilation. This also disables
|
||||
# USE_PARENS_AROUND_GETTEXT_N to produce only relevant warnings.
|
||||
# Disable -pedantic compilation.
|
||||
|
||||
GIT-VERSION-FILE: FORCE
|
||||
@$(SHELL_PATH) ./GIT-VERSION-GEN
|
||||
@ -616,7 +609,6 @@ SCRIPT_SH += git-submodule.sh
|
||||
SCRIPT_SH += git-web--browse.sh
|
||||
|
||||
SCRIPT_LIB += git-mergetool--lib
|
||||
SCRIPT_LIB += git-rebase--preserve-merges
|
||||
SCRIPT_LIB += git-sh-i18n
|
||||
SCRIPT_LIB += git-sh-setup
|
||||
|
||||
@ -824,6 +816,10 @@ XDIFF_LIB = xdiff/lib.a
|
||||
|
||||
GENERATED_H += command-list.h
|
||||
GENERATED_H += config-list.h
|
||||
GENERATED_H += hook-list.h
|
||||
|
||||
.PHONY: generated-hdrs
|
||||
generated-hdrs: $(GENERATED_H)
|
||||
|
||||
LIB_H := $(sort $(patsubst ./%,%,$(shell git ls-files '*.h' ':!t/' ':!Documentation/' 2>/dev/null || \
|
||||
$(FIND) . \
|
||||
@ -909,6 +905,7 @@ LIB_OBJS += hash-lookup.o
|
||||
LIB_OBJS += hashmap.o
|
||||
LIB_OBJS += help.o
|
||||
LIB_OBJS += hex.o
|
||||
LIB_OBJS += hook.o
|
||||
LIB_OBJS += ident.o
|
||||
LIB_OBJS += json-writer.o
|
||||
LIB_OBJS += kwset.o
|
||||
@ -1221,6 +1218,9 @@ PTHREAD_CFLAGS =
|
||||
SPARSE_FLAGS ?=
|
||||
SP_EXTRA_FLAGS = -Wno-universal-initializer
|
||||
|
||||
# For informing GIT-BUILD-OPTIONS of the SANITIZE=leak target
|
||||
SANITIZE_LEAK =
|
||||
|
||||
# For the 'coccicheck' target; setting SPATCH_BATCH_SIZE higher will
|
||||
# usually result in less CPU usage at the cost of higher peak memory.
|
||||
# Setting it to 0 will feed all files in a single spatch invocation.
|
||||
@ -1265,6 +1265,7 @@ BASIC_CFLAGS += -DSHA1DC_FORCE_ALIGNED_ACCESS
|
||||
endif
|
||||
ifneq ($(filter leak,$(SANITIZERS)),)
|
||||
BASIC_CFLAGS += -DSUPPRESS_ANNOTATED_LEAKS
|
||||
SANITIZE_LEAK = YesCompiledWithIt
|
||||
endif
|
||||
ifneq ($(filter address,$(SANITIZERS)),)
|
||||
NO_REGEX = NeededForASAN
|
||||
@ -1285,6 +1286,7 @@ endif
|
||||
|
||||
ifeq ($(COMPUTE_HEADER_DEPENDENCIES),auto)
|
||||
dep_check = $(shell $(CC) $(ALL_CFLAGS) \
|
||||
-Wno-pedantic \
|
||||
-c -MF /dev/null -MQ /dev/null -MMD -MP \
|
||||
-x c /dev/null -o /dev/null 2>&1; \
|
||||
echo $$?)
|
||||
@ -1310,6 +1312,7 @@ endif
|
||||
|
||||
ifeq ($(GENERATE_COMPILATION_DATABASE),yes)
|
||||
compdb_check = $(shell $(CC) $(ALL_CFLAGS) \
|
||||
-Wno-pedantic \
|
||||
-c -MJ /dev/null \
|
||||
-x c /dev/null -o /dev/null 2>&1; \
|
||||
echo $$?)
|
||||
@ -1347,14 +1350,6 @@ ifneq (,$(SOCKLEN_T))
|
||||
BASIC_CFLAGS += -Dsocklen_t=$(SOCKLEN_T)
|
||||
endif
|
||||
|
||||
ifeq (yes,$(USE_PARENS_AROUND_GETTEXT_N))
|
||||
BASIC_CFLAGS += -DUSE_PARENS_AROUND_GETTEXT_N=1
|
||||
else
|
||||
ifeq (no,$(USE_PARENS_AROUND_GETTEXT_N))
|
||||
BASIC_CFLAGS += -DUSE_PARENS_AROUND_GETTEXT_N=0
|
||||
endif
|
||||
endif
|
||||
|
||||
ifeq ($(uname_S),Darwin)
|
||||
ifndef NO_FINK
|
||||
ifeq ($(shell test -d /sw/lib && echo y),y)
|
||||
@ -1436,15 +1431,8 @@ else
|
||||
REMOTE_CURL_NAMES = $(REMOTE_CURL_PRIMARY) $(REMOTE_CURL_ALIASES)
|
||||
PROGRAM_OBJS += http-fetch.o
|
||||
PROGRAMS += $(REMOTE_CURL_NAMES)
|
||||
curl_check := $(shell (echo 070908; $(CURL_CONFIG) --vernum | sed -e '/^70[BC]/s/^/0/') 2>/dev/null | sort -r | sed -ne 2p)
|
||||
ifeq "$(curl_check)" "070908"
|
||||
ifndef NO_EXPAT
|
||||
PROGRAM_OBJS += http-push.o
|
||||
else
|
||||
EXCLUDED_PROGRAMS += git-http-push
|
||||
endif
|
||||
else
|
||||
EXCLUDED_PROGRAMS += git-http-push
|
||||
ifndef NO_EXPAT
|
||||
PROGRAM_OBJS += http-push.o
|
||||
endif
|
||||
curl_check := $(shell (echo 072200; $(CURL_CONFIG) --vernum | sed -e '/^70[BC]/s/^/0/') 2>/dev/null | sort -r | sed -ne 2p)
|
||||
ifeq "$(curl_check)" "072200"
|
||||
@ -1917,6 +1905,10 @@ ifneq ($(PROCFS_EXECUTABLE_PATH),)
|
||||
BASIC_CFLAGS += '-DPROCFS_EXECUTABLE_PATH="$(procfs_executable_path_SQ)"'
|
||||
endif
|
||||
|
||||
ifndef HAVE_PLATFORM_PROCINFO
|
||||
COMPAT_OBJS += compat/stub/procinfo.o
|
||||
endif
|
||||
|
||||
ifdef HAVE_NS_GET_EXECUTABLE_PATH
|
||||
BASIC_CFLAGS += -DHAVE_NS_GET_EXECUTABLE_PATH
|
||||
endif
|
||||
@ -2223,8 +2215,9 @@ git$X: git.o GIT-LDFLAGS $(BUILTIN_OBJS) $(GITLIBS)
|
||||
$(filter %.o,$^) $(LIBS)
|
||||
|
||||
help.sp help.s help.o: command-list.h
|
||||
hook.sp hook.s hook.o: hook-list.h
|
||||
|
||||
builtin/help.sp builtin/help.s builtin/help.o: config-list.h GIT-PREFIX
|
||||
builtin/help.sp builtin/help.s builtin/help.o: config-list.h hook-list.h GIT-PREFIX
|
||||
builtin/help.sp builtin/help.s builtin/help.o: EXTRA_CPPFLAGS = \
|
||||
'-DGIT_HTML_PATH="$(htmldir_relative_SQ)"' \
|
||||
'-DGIT_MAN_PATH="$(mandir_relative_SQ)"' \
|
||||
@ -2247,15 +2240,17 @@ $(BUILT_INS): git$X
|
||||
config-list.h: generate-configlist.sh
|
||||
|
||||
config-list.h: Documentation/*config.txt Documentation/config/*.txt
|
||||
$(QUIET_GEN)$(SHELL_PATH) ./generate-configlist.sh \
|
||||
>$@+ && mv $@+ $@
|
||||
$(QUIET_GEN)$(SHELL_PATH) ./generate-configlist.sh >$@
|
||||
|
||||
command-list.h: generate-cmdlist.sh command-list.txt
|
||||
|
||||
command-list.h: $(wildcard Documentation/git*.txt)
|
||||
$(QUIET_GEN)$(SHELL_PATH) ./generate-cmdlist.sh \
|
||||
$(patsubst %,--exclude-program %,$(EXCLUDED_PROGRAMS)) \
|
||||
command-list.txt >$@+ && mv $@+ $@
|
||||
command-list.txt >$@
|
||||
|
||||
hook-list.h: generate-hooklist.sh Documentation/githooks.txt
|
||||
$(QUIET_GEN)$(SHELL_PATH) ./generate-hooklist.sh >$@
|
||||
|
||||
SCRIPT_DEFINES = $(SHELL_PATH_SQ):$(DIFF_SQ):$(GIT_VERSION):\
|
||||
$(localedir_SQ):$(NO_CURL):$(USE_GETTEXT_SCHEME):$(SANE_TOOL_PATH_SQ):\
|
||||
@ -2477,7 +2472,6 @@ dep_args = -MF $(dep_file) -MQ $@ -MMD -MP
|
||||
endif
|
||||
|
||||
ifneq ($(COMPUTE_HEADER_DEPENDENCIES),yes)
|
||||
dep_dirs =
|
||||
missing_dep_dirs =
|
||||
dep_args =
|
||||
endif
|
||||
@ -2518,13 +2512,6 @@ ifneq ($(dep_files_present),)
|
||||
include $(dep_files_present)
|
||||
endif
|
||||
else
|
||||
# Dependencies on header files, for platforms that do not support
|
||||
# the gcc -MMD option.
|
||||
#
|
||||
# Dependencies on automatically generated headers such as command-list.h
|
||||
# should _not_ be included here, since they are necessary even when
|
||||
# building an object for the first time.
|
||||
|
||||
$(OBJECTS): $(LIB_H) $(GENERATED_H)
|
||||
endif
|
||||
|
||||
@ -2603,10 +2590,10 @@ $(REMOTE_CURL_PRIMARY): remote-curl.o http.o http-walker.o GIT-LDFLAGS $(GITLIBS
|
||||
$(CURL_LIBCURL) $(EXPAT_LIBEXPAT) $(LIBS)
|
||||
|
||||
$(LIB_FILE): $(LIB_OBJS)
|
||||
$(QUIET_AR)$(AR) $(ARFLAGS) $@ $^
|
||||
$(QUIET_AR)$(RM) $@ && $(AR) $(ARFLAGS) $@ $^
|
||||
|
||||
$(XDIFF_LIB): $(XDIFF_OBJS)
|
||||
$(QUIET_AR)$(AR) $(ARFLAGS) $@ $^
|
||||
$(QUIET_AR)$(RM) $@ && $(AR) $(ARFLAGS) $@ $^
|
||||
|
||||
export DEFAULT_EDITOR DEFAULT_PAGER
|
||||
|
||||
@ -2649,7 +2636,6 @@ XGETTEXT_FLAGS_PERL = $(XGETTEXT_FLAGS) --language=Perl \
|
||||
--keyword=__ --keyword=N__ --keyword="__n:1,2"
|
||||
LOCALIZED_C = $(C_OBJ:o=c) $(LIB_H) $(GENERATED_H)
|
||||
LOCALIZED_SH = $(SCRIPT_SH)
|
||||
LOCALIZED_SH += git-rebase--preserve-merges.sh
|
||||
LOCALIZED_SH += git-sh-setup.sh
|
||||
LOCALIZED_PERL = $(SCRIPT_PERL)
|
||||
|
||||
@ -2746,19 +2732,25 @@ FIND_SOURCE_FILES = ( \
|
||||
| sed -e 's|^\./||' \
|
||||
)
|
||||
|
||||
$(ETAGS_TARGET): FORCE
|
||||
$(QUIET_GEN)$(RM) "$(ETAGS_TARGET)+" && \
|
||||
$(FIND_SOURCE_FILES) | xargs etags -a -o "$(ETAGS_TARGET)+" && \
|
||||
mv "$(ETAGS_TARGET)+" "$(ETAGS_TARGET)"
|
||||
FOUND_SOURCE_FILES = $(shell $(FIND_SOURCE_FILES))
|
||||
|
||||
tags: FORCE
|
||||
$(QUIET_GEN)$(RM) tags+ && \
|
||||
$(FIND_SOURCE_FILES) | xargs ctags -a -o tags+ && \
|
||||
mv tags+ tags
|
||||
$(ETAGS_TARGET): $(FOUND_SOURCE_FILES)
|
||||
$(QUIET_GEN)$(RM) $@+ && \
|
||||
echo $(FOUND_SOURCE_FILES) | xargs etags -a -o $@+ && \
|
||||
mv $@+ $@
|
||||
|
||||
cscope:
|
||||
$(RM) cscope*
|
||||
$(FIND_SOURCE_FILES) | xargs cscope -b
|
||||
tags: $(FOUND_SOURCE_FILES)
|
||||
$(QUIET_GEN)$(RM) $@+ && \
|
||||
echo $(FOUND_SOURCE_FILES) | xargs ctags -a -o $@+ && \
|
||||
mv $@+ $@
|
||||
|
||||
cscope.out: $(FOUND_SOURCE_FILES)
|
||||
$(QUIET_GEN)$(RM) $@+ && \
|
||||
echo $(FOUND_SOURCE_FILES) | xargs cscope -f$@+ -b && \
|
||||
mv $@+ $@
|
||||
|
||||
.PHONY: cscope
|
||||
cscope: cscope.out
|
||||
|
||||
### Detect prefix changes
|
||||
TRACK_PREFIX = $(bindir_SQ):$(gitexecdir_SQ):$(template_dir_SQ):$(prefix_SQ):\
|
||||
@ -2808,6 +2800,7 @@ GIT-BUILD-OPTIONS: FORCE
|
||||
@echo NO_UNIX_SOCKETS=\''$(subst ','\'',$(subst ','\'',$(NO_UNIX_SOCKETS)))'\' >>$@+
|
||||
@echo PAGER_ENV=\''$(subst ','\'',$(subst ','\'',$(PAGER_ENV)))'\' >>$@+
|
||||
@echo DC_SHA1=\''$(subst ','\'',$(subst ','\'',$(DC_SHA1)))'\' >>$@+
|
||||
@echo SANITIZE_LEAK=\''$(subst ','\'',$(subst ','\'',$(SANITIZE_LEAK)))'\' >>$@+
|
||||
@echo X=\'$(X)\' >>$@+
|
||||
ifdef TEST_OUTPUT_DIRECTORY
|
||||
@echo TEST_OUTPUT_DIRECTORY=\''$(subst ','\'',$(subst ','\'',$(TEST_OUTPUT_DIRECTORY)))'\' >>$@+
|
||||
@ -2848,6 +2841,11 @@ ifdef GIT_TEST_INDEX_VERSION
|
||||
endif
|
||||
ifdef GIT_TEST_PERL_FATAL_WARNINGS
|
||||
@echo GIT_TEST_PERL_FATAL_WARNINGS=\''$(subst ','\'',$(subst ','\'',$(GIT_TEST_PERL_FATAL_WARNINGS)))'\' >>$@+
|
||||
endif
|
||||
ifdef RUNTIME_PREFIX
|
||||
@echo RUNTIME_PREFIX=\'true\' >>$@+
|
||||
else
|
||||
@echo RUNTIME_PREFIX=\'false\' >>$@+
|
||||
endif
|
||||
@if cmp $@+ $@ >/dev/null 2>&1; then $(RM) $@+; else mv $@+ $@; fi
|
||||
|
||||
@ -2903,14 +2901,16 @@ check-sha1:: t/helper/test-tool$X
|
||||
|
||||
SP_OBJ = $(patsubst %.o,%.sp,$(C_OBJ))
|
||||
|
||||
$(SP_OBJ): %.sp: %.c GIT-CFLAGS FORCE
|
||||
$(SP_OBJ): %.sp: %.c %.o
|
||||
$(QUIET_SP)cgcc -no-compile $(ALL_CFLAGS) $(EXTRA_CPPFLAGS) \
|
||||
$(SPARSE_FLAGS) $(SP_EXTRA_FLAGS) $<
|
||||
-Wsparse-error \
|
||||
$(SPARSE_FLAGS) $(SP_EXTRA_FLAGS) $< && \
|
||||
>$@
|
||||
|
||||
.PHONY: sparse $(SP_OBJ)
|
||||
.PHONY: sparse
|
||||
sparse: $(SP_OBJ)
|
||||
|
||||
EXCEPT_HDRS := command-list.h config-list.h unicode-width.h compat/% xdiff/%
|
||||
EXCEPT_HDRS := $(GENERATED_H) unicode-width.h compat/% xdiff/%
|
||||
ifndef GCRYPT_SHA256
|
||||
EXCEPT_HDRS += sha256/gcrypt.h
|
||||
endif
|
||||
@ -2932,7 +2932,8 @@ hdr-check: $(HCO)
|
||||
style:
|
||||
git clang-format --style file --diff --extensions c,h
|
||||
|
||||
check: config-list.h command-list.h
|
||||
.PHONY: check
|
||||
check: $(GENERATED_H)
|
||||
@if sparse; \
|
||||
then \
|
||||
echo >&2 "Use 'make sparse' instead"; \
|
||||
@ -2942,7 +2943,7 @@ check: config-list.h command-list.h
|
||||
exit 1; \
|
||||
fi
|
||||
|
||||
FOUND_C_SOURCES = $(filter %.c,$(shell $(FIND_SOURCE_FILES)))
|
||||
FOUND_C_SOURCES = $(filter %.c,$(FOUND_SOURCE_FILES))
|
||||
COCCI_SOURCES = $(filter-out $(THIRD_PARTY_SOURCES),$(FOUND_C_SOURCES))
|
||||
|
||||
%.cocci.patch: %.cocci $(COCCI_SOURCES)
|
||||
@ -2995,7 +2996,8 @@ mergetools_instdir = $(prefix)/$(mergetoolsdir)
|
||||
endif
|
||||
mergetools_instdir_SQ = $(subst ','\'',$(mergetools_instdir))
|
||||
|
||||
install_bindir_programs := $(patsubst %,%$X,$(BINDIR_PROGRAMS_NEED_X)) $(BINDIR_PROGRAMS_NO_X)
|
||||
install_bindir_xprograms := $(patsubst %,%$X,$(BINDIR_PROGRAMS_NEED_X))
|
||||
install_bindir_programs := $(install_bindir_xprograms) $(BINDIR_PROGRAMS_NO_X)
|
||||
|
||||
.PHONY: profile-install profile-fast-install
|
||||
profile-install: profile
|
||||
@ -3004,12 +3006,17 @@ profile-install: profile
|
||||
profile-fast-install: profile-fast
|
||||
$(MAKE) install
|
||||
|
||||
INSTALL_STRIP =
|
||||
|
||||
install: all
|
||||
$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(bindir_SQ)'
|
||||
$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(gitexec_instdir_SQ)'
|
||||
$(INSTALL) $(ALL_PROGRAMS) '$(DESTDIR_SQ)$(gitexec_instdir_SQ)'
|
||||
$(INSTALL) $(INSTALL_STRIP) $(PROGRAMS) '$(DESTDIR_SQ)$(gitexec_instdir_SQ)'
|
||||
$(INSTALL) $(SCRIPTS) '$(DESTDIR_SQ)$(gitexec_instdir_SQ)'
|
||||
$(INSTALL) -m 644 $(SCRIPT_LIB) '$(DESTDIR_SQ)$(gitexec_instdir_SQ)'
|
||||
$(INSTALL) $(install_bindir_programs) '$(DESTDIR_SQ)$(bindir_SQ)'
|
||||
$(INSTALL) $(INSTALL_STRIP) $(install_bindir_xprograms) '$(DESTDIR_SQ)$(bindir_SQ)'
|
||||
$(INSTALL) $(BINDIR_PROGRAMS_NO_X) '$(DESTDIR_SQ)$(bindir_SQ)'
|
||||
|
||||
ifdef MSVC
|
||||
# We DO NOT install the individual foo.o.pdb files because they
|
||||
# have already been rolled up into the exe's pdb file.
|
||||
@ -3090,8 +3097,7 @@ endif
|
||||
ln "$$execdir/git-remote-http$X" "$$execdir/$$p" 2>/dev/null || \
|
||||
ln -s "git-remote-http$X" "$$execdir/$$p" 2>/dev/null || \
|
||||
cp "$$execdir/git-remote-http$X" "$$execdir/$$p" || exit; } \
|
||||
done && \
|
||||
./check_bindir "z$$bindir" "z$$execdir" "$$bindir/git-add$X"
|
||||
done
|
||||
|
||||
.PHONY: install-gitweb install-doc install-man install-man-perl install-html install-info install-pdf
|
||||
.PHONY: quick-install-doc quick-install-man quick-install-html
|
||||
@ -3229,6 +3235,7 @@ clean: profile-clean coverage-clean cocciclean
|
||||
$(RM) $(ALL_PROGRAMS) $(SCRIPT_LIB) $(BUILT_INS) git$X
|
||||
$(RM) $(TEST_PROGRAMS)
|
||||
$(RM) $(FUZZ_PROGRAMS)
|
||||
$(RM) $(SP_OBJ)
|
||||
$(RM) $(HCC)
|
||||
$(RM) -r bin-wrappers $(dep_dirs) $(compdb_dir) compile_commands.json
|
||||
$(RM) -r po/build/
|
||||
@ -3267,7 +3274,7 @@ endif
|
||||
|
||||
.PHONY: all install profile-clean cocciclean clean strip
|
||||
.PHONY: shell_compatibility_test please_set_SHELL_PATH_to_a_more_modern_shell
|
||||
.PHONY: FORCE cscope
|
||||
.PHONY: FORCE
|
||||
|
||||
### Check documentation
|
||||
#
|
||||
|
@ -102,8 +102,12 @@ struct prefix_item_list {
|
||||
int *selected; /* for multi-selections */
|
||||
size_t min_length, max_length;
|
||||
};
|
||||
#define PREFIX_ITEM_LIST_INIT \
|
||||
{ STRING_LIST_INIT_DUP, STRING_LIST_INIT_NODUP, NULL, 1, 4 }
|
||||
#define PREFIX_ITEM_LIST_INIT { \
|
||||
.items = STRING_LIST_INIT_DUP, \
|
||||
.sorted = STRING_LIST_INIT_NODUP, \
|
||||
.min_length = 1, \
|
||||
.max_length = 4, \
|
||||
}
|
||||
|
||||
static void prefix_item_list_clear(struct prefix_item_list *list)
|
||||
{
|
||||
|
100
advice.c
100
advice.c
@ -4,37 +4,6 @@
|
||||
#include "help.h"
|
||||
#include "string-list.h"
|
||||
|
||||
int advice_fetch_show_forced_updates = 1;
|
||||
int advice_push_update_rejected = 1;
|
||||
int advice_push_non_ff_current = 1;
|
||||
int advice_push_non_ff_matching = 1;
|
||||
int advice_push_already_exists = 1;
|
||||
int advice_push_fetch_first = 1;
|
||||
int advice_push_needs_force = 1;
|
||||
int advice_push_unqualified_ref_name = 1;
|
||||
int advice_push_ref_needs_update = 1;
|
||||
int advice_status_hints = 1;
|
||||
int advice_status_u_option = 1;
|
||||
int advice_status_ahead_behind_warning = 1;
|
||||
int advice_commit_before_merge = 1;
|
||||
int advice_reset_quiet_warning = 1;
|
||||
int advice_resolve_conflict = 1;
|
||||
int advice_sequencer_in_use = 1;
|
||||
int advice_implicit_identity = 1;
|
||||
int advice_detached_head = 1;
|
||||
int advice_set_upstream_failure = 1;
|
||||
int advice_object_name_warning = 1;
|
||||
int advice_amworkdir = 1;
|
||||
int advice_rm_hints = 1;
|
||||
int advice_add_embedded_repo = 1;
|
||||
int advice_ignored_hook = 1;
|
||||
int advice_waiting_for_editor = 1;
|
||||
int advice_graft_file_deprecated = 1;
|
||||
int advice_checkout_ambiguous_remote_branch_name = 1;
|
||||
int advice_submodule_alternate_error_strategy_die = 1;
|
||||
int advice_add_ignored_file = 1;
|
||||
int advice_add_empty_pathspec = 1;
|
||||
|
||||
static int advice_use_color = -1;
|
||||
static char advice_colors[][COLOR_MAXLEN] = {
|
||||
GIT_COLOR_RESET,
|
||||
@ -62,50 +31,13 @@ static const char *advise_get_color(enum color_advice ix)
|
||||
return "";
|
||||
}
|
||||
|
||||
static struct {
|
||||
const char *name;
|
||||
int *preference;
|
||||
} advice_config[] = {
|
||||
{ "fetchShowForcedUpdates", &advice_fetch_show_forced_updates },
|
||||
{ "pushUpdateRejected", &advice_push_update_rejected },
|
||||
{ "pushNonFFCurrent", &advice_push_non_ff_current },
|
||||
{ "pushNonFFMatching", &advice_push_non_ff_matching },
|
||||
{ "pushAlreadyExists", &advice_push_already_exists },
|
||||
{ "pushFetchFirst", &advice_push_fetch_first },
|
||||
{ "pushNeedsForce", &advice_push_needs_force },
|
||||
{ "pushUnqualifiedRefName", &advice_push_unqualified_ref_name },
|
||||
{ "pushRefNeedsUpdate", &advice_push_ref_needs_update },
|
||||
{ "statusHints", &advice_status_hints },
|
||||
{ "statusUoption", &advice_status_u_option },
|
||||
{ "statusAheadBehindWarning", &advice_status_ahead_behind_warning },
|
||||
{ "commitBeforeMerge", &advice_commit_before_merge },
|
||||
{ "resetQuiet", &advice_reset_quiet_warning },
|
||||
{ "resolveConflict", &advice_resolve_conflict },
|
||||
{ "sequencerInUse", &advice_sequencer_in_use },
|
||||
{ "implicitIdentity", &advice_implicit_identity },
|
||||
{ "detachedHead", &advice_detached_head },
|
||||
{ "setUpstreamFailure", &advice_set_upstream_failure },
|
||||
{ "objectNameWarning", &advice_object_name_warning },
|
||||
{ "amWorkDir", &advice_amworkdir },
|
||||
{ "rmHints", &advice_rm_hints },
|
||||
{ "addEmbeddedRepo", &advice_add_embedded_repo },
|
||||
{ "ignoredHook", &advice_ignored_hook },
|
||||
{ "waitingForEditor", &advice_waiting_for_editor },
|
||||
{ "graftFileDeprecated", &advice_graft_file_deprecated },
|
||||
{ "checkoutAmbiguousRemoteBranchName", &advice_checkout_ambiguous_remote_branch_name },
|
||||
{ "submoduleAlternateErrorStrategyDie", &advice_submodule_alternate_error_strategy_die },
|
||||
{ "addIgnoredFile", &advice_add_ignored_file },
|
||||
{ "addEmptyPathspec", &advice_add_empty_pathspec },
|
||||
|
||||
/* make this an alias for backward compatibility */
|
||||
{ "pushNonFastForward", &advice_push_update_rejected }
|
||||
};
|
||||
|
||||
static struct {
|
||||
const char *key;
|
||||
int enabled;
|
||||
} advice_setting[] = {
|
||||
[ADVICE_ADD_EMBEDDED_REPO] = { "addEmbeddedRepo", 1 },
|
||||
[ADVICE_ADD_EMPTY_PATHSPEC] = { "addEmptyPathspec", 1 },
|
||||
[ADVICE_ADD_IGNORED_FILE] = { "addIgnoredFile", 1 },
|
||||
[ADVICE_AM_WORK_DIR] = { "amWorkDir", 1 },
|
||||
[ADVICE_CHECKOUT_AMBIGUOUS_REMOTE_BRANCH_NAME] = { "checkoutAmbiguousRemoteBranchName", 1 },
|
||||
[ADVICE_COMMIT_BEFORE_MERGE] = { "commitBeforeMerge", 1 },
|
||||
@ -133,6 +65,7 @@ static struct {
|
||||
[ADVICE_RM_HINTS] = { "rmHints", 1 },
|
||||
[ADVICE_SEQUENCER_IN_USE] = { "sequencerInUse", 1 },
|
||||
[ADVICE_SET_UPSTREAM_FAILURE] = { "setUpstreamFailure", 1 },
|
||||
[ADVICE_SKIPPED_CHERRY_PICKS] = { "skippedCherryPicks", 1 },
|
||||
[ADVICE_STATUS_AHEAD_BEHIND_WARNING] = { "statusAheadBehindWarning", 1 },
|
||||
[ADVICE_STATUS_HINTS] = { "statusHints", 1 },
|
||||
[ADVICE_STATUS_U_OPTION] = { "statusUoption", 1 },
|
||||
@ -221,13 +154,6 @@ int git_default_advice_config(const char *var, const char *value)
|
||||
if (!skip_prefix(var, "advice.", &k))
|
||||
return 0;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(advice_config); i++) {
|
||||
if (strcasecmp(k, advice_config[i].name))
|
||||
continue;
|
||||
*advice_config[i].preference = git_config_bool(var, value);
|
||||
break;
|
||||
}
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(advice_setting); i++) {
|
||||
if (strcasecmp(k, advice_setting[i].key))
|
||||
continue;
|
||||
@ -262,7 +188,7 @@ int error_resolve_conflict(const char *me)
|
||||
error(_("It is not possible to %s because you have unmerged files."),
|
||||
me);
|
||||
|
||||
if (advice_resolve_conflict)
|
||||
if (advice_enabled(ADVICE_RESOLVE_CONFLICT))
|
||||
/*
|
||||
* Message used both when 'git commit' fails and when
|
||||
* other commands doing a merge do.
|
||||
@ -281,11 +207,16 @@ void NORETURN die_resolve_conflict(const char *me)
|
||||
void NORETURN die_conclude_merge(void)
|
||||
{
|
||||
error(_("You have not concluded your merge (MERGE_HEAD exists)."));
|
||||
if (advice_resolve_conflict)
|
||||
if (advice_enabled(ADVICE_RESOLVE_CONFLICT))
|
||||
advise(_("Please, commit your changes before merging."));
|
||||
die(_("Exiting because of unfinished merge."));
|
||||
}
|
||||
|
||||
void NORETURN die_ff_impossible(void)
|
||||
{
|
||||
die(_("Not possible to fast-forward, aborting."));
|
||||
}
|
||||
|
||||
void advise_on_updating_sparse_paths(struct string_list *pathspec_list)
|
||||
{
|
||||
struct string_list_item *item;
|
||||
@ -293,15 +224,16 @@ void advise_on_updating_sparse_paths(struct string_list *pathspec_list)
|
||||
if (!pathspec_list->nr)
|
||||
return;
|
||||
|
||||
fprintf(stderr, _("The following pathspecs didn't match any"
|
||||
" eligible path, but they do match index\n"
|
||||
"entries outside the current sparse checkout:\n"));
|
||||
fprintf(stderr, _("The following paths and/or pathspecs matched paths that exist\n"
|
||||
"outside of your sparse-checkout definition, so will not be\n"
|
||||
"updated in the index:\n"));
|
||||
for_each_string_list_item(item, pathspec_list)
|
||||
fprintf(stderr, "%s\n", item->string);
|
||||
|
||||
advise_if_enabled(ADVICE_UPDATE_SPARSE_PATH,
|
||||
_("Disable or modify the sparsity rules if you intend"
|
||||
" to update such entries."));
|
||||
_("If you intend to update such entries, try one of the following:\n"
|
||||
"* Use the --sparse option.\n"
|
||||
"* Disable or modify the sparsity rules."));
|
||||
}
|
||||
|
||||
void detach_advice(const char *new_name)
|
||||
|
35
advice.h
35
advice.h
@ -5,37 +5,6 @@
|
||||
|
||||
struct string_list;
|
||||
|
||||
extern int advice_fetch_show_forced_updates;
|
||||
extern int advice_push_update_rejected;
|
||||
extern int advice_push_non_ff_current;
|
||||
extern int advice_push_non_ff_matching;
|
||||
extern int advice_push_already_exists;
|
||||
extern int advice_push_fetch_first;
|
||||
extern int advice_push_needs_force;
|
||||
extern int advice_push_unqualified_ref_name;
|
||||
extern int advice_push_ref_needs_update;
|
||||
extern int advice_status_hints;
|
||||
extern int advice_status_u_option;
|
||||
extern int advice_status_ahead_behind_warning;
|
||||
extern int advice_commit_before_merge;
|
||||
extern int advice_reset_quiet_warning;
|
||||
extern int advice_resolve_conflict;
|
||||
extern int advice_sequencer_in_use;
|
||||
extern int advice_implicit_identity;
|
||||
extern int advice_detached_head;
|
||||
extern int advice_set_upstream_failure;
|
||||
extern int advice_object_name_warning;
|
||||
extern int advice_amworkdir;
|
||||
extern int advice_rm_hints;
|
||||
extern int advice_add_embedded_repo;
|
||||
extern int advice_ignored_hook;
|
||||
extern int advice_waiting_for_editor;
|
||||
extern int advice_graft_file_deprecated;
|
||||
extern int advice_checkout_ambiguous_remote_branch_name;
|
||||
extern int advice_submodule_alternate_error_strategy_die;
|
||||
extern int advice_add_ignored_file;
|
||||
extern int advice_add_empty_pathspec;
|
||||
|
||||
/*
|
||||
* To add a new advice, you need to:
|
||||
* Define a new advice_type.
|
||||
@ -45,6 +14,8 @@ extern int advice_add_empty_pathspec;
|
||||
*/
|
||||
enum advice_type {
|
||||
ADVICE_ADD_EMBEDDED_REPO,
|
||||
ADVICE_ADD_EMPTY_PATHSPEC,
|
||||
ADVICE_ADD_IGNORED_FILE,
|
||||
ADVICE_AM_WORK_DIR,
|
||||
ADVICE_CHECKOUT_AMBIGUOUS_REMOTE_BRANCH_NAME,
|
||||
ADVICE_COMMIT_BEFORE_MERGE,
|
||||
@ -75,6 +46,7 @@ extern int advice_add_empty_pathspec;
|
||||
ADVICE_SUBMODULE_ALTERNATE_ERROR_STRATEGY_DIE,
|
||||
ADVICE_UPDATE_SPARSE_PATH,
|
||||
ADVICE_WAITING_FOR_EDITOR,
|
||||
ADVICE_SKIPPED_CHERRY_PICKS,
|
||||
};
|
||||
|
||||
int git_default_advice_config(const char *var, const char *value);
|
||||
@ -96,6 +68,7 @@ void advise_if_enabled(enum advice_type type, const char *advice, ...);
|
||||
int error_resolve_conflict(const char *me);
|
||||
void NORETURN die_resolve_conflict(const char *me);
|
||||
void NORETURN die_conclude_merge(void);
|
||||
void NORETURN die_ff_impossible(void);
|
||||
void advise_on_updating_sparse_paths(struct string_list *pathspec_list);
|
||||
void detach_advice(const char *new_name);
|
||||
|
||||
|
22
apply.c
22
apply.c
@ -1917,6 +1917,7 @@ static struct fragment *parse_binary_hunk(struct apply_state *state,
|
||||
|
||||
state->linenr++;
|
||||
buffer += llen;
|
||||
size -= llen;
|
||||
while (1) {
|
||||
int byte_length, max_byte_length, newsize;
|
||||
llen = linelen(buffer, size);
|
||||
@ -3467,6 +3468,21 @@ static int load_preimage(struct apply_state *state,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int resolve_to(struct image *image, const struct object_id *result_id)
|
||||
{
|
||||
unsigned long size;
|
||||
enum object_type type;
|
||||
|
||||
clear_image(image);
|
||||
|
||||
image->buf = read_object_file(result_id, &type, &size);
|
||||
if (!image->buf || type != OBJ_BLOB)
|
||||
die("unable to read blob object %s", oid_to_hex(result_id));
|
||||
image->len = size;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int three_way_merge(struct apply_state *state,
|
||||
struct image *image,
|
||||
char *path,
|
||||
@ -3478,6 +3494,12 @@ static int three_way_merge(struct apply_state *state,
|
||||
mmbuffer_t result = { NULL };
|
||||
int status;
|
||||
|
||||
/* resolve trivial cases first */
|
||||
if (oideq(base, ours))
|
||||
return resolve_to(image, theirs);
|
||||
else if (oideq(base, theirs) || oideq(ours, theirs))
|
||||
return resolve_to(image, ours);
|
||||
|
||||
read_mmblob(&base_file, base);
|
||||
read_mmblob(&our_file, ours);
|
||||
read_mmblob(&their_file, theirs);
|
||||
|
@ -191,7 +191,7 @@ static int write_archive_entry(const struct object_id *oid, const char *base,
|
||||
return err;
|
||||
}
|
||||
|
||||
static void queue_directory(const unsigned char *sha1,
|
||||
static void queue_directory(const struct object_id *oid,
|
||||
struct strbuf *base, const char *filename,
|
||||
unsigned mode, struct archiver_context *c)
|
||||
{
|
||||
@ -203,7 +203,7 @@ static void queue_directory(const unsigned char *sha1,
|
||||
d->mode = mode;
|
||||
c->bottom = d;
|
||||
d->len = xsnprintf(d->path, len, "%.*s%s/", (int)base->len, base->buf, filename);
|
||||
oidread(&d->oid, sha1);
|
||||
oidcpy(&d->oid, oid);
|
||||
}
|
||||
|
||||
static int write_directory(struct archiver_context *c)
|
||||
@ -250,8 +250,7 @@ static int queue_or_write_archive_entry(const struct object_id *oid,
|
||||
|
||||
if (check_attr_export_ignore(check))
|
||||
return 0;
|
||||
queue_directory(oid->hash, base, filename,
|
||||
mode, c);
|
||||
queue_directory(oid, base, filename, mode, c);
|
||||
return READ_TREE_RECURSIVE;
|
||||
}
|
||||
|
||||
|
15
attr.c
15
attr.c
@ -14,6 +14,7 @@
|
||||
#include "utf8.h"
|
||||
#include "quote.h"
|
||||
#include "thread-utils.h"
|
||||
#include "dir.h"
|
||||
|
||||
const char git_attr__true[] = "(builtin)true";
|
||||
const char git_attr__false[] = "\0(builtin)false";
|
||||
@ -744,6 +745,20 @@ static struct attr_stack *read_attr_from_index(struct index_state *istate,
|
||||
if (!istate)
|
||||
return NULL;
|
||||
|
||||
/*
|
||||
* The .gitattributes file only applies to files within its
|
||||
* parent directory. In the case of cone-mode sparse-checkout,
|
||||
* the .gitattributes file is sparse if and only if all paths
|
||||
* within that directory are also sparse. Thus, don't load the
|
||||
* .gitattributes file since it will not matter.
|
||||
*
|
||||
* In the case of a sparse index, it is critical that we don't go
|
||||
* looking for a .gitattributes file, as doing so would cause the
|
||||
* index to expand.
|
||||
*/
|
||||
if (!path_in_cone_mode_sparse_checkout(path, istate))
|
||||
return NULL;
|
||||
|
||||
buf = read_blob_data_from_index(istate, path, NULL);
|
||||
if (!buf)
|
||||
return NULL;
|
||||
|
26
bisect.c
26
bisect.c
@ -23,7 +23,6 @@ static struct oid_array skipped_revs;
|
||||
static struct object_id *current_bad_oid;
|
||||
|
||||
static const char *argv_checkout[] = {"checkout", "-q", NULL, "--", NULL};
|
||||
static const char *argv_show_branch[] = {"show-branch", NULL, NULL};
|
||||
|
||||
static const char *term_bad;
|
||||
static const char *term_good;
|
||||
@ -728,7 +727,9 @@ static int is_expected_rev(const struct object_id *oid)
|
||||
static enum bisect_error bisect_checkout(const struct object_id *bisect_rev, int no_checkout)
|
||||
{
|
||||
char bisect_rev_hex[GIT_MAX_HEXSZ + 1];
|
||||
enum bisect_error res = BISECT_OK;
|
||||
struct commit *commit;
|
||||
struct pretty_print_context pp = {0};
|
||||
struct strbuf commit_msg = STRBUF_INIT;
|
||||
|
||||
oid_to_hex_r(bisect_rev_hex, bisect_rev);
|
||||
update_ref(NULL, "BISECT_EXPECTED_REV", bisect_rev, NULL, 0, UPDATE_REFS_DIE_ON_ERR);
|
||||
@ -738,24 +739,21 @@ static enum bisect_error bisect_checkout(const struct object_id *bisect_rev, int
|
||||
update_ref(NULL, "BISECT_HEAD", bisect_rev, NULL, 0,
|
||||
UPDATE_REFS_DIE_ON_ERR);
|
||||
} else {
|
||||
res = run_command_v_opt(argv_checkout, RUN_GIT_CMD);
|
||||
if (res)
|
||||
if (run_command_v_opt(argv_checkout, RUN_GIT_CMD))
|
||||
/*
|
||||
* Errors in `run_command()` itself, signaled by res < 0,
|
||||
* and errors in the child process, signaled by res > 0
|
||||
* can both be treated as regular BISECT_FAILURE (-1).
|
||||
* can both be treated as regular BISECT_FAILED (-1).
|
||||
*/
|
||||
return -abs(res);
|
||||
return BISECT_FAILED;
|
||||
}
|
||||
|
||||
argv_show_branch[1] = bisect_rev_hex;
|
||||
res = run_command_v_opt(argv_show_branch, RUN_GIT_CMD);
|
||||
/*
|
||||
* Errors in `run_command()` itself, signaled by res < 0,
|
||||
* and errors in the child process, signaled by res > 0
|
||||
* can both be treated as regular BISECT_FAILURE (-1).
|
||||
*/
|
||||
return -abs(res);
|
||||
commit = lookup_commit_reference(the_repository, bisect_rev);
|
||||
format_commit_message(commit, "[%H] %s%n", &commit_msg, &pp);
|
||||
fputs(commit_msg.buf, stdout);
|
||||
strbuf_release(&commit_msg);
|
||||
|
||||
return BISECT_OK;
|
||||
}
|
||||
|
||||
static struct commit *get_commit_reference(struct repository *r,
|
||||
|
2
branch.c
2
branch.c
@ -271,7 +271,7 @@ void create_branch(struct repository *r,
|
||||
real_ref = NULL;
|
||||
if (get_oid_mb(start_name, &oid)) {
|
||||
if (explicit_tracking) {
|
||||
if (advice_set_upstream_failure) {
|
||||
if (advice_enabled(ADVICE_SET_UPSTREAM_FAILURE)) {
|
||||
error(_(upstream_missing), start_name);
|
||||
advise(_(upstream_advice));
|
||||
exit(1);
|
||||
|
@ -225,7 +225,6 @@ int cmd_submodule__helper(int argc, const char **argv, const char *prefix);
|
||||
int cmd_switch(int argc, const char **argv, const char *prefix);
|
||||
int cmd_symbolic_ref(int argc, const char **argv, const char *prefix);
|
||||
int cmd_tag(int argc, const char **argv, const char *prefix);
|
||||
int cmd_tar_tree(int argc, const char **argv, const char *prefix);
|
||||
int cmd_unpack_file(int argc, const char **argv, const char *prefix);
|
||||
int cmd_unpack_objects(int argc, const char **argv, const char *prefix);
|
||||
int cmd_update_index(int argc, const char **argv, const char *prefix);
|
||||
|
@ -30,6 +30,7 @@ static int patch_interactive, add_interactive, edit_interactive;
|
||||
static int take_worktree_changes;
|
||||
static int add_renormalize;
|
||||
static int pathspec_file_nul;
|
||||
static int include_sparse;
|
||||
static const char *pathspec_from_file;
|
||||
static int legacy_stash_p; /* support for the scripted `git stash` */
|
||||
|
||||
@ -46,7 +47,9 @@ static int chmod_pathspec(struct pathspec *pathspec, char flip, int show_only)
|
||||
struct cache_entry *ce = active_cache[i];
|
||||
int err;
|
||||
|
||||
if (ce_skip_worktree(ce))
|
||||
if (!include_sparse &&
|
||||
(ce_skip_worktree(ce) ||
|
||||
!path_in_sparse_checkout(ce->name, &the_index)))
|
||||
continue;
|
||||
|
||||
if (pathspec && !ce_path_match(&the_index, ce, pathspec, NULL))
|
||||
@ -94,6 +97,10 @@ static void update_callback(struct diff_queue_struct *q,
|
||||
for (i = 0; i < q->nr; i++) {
|
||||
struct diff_filepair *p = q->queue[i];
|
||||
const char *path = p->one->path;
|
||||
|
||||
if (!include_sparse && !path_in_sparse_checkout(path, &the_index))
|
||||
continue;
|
||||
|
||||
switch (fix_unmerged_status(p, data)) {
|
||||
default:
|
||||
die(_("unexpected diff status %c"), p->status);
|
||||
@ -144,12 +151,12 @@ static int renormalize_tracked_files(const struct pathspec *pathspec, int flags)
|
||||
{
|
||||
int i, retval = 0;
|
||||
|
||||
/* TODO: audit for interaction with sparse-index. */
|
||||
ensure_full_index(&the_index);
|
||||
for (i = 0; i < active_nr; i++) {
|
||||
struct cache_entry *ce = active_cache[i];
|
||||
|
||||
if (ce_skip_worktree(ce))
|
||||
if (!include_sparse &&
|
||||
(ce_skip_worktree(ce) ||
|
||||
!path_in_sparse_checkout(ce->name, &the_index)))
|
||||
continue;
|
||||
if (ce_stage(ce))
|
||||
continue; /* do not touch unmerged paths */
|
||||
@ -198,7 +205,10 @@ static int refresh(int verbose, const struct pathspec *pathspec)
|
||||
_("Unstaged changes after refreshing the index:"));
|
||||
for (i = 0; i < pathspec->nr; i++) {
|
||||
if (!seen[i]) {
|
||||
if (matches_skip_worktree(pathspec, i, &skip_worktree_seen)) {
|
||||
const char *path = pathspec->items[i].original;
|
||||
|
||||
if (matches_skip_worktree(pathspec, i, &skip_worktree_seen) ||
|
||||
!path_in_sparse_checkout(path, &the_index)) {
|
||||
string_list_append(&only_match_skip_worktree,
|
||||
pathspec->items[i].original);
|
||||
} else {
|
||||
@ -313,9 +323,7 @@ static int edit_patch(int argc, const char **argv, const char *prefix)
|
||||
rev.diffopt.output_format = DIFF_FORMAT_PATCH;
|
||||
rev.diffopt.use_color = 0;
|
||||
rev.diffopt.flags.ignore_dirty_submodules = 1;
|
||||
out = open(file, O_CREAT | O_WRONLY | O_TRUNC, 0666);
|
||||
if (out < 0)
|
||||
die(_("Could not open '%s' for writing."), file);
|
||||
out = xopen(file, O_CREAT | O_WRONLY | O_TRUNC, 0666);
|
||||
rev.diffopt.file = xfdopen(out, "w");
|
||||
rev.diffopt.close_file = 1;
|
||||
if (run_diff_files(&rev, 0))
|
||||
@ -378,6 +386,7 @@ static struct option builtin_add_options[] = {
|
||||
OPT_BOOL( 0 , "refresh", &refresh_only, N_("don't add, only refresh the index")),
|
||||
OPT_BOOL( 0 , "ignore-errors", &ignore_add_errors, N_("just skip files which cannot be added because of errors")),
|
||||
OPT_BOOL( 0 , "ignore-missing", &ignore_missing, N_("check if - even missing - files are ignored in dry run")),
|
||||
OPT_BOOL(0, "sparse", &include_sparse, N_("allow updating entries outside of the sparse-checkout cone")),
|
||||
OPT_STRING(0, "chmod", &chmod_arg, "(+|-)x",
|
||||
N_("override the executable bit of the listed files")),
|
||||
OPT_HIDDEN_BOOL(0, "warn-embedded-repo", &warn_on_embedded_repo,
|
||||
@ -419,6 +428,7 @@ static const char embedded_advice[] = N_(
|
||||
static void check_embedded_repo(const char *path)
|
||||
{
|
||||
struct strbuf name = STRBUF_INIT;
|
||||
static int adviced_on_embedded_repo = 0;
|
||||
|
||||
if (!warn_on_embedded_repo)
|
||||
return;
|
||||
@ -430,10 +440,10 @@ static void check_embedded_repo(const char *path)
|
||||
strbuf_strip_suffix(&name, "/");
|
||||
|
||||
warning(_("adding embedded git repository: %s"), name.buf);
|
||||
if (advice_add_embedded_repo) {
|
||||
if (!adviced_on_embedded_repo &&
|
||||
advice_enabled(ADVICE_ADD_EMBEDDED_REPO)) {
|
||||
advise(embedded_advice, name.buf, name.buf);
|
||||
/* there may be multiple entries; advise only once */
|
||||
advice_add_embedded_repo = 0;
|
||||
adviced_on_embedded_repo = 1;
|
||||
}
|
||||
|
||||
strbuf_release(&name);
|
||||
@ -442,12 +452,13 @@ static void check_embedded_repo(const char *path)
|
||||
static int add_files(struct dir_struct *dir, int flags)
|
||||
{
|
||||
int i, exit_status = 0;
|
||||
struct string_list matched_sparse_paths = STRING_LIST_INIT_NODUP;
|
||||
|
||||
if (dir->ignored_nr) {
|
||||
fprintf(stderr, _(ignore_error));
|
||||
for (i = 0; i < dir->ignored_nr; i++)
|
||||
fprintf(stderr, "%s\n", dir->ignored[i]->name);
|
||||
if (advice_add_ignored_file)
|
||||
if (advice_enabled(ADVICE_ADD_IGNORED_FILE))
|
||||
advise(_("Use -f if you really want to add them.\n"
|
||||
"Turn this message off by running\n"
|
||||
"\"git config advice.addIgnoredFile false\""));
|
||||
@ -455,6 +466,12 @@ static int add_files(struct dir_struct *dir, int flags)
|
||||
}
|
||||
|
||||
for (i = 0; i < dir->nr; i++) {
|
||||
if (!include_sparse &&
|
||||
!path_in_sparse_checkout(dir->entries[i]->name, &the_index)) {
|
||||
string_list_append(&matched_sparse_paths,
|
||||
dir->entries[i]->name);
|
||||
continue;
|
||||
}
|
||||
if (add_file_to_index(&the_index, dir->entries[i]->name, flags)) {
|
||||
if (!ignore_add_errors)
|
||||
die(_("adding files failed"));
|
||||
@ -463,6 +480,14 @@ static int add_files(struct dir_struct *dir, int flags)
|
||||
check_embedded_repo(dir->entries[i]->name);
|
||||
}
|
||||
}
|
||||
|
||||
if (matched_sparse_paths.nr) {
|
||||
advise_on_updating_sparse_paths(&matched_sparse_paths);
|
||||
exit_status = 1;
|
||||
}
|
||||
|
||||
string_list_clear(&matched_sparse_paths, 0);
|
||||
|
||||
return exit_status;
|
||||
}
|
||||
|
||||
@ -528,6 +553,9 @@ int cmd_add(int argc, const char **argv, const char *prefix)
|
||||
add_new_files = !take_worktree_changes && !refresh_only && !add_renormalize;
|
||||
require_pathspec = !(take_worktree_changes || (0 < addremove_explicit));
|
||||
|
||||
prepare_repo_settings(the_repository);
|
||||
the_repository->settings.command_requires_full_index = 0;
|
||||
|
||||
hold_locked_index(&lock_file, LOCK_DIE_ON_ERROR);
|
||||
|
||||
/*
|
||||
@ -553,7 +581,7 @@ int cmd_add(int argc, const char **argv, const char *prefix)
|
||||
|
||||
if (require_pathspec && pathspec.nr == 0) {
|
||||
fprintf(stderr, _("Nothing specified, nothing added.\n"));
|
||||
if (advice_add_empty_pathspec)
|
||||
if (advice_enabled(ADVICE_ADD_EMPTY_PATHSPEC))
|
||||
advise( _("Maybe you wanted to say 'git add .'?\n"
|
||||
"Turn this message off by running\n"
|
||||
"\"git config advice.addEmptyPathspec false\""));
|
||||
@ -624,7 +652,8 @@ int cmd_add(int argc, const char **argv, const char *prefix)
|
||||
if (seen[i])
|
||||
continue;
|
||||
|
||||
if (matches_skip_worktree(&pathspec, i, &skip_worktree_seen)) {
|
||||
if (!include_sparse &&
|
||||
matches_skip_worktree(&pathspec, i, &skip_worktree_seen)) {
|
||||
string_list_append(&only_match_skip_worktree,
|
||||
pathspec.items[i].original);
|
||||
continue;
|
||||
|
10
builtin/am.c
10
builtin/am.c
@ -11,6 +11,7 @@
|
||||
#include "parse-options.h"
|
||||
#include "dir.h"
|
||||
#include "run-command.h"
|
||||
#include "hook.h"
|
||||
#include "quote.h"
|
||||
#include "tempfile.h"
|
||||
#include "lockfile.h"
|
||||
@ -1820,7 +1821,7 @@ static void am_run(struct am_state *state, int resume)
|
||||
printf_ln(_("Patch failed at %s %.*s"), msgnum(state),
|
||||
linelen(state->msg), state->msg);
|
||||
|
||||
if (advice_amworkdir)
|
||||
if (advice_enabled(ADVICE_AM_WORK_DIR))
|
||||
advise(_("Use 'git am --show-current-patch=diff' to see the failed patch"));
|
||||
|
||||
die_user_resolve(state);
|
||||
@ -1848,7 +1849,6 @@ next:
|
||||
*/
|
||||
if (!state->rebasing) {
|
||||
am_destroy(state);
|
||||
close_object_store(the_repository->objects);
|
||||
run_auto_maintenance(state->quiet);
|
||||
}
|
||||
}
|
||||
@ -1918,7 +1918,8 @@ static int fast_forward_to(struct tree *head, struct tree *remote, int reset)
|
||||
opts.dst_index = &the_index;
|
||||
opts.update = 1;
|
||||
opts.merge = 1;
|
||||
opts.reset = reset;
|
||||
opts.reset = reset ? UNPACK_RESET_PROTECT_UNTRACKED : 0;
|
||||
opts.preserve_ignored = 0; /* FIXME: !overwrite_ignore */
|
||||
opts.fn = twoway_merge;
|
||||
init_tree_desc(&t[0], head->buffer, head->size);
|
||||
init_tree_desc(&t[1], remote->buffer, remote->size);
|
||||
@ -2106,7 +2107,8 @@ static void am_abort(struct am_state *state)
|
||||
if (!has_orig_head)
|
||||
oidcpy(&orig_head, the_hash_algo->empty_tree);
|
||||
|
||||
clean_index(&curr_head, &orig_head);
|
||||
if (clean_index(&curr_head, &orig_head))
|
||||
die(_("failed to clean index"));
|
||||
|
||||
if (has_orig_head)
|
||||
update_ref("am --abort", "HEAD", &orig_head,
|
||||
|
@ -12,9 +12,7 @@
|
||||
|
||||
static void create_output_file(const char *output_file)
|
||||
{
|
||||
int output_fd = open(output_file, O_CREAT | O_WRONLY | O_TRUNC, 0666);
|
||||
if (output_fd < 0)
|
||||
die_errno(_("could not create archive file '%s'"), output_file);
|
||||
int output_fd = xopen(output_file, O_CREAT | O_WRONLY | O_TRUNC, 0666);
|
||||
if (output_fd != 1) {
|
||||
if (dup2(output_fd, 1) < 0)
|
||||
die_errno(_("could not redirect output"));
|
||||
|
@ -18,10 +18,10 @@ static GIT_PATH_FUNC(git_path_bisect_log, "BISECT_LOG")
|
||||
static GIT_PATH_FUNC(git_path_head_name, "head-name")
|
||||
static GIT_PATH_FUNC(git_path_bisect_names, "BISECT_NAMES")
|
||||
static GIT_PATH_FUNC(git_path_bisect_first_parent, "BISECT_FIRST_PARENT")
|
||||
static GIT_PATH_FUNC(git_path_bisect_run, "BISECT_RUN")
|
||||
|
||||
static const char * const git_bisect_helper_usage[] = {
|
||||
N_("git bisect--helper --bisect-reset [<commit>]"),
|
||||
N_("git bisect--helper --bisect-next-check <good_term> <bad_term> [<term>]"),
|
||||
N_("git bisect--helper --bisect-terms [--term-good | --term-old | --term-bad | --term-new]"),
|
||||
N_("git bisect--helper --bisect-start [--term-{new,bad}=<term> --term-{old,good}=<term>]"
|
||||
" [--no-checkout] [--first-parent] [<bad> [<good>...]] [--] [<paths>...]"),
|
||||
@ -30,6 +30,8 @@ static const char * const git_bisect_helper_usage[] = {
|
||||
N_("git bisect--helper --bisect-state (good|old) [<rev>...]"),
|
||||
N_("git bisect--helper --bisect-replay <filename>"),
|
||||
N_("git bisect--helper --bisect-skip [(<rev>|<range>)...]"),
|
||||
N_("git bisect--helper --bisect-visualize"),
|
||||
N_("git bisect--helper --bisect-run <cmd>..."),
|
||||
NULL
|
||||
};
|
||||
|
||||
@ -143,6 +145,19 @@ static int append_to_file(const char *path, const char *format, ...)
|
||||
return res;
|
||||
}
|
||||
|
||||
static int print_file_to_stdout(const char *path)
|
||||
{
|
||||
int fd = open(path, O_RDONLY);
|
||||
int ret = 0;
|
||||
|
||||
if (fd < 0)
|
||||
return error_errno(_("cannot open file '%s' for reading"), path);
|
||||
if (copy_fd(fd, 1) < 0)
|
||||
ret = error_errno(_("failed to read '%s'"), path);
|
||||
close(fd);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int check_term_format(const char *term, const char *orig_term)
|
||||
{
|
||||
int res;
|
||||
@ -1036,6 +1051,125 @@ static enum bisect_error bisect_skip(struct bisect_terms *terms, const char **ar
|
||||
return res;
|
||||
}
|
||||
|
||||
static int bisect_visualize(struct bisect_terms *terms, const char **argv, int argc)
|
||||
{
|
||||
struct strvec args = STRVEC_INIT;
|
||||
int flags = RUN_COMMAND_NO_STDIN, res = 0;
|
||||
struct strbuf sb = STRBUF_INIT;
|
||||
|
||||
if (bisect_next_check(terms, NULL) != 0)
|
||||
return BISECT_FAILED;
|
||||
|
||||
if (!argc) {
|
||||
if ((getenv("DISPLAY") || getenv("SESSIONNAME") || getenv("MSYSTEM") ||
|
||||
getenv("SECURITYSESSIONID")) && exists_in_PATH("gitk")) {
|
||||
strvec_push(&args, "gitk");
|
||||
} else {
|
||||
strvec_push(&args, "log");
|
||||
flags |= RUN_GIT_CMD;
|
||||
}
|
||||
} else {
|
||||
if (argv[0][0] == '-') {
|
||||
strvec_push(&args, "log");
|
||||
flags |= RUN_GIT_CMD;
|
||||
} else if (strcmp(argv[0], "tig") && !starts_with(argv[0], "git"))
|
||||
flags |= RUN_GIT_CMD;
|
||||
|
||||
strvec_pushv(&args, argv);
|
||||
}
|
||||
|
||||
strvec_pushl(&args, "--bisect", "--", NULL);
|
||||
|
||||
strbuf_read_file(&sb, git_path_bisect_names(), 0);
|
||||
sq_dequote_to_strvec(sb.buf, &args);
|
||||
strbuf_release(&sb);
|
||||
|
||||
res = run_command_v_opt(args.v, flags);
|
||||
strvec_clear(&args);
|
||||
return res;
|
||||
}
|
||||
|
||||
static int bisect_run(struct bisect_terms *terms, const char **argv, int argc)
|
||||
{
|
||||
int res = BISECT_OK;
|
||||
struct strbuf command = STRBUF_INIT;
|
||||
struct strvec args = STRVEC_INIT;
|
||||
struct strvec run_args = STRVEC_INIT;
|
||||
const char *new_state;
|
||||
int temporary_stdout_fd, saved_stdout;
|
||||
|
||||
if (bisect_next_check(terms, NULL))
|
||||
return BISECT_FAILED;
|
||||
|
||||
if (argc)
|
||||
sq_quote_argv(&command, argv);
|
||||
else {
|
||||
error(_("bisect run failed: no command provided."));
|
||||
return BISECT_FAILED;
|
||||
}
|
||||
|
||||
strvec_push(&run_args, command.buf);
|
||||
|
||||
while (1) {
|
||||
strvec_clear(&args);
|
||||
|
||||
printf(_("running %s\n"), command.buf);
|
||||
res = run_command_v_opt(run_args.v, RUN_USING_SHELL);
|
||||
|
||||
if (res < 0 || 128 <= res) {
|
||||
error(_("bisect run failed: exit code %d from"
|
||||
" '%s' is < 0 or >= 128"), res, command.buf);
|
||||
strbuf_release(&command);
|
||||
return res;
|
||||
}
|
||||
|
||||
if (res == 125)
|
||||
new_state = "skip";
|
||||
else if (!res)
|
||||
new_state = terms->term_good;
|
||||
else
|
||||
new_state = terms->term_bad;
|
||||
|
||||
temporary_stdout_fd = open(git_path_bisect_run(), O_CREAT | O_WRONLY | O_TRUNC, 0666);
|
||||
|
||||
if (temporary_stdout_fd < 0)
|
||||
return error_errno(_("cannot open file '%s' for writing"), git_path_bisect_run());
|
||||
|
||||
fflush(stdout);
|
||||
saved_stdout = dup(1);
|
||||
dup2(temporary_stdout_fd, 1);
|
||||
|
||||
res = bisect_state(terms, &new_state, 1);
|
||||
|
||||
fflush(stdout);
|
||||
dup2(saved_stdout, 1);
|
||||
close(saved_stdout);
|
||||
close(temporary_stdout_fd);
|
||||
|
||||
print_file_to_stdout(git_path_bisect_run());
|
||||
|
||||
if (res == BISECT_ONLY_SKIPPED_LEFT)
|
||||
error(_("bisect run cannot continue any more"));
|
||||
else if (res == BISECT_INTERNAL_SUCCESS_MERGE_BASE) {
|
||||
printf(_("bisect run success"));
|
||||
res = BISECT_OK;
|
||||
} else if (res == BISECT_INTERNAL_SUCCESS_1ST_BAD_FOUND) {
|
||||
printf(_("bisect found first bad commit"));
|
||||
res = BISECT_OK;
|
||||
} else if (res) {
|
||||
error(_("bisect run failed: 'git bisect--helper --bisect-state"
|
||||
" %s' exited with error code %d"), args.v[0], res);
|
||||
} else {
|
||||
continue;
|
||||
}
|
||||
|
||||
strbuf_release(&command);
|
||||
strvec_clear(&args);
|
||||
strvec_clear(&run_args);
|
||||
return res;
|
||||
}
|
||||
}
|
||||
|
||||
int cmd_bisect__helper(int argc, const char **argv, const char *prefix)
|
||||
{
|
||||
enum {
|
||||
@ -1048,7 +1182,9 @@ int cmd_bisect__helper(int argc, const char **argv, const char *prefix)
|
||||
BISECT_STATE,
|
||||
BISECT_LOG,
|
||||
BISECT_REPLAY,
|
||||
BISECT_SKIP
|
||||
BISECT_SKIP,
|
||||
BISECT_VISUALIZE,
|
||||
BISECT_RUN,
|
||||
} cmdmode = 0;
|
||||
int res = 0, nolog = 0;
|
||||
struct option options[] = {
|
||||
@ -1070,6 +1206,10 @@ int cmd_bisect__helper(int argc, const char **argv, const char *prefix)
|
||||
N_("replay the bisection process from the given file"), BISECT_REPLAY),
|
||||
OPT_CMDMODE(0, "bisect-skip", &cmdmode,
|
||||
N_("skip some commits for checkout"), BISECT_SKIP),
|
||||
OPT_CMDMODE(0, "bisect-visualize", &cmdmode,
|
||||
N_("visualize the bisection"), BISECT_VISUALIZE),
|
||||
OPT_CMDMODE(0, "bisect-run", &cmdmode,
|
||||
N_("use <cmd>... to automatically bisect."), BISECT_RUN),
|
||||
OPT_BOOL(0, "no-log", &nolog,
|
||||
N_("no log for BISECT_WRITE")),
|
||||
OPT_END()
|
||||
@ -1089,12 +1229,6 @@ int cmd_bisect__helper(int argc, const char **argv, const char *prefix)
|
||||
return error(_("--bisect-reset requires either no argument or a commit"));
|
||||
res = bisect_reset(argc ? argv[0] : NULL);
|
||||
break;
|
||||
case BISECT_NEXT_CHECK:
|
||||
if (argc != 2 && argc != 3)
|
||||
return error(_("--bisect-next-check requires 2 or 3 arguments"));
|
||||
set_terms(&terms, argv[1], argv[0]);
|
||||
res = bisect_next_check(&terms, argc == 3 ? argv[2] : NULL);
|
||||
break;
|
||||
case BISECT_TERMS:
|
||||
if (argc > 1)
|
||||
return error(_("--bisect-terms requires 0 or 1 argument"));
|
||||
@ -1131,6 +1265,16 @@ int cmd_bisect__helper(int argc, const char **argv, const char *prefix)
|
||||
get_terms(&terms);
|
||||
res = bisect_skip(&terms, argv, argc);
|
||||
break;
|
||||
case BISECT_VISUALIZE:
|
||||
get_terms(&terms);
|
||||
res = bisect_visualize(&terms, argv, argc);
|
||||
break;
|
||||
case BISECT_RUN:
|
||||
if (!argc)
|
||||
return error(_("bisect run failed: no command provided."));
|
||||
get_terms(&terms);
|
||||
res = bisect_run(&terms, argv, argc);
|
||||
break;
|
||||
default:
|
||||
BUG("unknown subcommand %d", cmdmode);
|
||||
}
|
||||
|
@ -101,6 +101,16 @@ struct commit_info {
|
||||
struct strbuf summary;
|
||||
};
|
||||
|
||||
#define COMMIT_INFO_INIT { \
|
||||
.author = STRBUF_INIT, \
|
||||
.author_mail = STRBUF_INIT, \
|
||||
.author_tz = STRBUF_INIT, \
|
||||
.committer = STRBUF_INIT, \
|
||||
.committer_mail = STRBUF_INIT, \
|
||||
.committer_tz = STRBUF_INIT, \
|
||||
.summary = STRBUF_INIT, \
|
||||
}
|
||||
|
||||
/*
|
||||
* Parse author/committer line in the commit object buffer
|
||||
*/
|
||||
@ -160,18 +170,6 @@ static void get_ac_line(const char *inbuf, const char *what,
|
||||
strbuf_add(name, namebuf, namelen);
|
||||
}
|
||||
|
||||
static void commit_info_init(struct commit_info *ci)
|
||||
{
|
||||
|
||||
strbuf_init(&ci->author, 0);
|
||||
strbuf_init(&ci->author_mail, 0);
|
||||
strbuf_init(&ci->author_tz, 0);
|
||||
strbuf_init(&ci->committer, 0);
|
||||
strbuf_init(&ci->committer_mail, 0);
|
||||
strbuf_init(&ci->committer_tz, 0);
|
||||
strbuf_init(&ci->summary, 0);
|
||||
}
|
||||
|
||||
static void commit_info_destroy(struct commit_info *ci)
|
||||
{
|
||||
|
||||
@ -192,8 +190,6 @@ static void get_commit_info(struct commit *commit,
|
||||
const char *subject, *encoding;
|
||||
const char *message;
|
||||
|
||||
commit_info_init(ret);
|
||||
|
||||
encoding = get_log_output_encoding();
|
||||
message = logmsg_reencode(commit, NULL, encoding);
|
||||
get_ac_line(message, "\nauthor ",
|
||||
@ -246,7 +242,7 @@ static void write_filename_info(struct blame_origin *suspect)
|
||||
*/
|
||||
static int emit_one_suspect_detail(struct blame_origin *suspect, int repeat)
|
||||
{
|
||||
struct commit_info ci;
|
||||
struct commit_info ci = COMMIT_INFO_INIT;
|
||||
|
||||
if (!repeat && (suspect->commit->object.flags & METAINFO_SHOWN))
|
||||
return 0;
|
||||
@ -440,7 +436,7 @@ static void emit_other(struct blame_scoreboard *sb, struct blame_entry *ent, int
|
||||
int cnt;
|
||||
const char *cp;
|
||||
struct blame_origin *suspect = ent->suspect;
|
||||
struct commit_info ci;
|
||||
struct commit_info ci = COMMIT_INFO_INIT;
|
||||
char hex[GIT_MAX_HEXSZ + 1];
|
||||
int show_raw_time = !!(opt & OUTPUT_RAW_TIMESTAMP);
|
||||
const char *default_color = NULL, *color = NULL, *reset = NULL;
|
||||
@ -630,7 +626,7 @@ static void find_alignment(struct blame_scoreboard *sb, int *option)
|
||||
if (longest_file < num)
|
||||
longest_file = num;
|
||||
if (!(suspect->commit->object.flags & METAINFO_SHOWN)) {
|
||||
struct commit_info ci;
|
||||
struct commit_info ci = COMMIT_INFO_INIT;
|
||||
suspect->commit->object.flags |= METAINFO_SHOWN;
|
||||
get_commit_info(suspect->commit, &ci, 1);
|
||||
if (*option & OUTPUT_SHOW_EMAIL)
|
||||
@ -917,6 +913,9 @@ int cmd_blame(int argc, const char **argv, const char *prefix)
|
||||
PARSE_OPT_KEEP_DASHDASH | PARSE_OPT_KEEP_ARGV0);
|
||||
for (;;) {
|
||||
switch (parse_options_step(&ctx, options, blame_opt_usage)) {
|
||||
case PARSE_OPT_NON_OPTION:
|
||||
case PARSE_OPT_UNKNOWN:
|
||||
break;
|
||||
case PARSE_OPT_HELP:
|
||||
case PARSE_OPT_ERROR:
|
||||
exit(129);
|
||||
|
@ -168,7 +168,7 @@ static int check_branch_commit(const char *branchname, const char *refname,
|
||||
int kinds, int force)
|
||||
{
|
||||
struct commit *rev = lookup_commit_reference(the_repository, oid);
|
||||
if (!rev) {
|
||||
if (!force && !rev) {
|
||||
error(_("Couldn't look up commit object for '%s'"), refname);
|
||||
return -1;
|
||||
}
|
||||
@ -407,7 +407,8 @@ static char *build_format(struct ref_filter *filter, int maxwidth, const char *r
|
||||
return strbuf_detach(&fmt, NULL);
|
||||
}
|
||||
|
||||
static void print_ref_list(struct ref_filter *filter, struct ref_sorting *sorting, struct ref_format *format)
|
||||
static void print_ref_list(struct ref_filter *filter, struct ref_sorting *sorting,
|
||||
struct ref_format *format, struct string_list *output)
|
||||
{
|
||||
int i;
|
||||
struct ref_array array;
|
||||
@ -427,7 +428,7 @@ static void print_ref_list(struct ref_filter *filter, struct ref_sorting *sortin
|
||||
|
||||
memset(&array, 0, sizeof(array));
|
||||
|
||||
filter_refs(&array, filter, filter->kind | FILTER_REFS_INCLUDE_BROKEN);
|
||||
filter_refs(&array, filter, filter->kind);
|
||||
|
||||
if (filter->verbose)
|
||||
maxwidth = calc_maxwidth(&array, strlen(remote_prefix));
|
||||
@ -449,7 +450,7 @@ static void print_ref_list(struct ref_filter *filter, struct ref_sorting *sortin
|
||||
if (column_active(colopts)) {
|
||||
assert(!filter->verbose && "--column and --verbose are incompatible");
|
||||
/* format to a string_list to let print_columns() do its job */
|
||||
string_list_append(&output, out.buf);
|
||||
string_list_append(output, out.buf);
|
||||
} else {
|
||||
fwrite(out.buf, 1, out.len, stdout);
|
||||
putchar('\n');
|
||||
@ -753,9 +754,10 @@ int cmd_branch(int argc, const char **argv, const char *prefix)
|
||||
ref_sorting_set_sort_flags_all(sorting, REF_SORTING_ICASE, icase);
|
||||
ref_sorting_set_sort_flags_all(
|
||||
sorting, REF_SORTING_DETACHED_HEAD_FIRST, 1);
|
||||
print_ref_list(&filter, sorting, &format);
|
||||
print_ref_list(&filter, sorting, &format, &output);
|
||||
print_columns(&output, colopts, NULL);
|
||||
string_list_clear(&output, 0);
|
||||
ref_sorting_release(sorting);
|
||||
return 0;
|
||||
} else if (edit_description) {
|
||||
const char *branch_name;
|
||||
|
@ -3,7 +3,8 @@
|
||||
#include "strbuf.h"
|
||||
#include "help.h"
|
||||
#include "compat/compiler.h"
|
||||
#include "run-command.h"
|
||||
#include "hook.h"
|
||||
#include "hook-list.h"
|
||||
|
||||
|
||||
static void get_system_info(struct strbuf *sys_info)
|
||||
@ -41,39 +42,7 @@ static void get_system_info(struct strbuf *sys_info)
|
||||
|
||||
static void get_populated_hooks(struct strbuf *hook_info, int nongit)
|
||||
{
|
||||
/*
|
||||
* NEEDSWORK: Doesn't look like there is a list of all possible hooks;
|
||||
* so below is a transcription of `git help hooks`. Later, this should
|
||||
* be replaced with some programmatically generated list (generated from
|
||||
* doc or else taken from some library which tells us about all the
|
||||
* hooks)
|
||||
*/
|
||||
static const char *hook[] = {
|
||||
"applypatch-msg",
|
||||
"pre-applypatch",
|
||||
"post-applypatch",
|
||||
"pre-commit",
|
||||
"pre-merge-commit",
|
||||
"prepare-commit-msg",
|
||||
"commit-msg",
|
||||
"post-commit",
|
||||
"pre-rebase",
|
||||
"post-checkout",
|
||||
"post-merge",
|
||||
"pre-push",
|
||||
"pre-receive",
|
||||
"update",
|
||||
"post-receive",
|
||||
"post-update",
|
||||
"push-to-checkout",
|
||||
"pre-auto-gc",
|
||||
"post-rewrite",
|
||||
"sendemail-validate",
|
||||
"fsmonitor-watchman",
|
||||
"p4-pre-submit",
|
||||
"post-index-change",
|
||||
};
|
||||
int i;
|
||||
const char **p;
|
||||
|
||||
if (nongit) {
|
||||
strbuf_addstr(hook_info,
|
||||
@ -81,9 +50,12 @@ static void get_populated_hooks(struct strbuf *hook_info, int nongit)
|
||||
return;
|
||||
}
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(hook); i++)
|
||||
if (find_hook(hook[i]))
|
||||
strbuf_addf(hook_info, "%s\n", hook[i]);
|
||||
for (p = hook_name_list; *p; p++) {
|
||||
const char *hook = *p;
|
||||
|
||||
if (hook_exists(hook))
|
||||
strbuf_addf(hook_info, "%s\n", hook);
|
||||
}
|
||||
}
|
||||
|
||||
static const char * const bugreport_usage[] = {
|
||||
@ -171,10 +143,7 @@ int cmd_bugreport(int argc, const char **argv, const char *prefix)
|
||||
get_populated_hooks(&buffer, !startup_info->have_repository);
|
||||
|
||||
/* fopen doesn't offer us an O_EXCL alternative, except with glibc. */
|
||||
report = open(report_path.buf, O_CREAT | O_EXCL | O_WRONLY, 0666);
|
||||
|
||||
if (report < 0)
|
||||
die(_("couldn't create a new file at '%s'"), report_path.buf);
|
||||
report = xopen(report_path.buf, O_CREAT | O_EXCL | O_WRONLY, 0666);
|
||||
|
||||
if (write_in_full(report, buffer.buf, buffer.len) < 0)
|
||||
die_errno(_("unable to write to %s"), report_path.buf);
|
||||
|
@ -39,8 +39,6 @@ static const char * const builtin_bundle_unbundle_usage[] = {
|
||||
NULL
|
||||
};
|
||||
|
||||
static int verbose;
|
||||
|
||||
static int parse_options_cmd_bundle(int argc,
|
||||
const char **argv,
|
||||
const char* prefix,
|
||||
@ -162,10 +160,15 @@ static int cmd_bundle_unbundle(int argc, const char **argv, const char *prefix)
|
||||
struct bundle_header header = BUNDLE_HEADER_INIT;
|
||||
int bundle_fd = -1;
|
||||
int ret;
|
||||
int progress = isatty(2);
|
||||
|
||||
struct option options[] = {
|
||||
OPT_BOOL(0, "progress", &progress,
|
||||
N_("show progress meter")),
|
||||
OPT_END()
|
||||
};
|
||||
char *bundle_file;
|
||||
struct strvec extra_index_pack_args = STRVEC_INIT;
|
||||
|
||||
argc = parse_options_cmd_bundle(argc, argv, prefix,
|
||||
builtin_bundle_unbundle_usage, options, &bundle_file);
|
||||
@ -177,7 +180,11 @@ static int cmd_bundle_unbundle(int argc, const char **argv, const char *prefix)
|
||||
}
|
||||
if (!startup_info->have_repository)
|
||||
die(_("Need a repository to unbundle."));
|
||||
ret = !!unbundle(the_repository, &header, bundle_fd, 0) ||
|
||||
if (progress)
|
||||
strvec_pushl(&extra_index_pack_args, "-v", "--progress-title",
|
||||
_("Unbundling objects"), NULL);
|
||||
ret = !!unbundle(the_repository, &header, bundle_fd,
|
||||
&extra_index_pack_args) ||
|
||||
list_bundle_refs(&header, argc, argv);
|
||||
bundle_header_release(&header);
|
||||
cleanup:
|
||||
@ -188,7 +195,6 @@ cleanup:
|
||||
int cmd_bundle(int argc, const char **argv, const char *prefix)
|
||||
{
|
||||
struct option options[] = {
|
||||
OPT__VERBOSE(&verbose, N_("be verbose; must be placed before a subcommand")),
|
||||
OPT_END()
|
||||
};
|
||||
int result;
|
||||
|
@ -355,18 +355,34 @@ static void print_object_or_die(struct batch_options *opt, struct expand_data *d
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* If "pack" is non-NULL, then "offset" is the byte offset within the pack from
|
||||
* which the object may be accessed (though note that we may also rely on
|
||||
* data->oid, too). If "pack" is NULL, then offset is ignored.
|
||||
*/
|
||||
static void batch_object_write(const char *obj_name,
|
||||
struct strbuf *scratch,
|
||||
struct batch_options *opt,
|
||||
struct expand_data *data)
|
||||
struct expand_data *data,
|
||||
struct packed_git *pack,
|
||||
off_t offset)
|
||||
{
|
||||
if (!data->skip_object_info &&
|
||||
oid_object_info_extended(the_repository, &data->oid, &data->info,
|
||||
OBJECT_INFO_LOOKUP_REPLACE) < 0) {
|
||||
printf("%s missing\n",
|
||||
obj_name ? obj_name : oid_to_hex(&data->oid));
|
||||
fflush(stdout);
|
||||
return;
|
||||
if (!data->skip_object_info) {
|
||||
int ret;
|
||||
|
||||
if (pack)
|
||||
ret = packed_object_info(the_repository, pack, offset,
|
||||
&data->info);
|
||||
else
|
||||
ret = oid_object_info_extended(the_repository,
|
||||
&data->oid, &data->info,
|
||||
OBJECT_INFO_LOOKUP_REPLACE);
|
||||
if (ret < 0) {
|
||||
printf("%s missing\n",
|
||||
obj_name ? obj_name : oid_to_hex(&data->oid));
|
||||
fflush(stdout);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
strbuf_reset(scratch);
|
||||
@ -428,7 +444,7 @@ static void batch_one_object(const char *obj_name,
|
||||
return;
|
||||
}
|
||||
|
||||
batch_object_write(obj_name, scratch, opt, data);
|
||||
batch_object_write(obj_name, scratch, opt, data, NULL, 0);
|
||||
}
|
||||
|
||||
struct object_cb_data {
|
||||
@ -442,7 +458,8 @@ static int batch_object_cb(const struct object_id *oid, void *vdata)
|
||||
{
|
||||
struct object_cb_data *data = vdata;
|
||||
oidcpy(&data->expand->oid, oid);
|
||||
batch_object_write(NULL, data->scratch, data->opt, data->expand);
|
||||
batch_object_write(NULL, data->scratch, data->opt, data->expand,
|
||||
NULL, 0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -463,21 +480,26 @@ static int collect_packed_object(const struct object_id *oid,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int batch_unordered_object(const struct object_id *oid, void *vdata)
|
||||
static int batch_unordered_object(const struct object_id *oid,
|
||||
struct packed_git *pack, off_t offset,
|
||||
void *vdata)
|
||||
{
|
||||
struct object_cb_data *data = vdata;
|
||||
|
||||
if (oidset_insert(data->seen, oid))
|
||||
return 0;
|
||||
|
||||
return batch_object_cb(oid, data);
|
||||
oidcpy(&data->expand->oid, oid);
|
||||
batch_object_write(NULL, data->scratch, data->opt, data->expand,
|
||||
pack, offset);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int batch_unordered_loose(const struct object_id *oid,
|
||||
const char *path,
|
||||
void *data)
|
||||
{
|
||||
return batch_unordered_object(oid, data);
|
||||
return batch_unordered_object(oid, NULL, 0, data);
|
||||
}
|
||||
|
||||
static int batch_unordered_packed(const struct object_id *oid,
|
||||
@ -485,7 +507,9 @@ static int batch_unordered_packed(const struct object_id *oid,
|
||||
uint32_t pos,
|
||||
void *data)
|
||||
{
|
||||
return batch_unordered_object(oid, data);
|
||||
return batch_unordered_object(oid, pack,
|
||||
nth_packed_object_offset(pack, pos),
|
||||
data);
|
||||
}
|
||||
|
||||
static int batch_objects(struct batch_options *opt)
|
||||
@ -529,6 +553,8 @@ static int batch_objects(struct batch_options *opt)
|
||||
if (has_promisor_remote())
|
||||
warning("This repository uses promisor remotes. Some objects may not be loaded.");
|
||||
|
||||
read_replace_refs = 0;
|
||||
|
||||
cb.opt = opt;
|
||||
cb.expand = &data;
|
||||
cb.scratch = &output;
|
||||
|
@ -82,8 +82,8 @@ static void worker_loop(struct checkout *state)
|
||||
size_t i, nr = 0, alloc = 0;
|
||||
|
||||
while (1) {
|
||||
int len = packet_read(0, NULL, NULL, packet_buffer,
|
||||
sizeof(packet_buffer), 0);
|
||||
int len = packet_read(0, packet_buffer, sizeof(packet_buffer),
|
||||
0);
|
||||
|
||||
if (len < 0)
|
||||
BUG("packet_read() returned negative value");
|
||||
|
@ -404,7 +404,7 @@ static int checkout_worktree(const struct checkout_opts *opts,
|
||||
mem_pool_discard(&ce_mem_pool, should_validate_cache_entries());
|
||||
remove_marked_cache_entries(&the_index, 1);
|
||||
remove_scheduled_dirs();
|
||||
errs |= finish_delayed_checkout(&state, &nr_checkouts);
|
||||
errs |= finish_delayed_checkout(&state, &nr_checkouts, opts->show_progress);
|
||||
|
||||
if (opts->count_checkout_paths) {
|
||||
if (nr_unmerged)
|
||||
@ -646,7 +646,9 @@ static int reset_tree(struct tree *tree, const struct checkout_opts *o,
|
||||
opts.head_idx = -1;
|
||||
opts.update = worktree;
|
||||
opts.skip_unmerged = !worktree;
|
||||
opts.reset = 1;
|
||||
opts.reset = o->force ? UNPACK_RESET_OVERWRITE_UNTRACKED :
|
||||
UNPACK_RESET_PROTECT_UNTRACKED;
|
||||
opts.preserve_ignored = (!o->force && !o->overwrite_ignore);
|
||||
opts.merge = 1;
|
||||
opts.fn = oneway_merge;
|
||||
opts.verbose_update = o->show_progress;
|
||||
@ -746,11 +748,7 @@ static int merge_working_tree(const struct checkout_opts *opts,
|
||||
new_branch_info->commit ?
|
||||
&new_branch_info->commit->object.oid :
|
||||
&new_branch_info->oid, NULL);
|
||||
if (opts->overwrite_ignore) {
|
||||
topts.dir = xcalloc(1, sizeof(*topts.dir));
|
||||
topts.dir->flags |= DIR_SHOW_IGNORED;
|
||||
setup_standard_excludes(topts.dir);
|
||||
}
|
||||
topts.preserve_ignored = !opts->overwrite_ignore;
|
||||
tree = parse_tree_indirect(old_branch_info->commit ?
|
||||
&old_branch_info->commit->object.oid :
|
||||
the_hash_algo->empty_tree);
|
||||
@ -918,7 +916,7 @@ static void update_refs_for_switch(const struct checkout_opts *opts,
|
||||
REF_NO_DEREF, UPDATE_REFS_DIE_ON_ERR);
|
||||
if (!opts->quiet) {
|
||||
if (old_branch_info->path &&
|
||||
advice_detached_head && !opts->force_detach)
|
||||
advice_enabled(ADVICE_DETACHED_HEAD) && !opts->force_detach)
|
||||
detach_advice(new_branch_info->name);
|
||||
describe_detached_head(_("HEAD is now at"), new_branch_info->commit);
|
||||
}
|
||||
@ -1011,7 +1009,7 @@ static void suggest_reattach(struct commit *commit, struct rev_info *revs)
|
||||
sb.buf);
|
||||
strbuf_release(&sb);
|
||||
|
||||
if (advice_detached_head)
|
||||
if (advice_enabled(ADVICE_DETACHED_HEAD))
|
||||
fprintf(stderr,
|
||||
Q_(
|
||||
/* The singular version */
|
||||
@ -1182,7 +1180,7 @@ static const char *parse_remote_branch(const char *arg,
|
||||
}
|
||||
|
||||
if (!remote && num_matches > 1) {
|
||||
if (advice_checkout_ambiguous_remote_branch_name) {
|
||||
if (advice_enabled(ADVICE_CHECKOUT_AMBIGUOUS_REMOTE_BRANCH_NAME)) {
|
||||
advise(_("If you meant to check out a remote tracking branch on, e.g. 'origin',\n"
|
||||
"you can do so by fully qualifying the name with the --track option:\n"
|
||||
"\n"
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user