git-commit-vandalism/builtin
Elijah Newren 530ca19c02 fast-export: add --reference-excluded-parents option
git filter-branch has a nifty feature allowing you to rewrite, e.g. just
the last 8 commits of a linear history
  git filter-branch $OPTIONS HEAD~8..HEAD

If you try the same with git fast-export, you instead get a history of
only 8 commits, with HEAD~7 being rewritten into a root commit.  There
are two alternatives:

  1) Don't use the negative revision specification, and when you're
     filtering the output to make modifications to the last 8 commits,
     just be careful to not modify any earlier commits somehow.

  2) First run 'git fast-export --export-marks=somefile HEAD~8', then
     run 'git fast-export --import-marks=somefile HEAD~8..HEAD'.

Both are more error prone than I'd like (the first for obvious reasons;
with the second option I have sometimes accidentally included too many
revisions in the first command and then found that the corresponding
extra revisions were not exported by the second command and thus were
not modified as I expected).  Also, both are poor from a performance
perspective.

Add a new --reference-excluded-parents option which will cause
fast-export to refer to commits outside the specified rev-list-args
range by their sha1sum.  Such a stream will only be useful in a
repository which already contains the necessary commits (much like the
restriction imposed when using --no-data).

Note from Peff:
  I think we might be able to do a little more optimization here. If
  we're exporting HEAD^..HEAD and there's an object in HEAD^ which is
  unchanged in HEAD, I think we'd still print it (because it would not
  be marked SHOWN), but we could omit it (by walking the tree of the
  boundary commits and marking them shown).  I don't think it's a
  blocker for what you're doing here, but just a possible future
  optimization.

