git-commit-vandalism/Documentation/technical
Jeff King 00a09d57eb introduce "extensions" form of core.repositoryformatversion
Normally we try to avoid bumps of the whole-repository
core.repositoryformatversion field. However, it is
unavoidable if we want to safely change certain aspects of
git in a backwards-incompatible way (e.g., modifying the set
of ref tips that we must traverse to generate a list of
unreachable, safe-to-prune objects).

If we were to bump the repository version for every such
change, then any implementation understanding version `X`
would also have to understand `X-1`, `X-2`, and so forth,
even though the incompatibilities may be in orthogonal parts
of the system, and there is otherwise no reason we cannot
implement one without the other (or more importantly, that
the user cannot choose to use one feature without the other,
weighing the tradeoff in compatibility only for that
particular feature).

This patch documents the existing repositoryformatversion
strategy and introduces a new format, "1", which lets a
repository specify that it must run with an arbitrary set of
extensions. This can be used, for example:

 - to inform git that the objects should not be pruned based
   only on the reachability of the ref tips (e.g, because it
   has "clone --shared" children)

 - that the refs are stored in a format besides the usual
   "refs" and "packed-refs" directories

Because we bump to format "1", and because format "1"
requires that a running git knows about any extensions
mentioned, we know that older versions of the code will not
do something dangerous when confronted with these new
formats.

For example, if the user chooses to use database storage for
refs, they may set the "extensions.refbackend" config to
"db". Older versions of git will not understand format "1"
and bail. Versions of git which understand "1" but do not
know about "refbackend", or which know about "refbackend"
but not about the "db" backend, will refuse to run. This is
annoying, of course, but much better than the alternative of
claiming that there are no refs in the repository, or
writing to a location that other implementations will not
read.

Note that we are only defining the rules for format 1 here.
We do not ever write format 1 ourselves; it is a tool that
is meant to be used by users and future extensions to
provide safety with older implementations.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2015-06-24 17:09:08 -07:00
..
.gitignore
api-allocation-growing.txt add macro REALLOC_ARRAY 2014-09-18 09:13:38 -07:00
api-argv-array.txt argv-array: drop "detach" code 2014-05-15 09:49:12 -07:00
api-builtin.txt docs: document RUN_SETUP_GENTLY and clarify RUN_SETUP 2014-04-30 11:28:21 -07:00
api-config.txt Merge branch 'ta/config-set-1' 2014-09-11 10:33:25 -07:00
api-credentials.txt credential: let helpers tell us to quit 2014-12-04 10:11:12 -08:00
api-decorate.txt
api-diff.txt diff_opt: track whether flags have been set explicitly 2013-05-10 10:24:17 -07:00
api-directory-listing.txt dir.c: git-status --ignored: don't scan the work tree twice 2013-04-15 12:36:42 -07:00
api-error-handling.txt api-error-handling doc: typofix 2015-03-28 09:24:55 -07:00
api-gitattributes.txt Documentation: fix misuses of "nor" 2014-03-31 15:16:22 -07:00
api-grep.txt
api-hashmap.txt hashmap: add string interning API 2014-07-07 13:56:38 -07:00
api-history-graph.txt graph.c: infinite loop in git whatchanged --graph -m 2012-09-25 11:07:15 -07:00
api-in-core-index.txt
api-index-skel.txt Documentation: avoid poor-man's small caps GIT 2013-02-01 13:53:25 -08:00
api-index.sh
api-lockfile.txt fdopen_lock_file(): access a lockfile using stdio 2014-10-01 14:08:10 -07:00
api-merge.txt docs: fix cross-directory linkgit references 2012-06-08 08:31:52 -07:00
api-object-access.txt
api-parse-options.txt parse-options: remove unused OPT_SET_PTR 2014-03-31 13:01:19 -07:00
api-quote.txt
api-ref-iteration.txt each_ref_fn: change to take an object_id parameter 2015-05-25 12:19:27 -07:00
api-remote.txt remote.c: drop "remote" pointer from "struct branch" 2015-05-21 10:48:10 -07:00
api-revision-walking.txt many small typofixes 2013-07-29 12:32:25 -07:00
api-run-command.txt Merge branch 'rs/child-process-init' 2014-10-31 11:49:49 -07:00
api-setup.txt guard against new pathspec magic in pathspec matching code 2013-07-15 10:56:07 -07:00
api-sha1-array.txt The name of the hash function is "SHA-1", not "SHA1" 2013-04-15 11:08:37 -07:00
api-sigchain.txt
api-string-list.txt sort_string_list(): rename to string_list_sort() 2014-11-25 10:11:34 -08:00
api-trace.txt api-trace.txt: add trace API documentation 2014-07-13 21:25:21 -07:00
api-tree-walking.txt
api-xdiff-interface.txt
bitmap-format.txt pack-bitmap: implement optional name_hash cache 2013-12-30 12:19:23 -08:00
http-protocol.txt upload-pack: optionally allow fetching reachable sha1 2015-05-22 18:25:36 -07:00
index-format.txt untracked cache: guard and disable on system changes 2015-03-12 13:45:18 -07:00
pack-format.txt The name of the hash function is "SHA-1", not "SHA1" 2013-04-15 11:08:37 -07:00
pack-heuristics.txt pack-heuristics.txt: mark up the file header properly 2014-01-13 11:18:34 -08:00
pack-protocol.txt Merge branch 'sb/pack-protocol-mention-smart-http' 2015-06-16 14:27:08 -07:00
protocol-capabilities.txt upload-pack: optionally allow fetching reachable sha1 2015-05-22 18:25:36 -07:00
protocol-common.txt Documentation: fix misuses of "nor" 2014-03-31 15:16:22 -07:00
racy-git.txt typofix: documentation 2013-07-22 16:06:48 -07:00
repository-version.txt introduce "extensions" form of core.repositoryformatversion 2015-06-24 17:09:08 -07:00
send-pack-pipeline.txt Change headline of technical/send-pack-pipeline.txt to not confuse its content with content from git-send-pack.txt 2012-10-16 16:09:09 -07:00
shallow.txt The name of the hash function is "SHA-1", not "SHA1" 2013-04-15 11:08:37 -07:00
trivial-merge.txt Documentation/technical: convert plain text files to asciidoc 2012-10-16 16:09:09 -07:00