Signed-off-by: Elijah Newren <newren@gmail.com>
Acked-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2018-11-17 18:43:52 +09:00
..
add.c add: speed up cmd_add() by utilizing read_cache_preload() 2018-11-03 00:43:04 +09:00
am.c Merge branch 'pw/am-rebase-read-author-script' 2018-11-13 22:37:23 +09:00
annotate.c
apply.c apply.c: make init_apply_state() take a struct repository 2018-08-13 14:14:44 -07:00
archive.c archive: initialize archivers earlier 2018-10-26 10:17:59 +09:00
bisect--helper.c
blame.c revision.c: remove implicit dependency on the_index 2018-09-21 09:51:19 -07:00
branch.c Merge branch 'tq/branch-style-fix' 2018-10-30 15:43:43 +09:00
bundle.c
cat-file.c Merge branch 'jk/detect-truncated-zlib-input' 2018-11-13 22:37:17 +09:00
check-attr.c Make git_check_attr() a void function 2018-09-12 15:15:34 -07:00
check-ignore.c
check-mailmap.c
check-ref-format.c
checkout-index.c Merge branch 'rs/opt-updates' 2018-08-27 14:33:43 -07:00
checkout.c Merge branch 'nd/the-index' 2018-10-19 13:34:02 +09:00
clean.c dir.c: remove an implicit dependency on the_index in pathspec code 2018-08-13 14:14:42 -07:00
clone.c Merge branch 'nd/clone-case-smashing-warning' 2018-09-17 13:53:47 -07:00
column.c
commit-graph.c Merge branch 'ds/commit-graph-leakfix' 2018-10-19 13:34:07 +09:00
commit-tree.c
commit.c refresh_index: remove unnecessary calls to preload_index() 2018-11-06 12:49:59 +09:00
config.c worktree: add per-worktree config files 2018-10-22 13:17:04 +09:00
count-objects.c treewide: use get_all_packs 2018-08-20 15:31:40 -07:00
credential.c
describe.c refresh_index: remove unnecessary calls to preload_index() 2018-11-06 12:49:59 +09:00
diff-files.c revision.c: remove implicit dependency on the_index 2018-09-21 09:51:19 -07:00
diff-index.c revision.c: remove implicit dependency on the_index 2018-09-21 09:51:19 -07:00
diff-tree.c revision.c: remove implicit dependency on the_index 2018-09-21 09:51:19 -07:00
diff.c Merge branch 'nd/the-index' 2018-10-19 13:34:02 +09:00
difftool.c Merge branch 'nd/the-index' 2018-10-19 13:34:02 +09:00
fast-export.c fast-export: add --reference-excluded-parents option 2018-11-17 18:43:52 +09:00
fetch-pack.c builtin/fetch-pack: remove constants with parse_oid_hex 2018-10-15 12:53:15 +09:00
fetch.c Merge branch 'jc/war-on-string-list' 2018-11-13 22:37:23 +09:00
fmt-merge-msg.c Merge branch 'nd/the-index' 2018-10-19 13:34:02 +09:00
for-each-ref.c provide --color option for all ref-filter users 2017-10-04 11:35:29 +09:00
fsck.c Merge branch 'nd/per-worktree-ref-iteration' 2018-11-13 22:37:26 +09:00
gc.c Merge branch 'jn/gc-auto' 2018-10-16 16:16:02 +09:00
get-tar-commit-id.c
grep.c Merge branch 'ao/submodule-wo-gitmodules-checked-out' 2018-11-13 22:37:22 +09:00
hash-object.c sha1-file.c: remove implicit dependency on the_index 2018-09-21 09:48:11 -07:00
help.c Merge branch 'rv/alias-help' 2018-10-26 14:22:13 +09:00
index-pack.c convert "hashcmp() != 0" to "!hasheq()" 2018-08-29 11:32:49 -07:00
init-db.c
interpret-trailers.c interpret-trailers: allow suppressing "---" divider 2018-08-23 10:08:51 -07:00
log.c Merge branch 'nd/the-index' 2018-10-19 13:34:02 +09:00
ls-files.c ls-files: correct index argument to get_convert_attr_ascii() 2018-08-13 14:14:43 -07:00
ls-remote.c Merge branch 'jk/proto-v2-ref-prefix-fix' 2018-11-13 22:37:17 +09:00
ls-tree.c
mailinfo.c
mailsplit.c
merge-base.c Merge branch 'pk/rebase-in-c-4-opts' 2018-11-02 11:04:55 +09:00
merge-file.c
merge-index.c
merge-ours.c
merge-recursive.c
merge-tree.c Merge branch 'jk/xdiff-interface' 2018-11-13 22:37:27 +09:00
merge.c Merge branch 'nd/the-index' 2018-10-19 13:34:02 +09:00
mktag.c
mktree.c builtin/mktree: remove hard-coded constant 2018-10-15 12:53:15 +09:00
multi-pack-index.c multi-pack-index: add 'verify' verb 2018-09-17 13:49:38 -07:00
mv.c
name-rev.c
notes.c
pack-objects.c Merge branch 'md/exclude-promisor-objects-fix' 2018-11-06 15:50:21 +09:00
pack-redundant.c treewide: use get_all_packs 2018-08-20 15:31:40 -07:00
pack-refs.c
patch-id.c
prune-packed.c for_each_*_object: move declarations to object-store.h 2018-08-14 12:29:57 -07:00
prune.c Merge branch 'md/exclude-promisor-objects-fix' 2018-11-06 15:50:21 +09:00
pull.c submodule.c: remove some of the_repository references 2018-10-22 11:55:33 +09:00
push.c Merge branch 'rs/opt-updates' 2018-08-27 14:33:43 -07:00
range-diff.c Merge branch 'nd/the-index' 2018-10-19 13:34:02 +09:00
read-tree.c Merge branch 'rs/parse-opt-lithelp' 2018-08-17 13:09:56 -07:00
rebase--interactive.c rebase -i: move rebase--helper modes to rebase--interactive 2018-10-09 10:44:10 +09:00
rebase.c rebase: apply cocci patch 2018-11-02 11:04:59 +09:00
receive-pack.c Merge branch 'jc/receive-deny-current-branch-fix' 2018-10-30 15:43:46 +09:00
reflog.c Merge branch 'nd/per-worktree-ref-iteration' 2018-11-13 22:37:26 +09:00
remote-ext.c
remote-fd.c
remote.c Merge branch 'ms/remote-error-message-update' 2018-09-24 10:30:52 -07:00
repack.c Merge branch 'ds/test-multi-pack-index' 2018-11-13 22:37:19 +09:00
replace.c Merge branch 'nd/the-index' 2018-10-19 13:34:02 +09:00
rerere.c Merge branch 'jk/xdiff-interface' 2018-11-13 22:37:27 +09:00
reset.c reset: warn when refresh_index() takes more than 2 seconds 2018-10-24 11:57:08 +09:00
rev-list.c Merge branch 'md/exclude-promisor-objects-fix' 2018-11-06 15:50:21 +09:00
rev-parse.c Merge branch 'ag/rev-parse-all-exclude-fix' 2018-11-13 22:37:23 +09:00
revert.c revision.c: remove implicit dependency on the_index 2018-09-21 09:51:19 -07:00
rm.c convert "oidcmp() != 0" to "!oideq()" 2018-08-29 11:32:49 -07:00
send-pack.c Merge branch 'rs/opt-updates' 2018-08-27 14:33:43 -07:00
serve.c
shortlog.c revision.c: remove implicit dependency on the_index 2018-09-21 09:51:19 -07:00
show-branch.c convert "hashcmp() != 0" to "!hasheq()" 2018-08-29 11:32:49 -07:00
show-index.c
show-ref.c
stripspace.c
submodule--helper.c Merge branch 'ao/submodule-wo-gitmodules-checked-out' 2018-11-13 22:37:22 +09:00
symbolic-ref.c
tag.c convert "oidcmp() != 0" to "!oideq()" 2018-08-29 11:32:49 -07:00
unpack-file.c
unpack-objects.c convert "hashcmp() != 0" to "!hasheq()" 2018-08-29 11:32:49 -07:00
update-index.c refresh_index: remove unnecessary calls to preload_index() 2018-11-06 12:49:59 +09:00
update-ref.c update-ref: allow --no-deref with --stdin 2018-09-12 15:17:17 -07:00
update-server-info.c
upload-archive.c archive: initialize archivers earlier 2018-10-26 10:17:59 +09:00
upload-pack.c
var.c
verify-commit.c
verify-pack.c
verify-tag.c
worktree.c worktree: rename is_worktree_locked to worktree_lock_reason 2018-10-31 11:41:47 +09:00
write-tree.c Merge branch 'rs/parse-opt-lithelp' 2018-08-17 13:09:56 -07:00