Go to file
Derrick Stolee 0dd1324a73 packfile: delete .idx files before .pack files
When installing a packfile, we place the .pack file before the .idx
file. The intention is that Git scans for .idx files in the pack
directory and then loads the .pack files from that list.

However, when we delete packfiles, we do not do this in the reverse
order as we should. The unlink_pack_path() method deletes the .pack
followed by the .idx.

This creates a window where the process could be interrupted between
the .pack deletion and the .idx deletion, leaving the repository in a
state that looks strange, but isn't actually too problematic if we
assume the pack was safe to delete. The .idx without a .pack will cause
some overhead, but will not interrupt other Git processes.

This ordering was introduced into the 'git repack' builtin by
a1bbc6c017 (repack: rewrite the shell script in C, 2013-09-15), though
we must be careful to track history through the code move in 8434e85d5f
(repack: refactor pack deletion for future use, 2019-06-10) to see that.

This became more important after 73320e49ad (builtin/repack.c: only
collect fully-formed packs, 2023-06-07) changed how 'git repack' scanned
for packfiles for use in the cruft pack process. It previously looked
for .pack files, but that was problematic due to the order that packs
are installed: repacks between the creation of a .pack and the creation
of its .idx would result in hard failures.

There is an independent proposal about what to do in the case of a .idx
without a .pack during this 'git repack' scenario, but this change is
focused on deleting .pack files more safely.

Modify the order to delete the .idx before the .pack. The rest of the
modifiers on the .pack should still come after the .pack so we know all
of the presumed properties of the packfile as long as it exists in the
filesystem, in case we wish to reinstate it by re-indexing the .pack
file.

Signed-off-by: Derrick Stolee <derrickstolee@github.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2023-06-20 13:38:41 -07:00
.github Sync with 2.36.6 2023-04-17 21:16:04 +02:00
Documentation Git 2.38.5 2023-04-17 21:16:07 +02:00
block-sha1
builtin Sync with 2.32.7 2023-04-17 21:15:52 +02:00
ci Sync with 2.36.6 2023-04-17 21:16:04 +02:00
compat Sync with 2.34.8 2023-04-17 21:15:59 +02:00
contrib t/Makefile: remove 'test-results' on 'make clean' 2022-09-21 11:32:13 -07:00
ewah
git-gui
gitk-git
gitweb
mergetools
negotiator
perl
po l10n: zh_TW.po: Git 2.38.0, round 3 2022-10-01 19:10:41 +08:00
refs
reftable reftable: use a pointer for pq_entry param 2022-09-15 11:32:37 -07:00
sha1collisiondetection@855827c583
sha1dc
sha256
t Sync with 2.37.7 2023-04-17 21:16:06 +02:00
templates
trace2
xdiff
.cirrus.yml
.clang-format
.editorconfig
.gitattributes
.gitignore version: fix builtin linking & documentation 2022-09-19 17:28:25 -07:00
.gitmodules
.mailmap
.tsan-suppressions
CODE_OF_CONDUCT.md
COPYING
GIT-VERSION-GEN Git 2.38.5 2023-04-17 21:16:07 +02:00
INSTALL Sync with 2.31.8 2023-04-17 21:15:49 +02:00
LGPL-2.1
Makefile Sync with 2.36.6 2023-04-17 21:16:04 +02:00
README.md
RelNotes Git 2.38.5 2023-04-17 21:16:07 +02:00
SECURITY.md
abspath.c
aclocal.m4
add-interactive.c
add-interactive.h
add-patch.c Merge branch 'rs/add-p-worktree-mode-prompt-fix' 2022-09-15 16:09:46 -07:00
advice.c
advice.h
alias.c alias.c: reject too-long cmdline strings in split_cmdline() 2022-10-01 00:23:38 -04:00
alias.h
alloc.c
alloc.h
apply.c Sync with 2.36.6 2023-04-17 21:16:04 +02:00
apply.h
archive-tar.c
archive-zip.c
archive.c Merge branch 'rs/archive-dedup-printf' into maint-2.38 2022-10-27 15:24:14 -07:00
archive.h
attr.c Sync with maint-2.37 2023-01-19 13:48:26 -08:00
attr.h Merge branch 'maint-2.35' into maint-2.36 2022-12-13 21:19:11 +09:00
banned.h
base85.c
bisect.c
bisect.h
blame.c
blame.h
blob.c
blob.h
bloom.c
bloom.h
branch.c
branch.h
builtin.h
bulk-checkin.c
bulk-checkin.h
bundle-uri.c
bundle-uri.h
bundle.c
bundle.h
cache-tree.c
cache-tree.h
cache.h
cbtree.c
cbtree.h
chdir-notify.c
chdir-notify.h
check-builtins.sh
checkout.c
checkout.h
chunk-format.c
chunk-format.h
color.c
color.h
column.c utf8: fix truncated string lengths in `utf8_strnwidth()` 2022-12-09 14:26:21 +09:00
column.h
combine-diff.c
command-list.txt version: fix builtin linking & documentation 2022-09-19 17:28:25 -07:00
commit-graph.c Merge branch 'ml/commit-graph-expire-dir-leak-fix' 2022-09-21 14:23:14 -07:00
commit-graph.h
commit-reach.c
commit-reach.h
commit-slab-decl.h
commit-slab-impl.h
commit-slab.h
commit.c
commit.h
common-main.c
config.c Sync with 2.37.7 2023-04-17 21:16:06 +02:00
config.h
config.mak.dev config.mak.dev: disable suggest braces error on old clang versions 2022-10-10 11:15:31 -07:00
config.mak.in
config.mak.uname
configure.ac
connect.c
connect.h
connected.c
connected.h
convert.c
convert.h
copy.c
credential.c
credential.h
csum-file.c
csum-file.h
ctype.c
daemon.c
date.c
date.h
decorate.c
decorate.h
delta-islands.c
delta-islands.h
delta.h
detect-compiler
diagnose.c diagnose.c: refactor to safely use 'd_type' 2022-09-19 10:25:01 -07:00
diagnose.h
diff-delta.c
diff-lib.c
diff-merges.c diff-merges: cleanup set_diff_merges() 2022-09-16 09:21:43 -07:00
diff-merges.h
diff-no-index.c
diff.c Merge branch 'en/remerge-diff-fixes' 2022-09-15 16:09:46 -07:00
diff.h
diffcore-break.c
diffcore-delta.c
diffcore-order.c
diffcore-pickaxe.c
diffcore-rename.c
diffcore-rotate.c
diffcore.h
dir-iterator.c dir-iterator: prevent top-level symlinks without FOLLOW_SYMLINKS 2023-01-24 16:52:16 -08:00
dir-iterator.h dir-iterator: prevent top-level symlinks without FOLLOW_SYMLINKS 2023-01-24 16:52:16 -08:00
dir.c Sync with 2.34.8 2023-04-17 21:15:59 +02:00
dir.h
editor.c
entry.c
entry.h
environment.c
environment.h
exec-cmd.c
exec-cmd.h
fetch-negotiator.c
fetch-negotiator.h
fetch-pack.c
fetch-pack.h
fmt-merge-msg.c
fmt-merge-msg.h
fsck.c Merge branch 'maint-2.36' into maint-2.37 2022-12-13 21:20:35 +09:00
fsck.h Merge branch 'maint-2.36' into maint-2.37 2022-12-13 21:20:35 +09:00
fsmonitor--daemon.h
fsmonitor-ipc.c
fsmonitor-ipc.h
fsmonitor-settings.c
fsmonitor-settings.h
fsmonitor.c
fsmonitor.h
fuzz-commit-graph.c
fuzz-pack-headers.c
fuzz-pack-idx.c
generate-cmdlist.sh
generate-configlist.sh
generate-hooklist.sh
gettext.c Sync with 2.32.7 2023-04-17 21:15:52 +02:00
gettext.h Sync with 2.33.8 2023-04-17 21:15:56 +02:00
git-add--interactive.perl
git-archimport.perl
git-bisect.sh
git-compat-util.h Sync with Git 2.37.5 2022-12-13 21:23:36 +09:00
git-curl-compat.h http: support CURLOPT_PROTOCOLS_STR 2023-02-06 09:27:09 +01:00
git-cvsexportcommit.perl
git-cvsimport.perl
git-cvsserver.perl
git-difftool--helper.sh
git-filter-branch.sh
git-instaweb.sh
git-merge-octopus.sh
git-merge-one-file.sh
git-merge-resolve.sh
git-mergetool--lib.sh
git-mergetool.sh
git-p4.py
git-quiltimport.sh
git-request-pull.sh
git-send-email.perl
git-sh-i18n.sh
git-sh-setup.sh
git-submodule.sh
git-svn.perl
git-web--browse.sh
git.c
git.rc
gpg-interface.c Merge branch 'pw/ssh-sign-report-errors' into maint-2.38 2022-10-25 17:11:35 -07:00
gpg-interface.h
graph.c
graph.h
grep.c
grep.h
hash-lookup.c
hash-lookup.h
hash.h
hashmap.c
hashmap.h
help.c help: fix doubled words in explanation for developer interfaces 2022-09-16 09:20:11 -07:00
help.h
hex.c
hook.c
hook.h
http-backend.c
http-fetch.c
http-push.c Sync with 2.31.8 2023-04-17 21:15:49 +02:00
http-walker.c
http.c Sync with 2.34.8 2023-04-17 21:15:59 +02:00
http.h Sync with 2.30.9 2023-04-17 21:15:44 +02:00
ident.c
imap-send.c
iterator.h
json-writer.c
json-writer.h
khash.h
kwset.c
kwset.h
levenshtein.c
levenshtein.h
line-log.c
line-log.h
line-range.c
line-range.h
linear-assignment.c
linear-assignment.h
list-objects-filter-options.c list-objects-filter: initialize sub-filter structs 2022-09-22 12:43:04 -07:00
list-objects-filter-options.h
list-objects-filter.c
list-objects-filter.h
list-objects.c
list-objects.h
list.h
ll-merge.c
ll-merge.h
lockfile.c
lockfile.h
log-tree.c
log-tree.h
ls-refs.c
ls-refs.h
mailinfo.c mailinfo -b: fix an out of bounds access 2022-10-03 09:05:07 -07:00
mailinfo.h
mailmap.c
mailmap.h
match-trees.c
mem-pool.c
mem-pool.h
merge-blobs.c
merge-blobs.h
merge-ort-wrappers.c
merge-ort-wrappers.h
merge-ort.c merge-ort: return early when failing to write a blob 2022-09-28 08:49:35 -07:00
merge-ort.h
merge-recursive.c
merge-recursive.h
merge.c
mergesort.h
midx.c midx.c: avoid cruft packs with non-zero `repack --batch-size` 2022-09-21 10:21:47 -07:00
midx.h
name-hash.c
notes-cache.c
notes-cache.h
notes-merge.c
notes-merge.h
notes-utils.c
notes-utils.h
notes.c
notes.h
object-file.c
object-name.c
object-store.h
object.c Merge branch 'jk/fsck-on-diet' into maint-2.38 2022-10-25 17:11:33 -07:00
object.h
oid-array.c
oid-array.h
oidmap.c
oidmap.h
oidset.c
oidset.h
oidtree.c
oidtree.h
pack-bitmap-write.c
pack-bitmap.c Merge branch 'ds/bitmap-lookup-remove-tracing' 2022-09-26 21:46:51 -07:00
pack-bitmap.h
pack-check.c
pack-mtimes.c
pack-mtimes.h
pack-objects.c
pack-objects.h
pack-revindex.c
pack-revindex.h
pack-write.c
pack.h
packfile.c packfile: delete .idx files before .pack files 2023-06-20 13:38:41 -07:00
packfile.h
pager.c
parallel-checkout.c
parallel-checkout.h
parse-options-cb.c
parse-options.c
parse-options.h
patch-delta.c
patch-ids.c
patch-ids.h
path.c
path.h
pathspec.c
pathspec.h
pkt-line.c
pkt-line.h
preload-index.c
pretty.c Sync with Git 2.37.5 2022-12-13 21:23:36 +09:00
pretty.h
prio-queue.c
prio-queue.h
progress.c
progress.h
promisor-remote.c
promisor-remote.h
prompt.c
prompt.h
protocol-caps.c
protocol-caps.h
protocol.c
protocol.h
prune-packed.c
prune-packed.h
quote.c
quote.h
range-diff.c Sync with 2.31.8 2023-04-17 21:15:49 +02:00
range-diff.h
reachable.c
reachable.h
read-cache.c read-cache: avoid misaligned reads in index v4 2022-09-28 10:32:18 -07:00
rebase-interactive.c
rebase-interactive.h
rebase.c
rebase.h
ref-filter.c Merge branch 'rj/ref-filter-get-head-description-leakfix' into maint-2.38 2022-10-27 15:24:11 -07:00
ref-filter.h
reflog-walk.c
reflog-walk.h
reflog.c
reflog.h
refs.c
refs.h
refspec.c
refspec.h
remote-curl.c Sync with 2.32.7 2023-04-17 21:15:52 +02:00
remote.c
remote.h
replace-object.c
replace-object.h
repo-settings.c Merge branch 'jk/plug-list-object-filter-leaks' 2022-09-14 12:56:40 -07:00
repository.c
repository.h
rerere.c
rerere.h
reset.c
reset.h
resolve-undo.c
resolve-undo.h
revision.c CodingGuidelines: allow declaring variables in for loops 2022-10-10 13:41:11 -07:00
revision.h
run-command.c
run-command.h
scalar.c
send-pack.c
send-pack.h
sequencer.c rebase --update-refs: avoid unintended ref deletion 2022-12-09 19:31:45 +09:00
sequencer.h
serve.c
serve.h
server-info.c
setup.c
sh-i18n--envsubst.c
sha1dc_git.c
sha1dc_git.h
shallow.c
shallow.h
shared.mak
shell.c Sync with 2.32.4 2022-10-06 17:42:02 -04:00
shortlog.h
sideband.c
sideband.h
sigchain.c
sigchain.h
simple-ipc.h
sparse-index.c
sparse-index.h
split-index.c
split-index.h
stable-qsort.c
strbuf.c
strbuf.h
streaming.c
streaming.h
string-list.c
string-list.h
strmap.c
strmap.h
strvec.c
strvec.h
sub-process.c
sub-process.h
submodule-config.c
submodule-config.h
submodule.c
submodule.h
symlinks.c
tag.c
tag.h
tar.h
tempfile.c
tempfile.h
thread-utils.c
thread-utils.h
tmp-objdir.c tmp-objdir: skip clean up when handling a signal 2022-09-30 21:26:58 -07:00
tmp-objdir.h
trace.c
trace.h
trace2.c
trace2.h
trailer.c
trailer.h
transport-helper.c
transport-internal.h
transport.c Sync with 2.37.4 2022-10-06 20:00:04 -04:00
transport.h
tree-diff.c
tree-walk.c
tree-walk.h
tree.c
tree.h
unicode-width.h
unimplemented.sh
unix-socket.c
unix-socket.h
unix-stream-server.c
unix-stream-server.h
unpack-trees.c
unpack-trees.h
upload-pack.c Merge branch 'jk/list-objects-filter-cleanup' 2022-09-19 14:35:24 -07:00
upload-pack.h
url.c
url.h
urlmatch.c
urlmatch.h
usage.c
userdiff.c
userdiff.h
utf8.c Sync with Git 2.31.6 2022-12-13 21:09:40 +09:00
utf8.h Sync with Git 2.31.6 2022-12-13 21:09:40 +09:00
varint.c
varint.h
version.c
version.h
versioncmp.c
walker.c
walker.h
wildmatch.c
wildmatch.h
worktree.c
worktree.h
wrap-for-bin.sh
wrapper.c
write-or-die.c environ: GIT_FLUSH should be made a usual Boolean 2022-09-15 11:34:51 -07:00
ws.c
wt-status.c
wt-status.h
xdiff-interface.c
xdiff-interface.h
zlib.c

README.md

Build status

Git - fast, scalable, distributed revision control system

Git is a fast, scalable, distributed revision control system with an unusually rich command set that provides both high-level operations and full access to internals.

Git is an Open Source project covered by the GNU General Public License version 2 (some parts of it are under different licenses, compatible with the GPLv2). It was originally written by Linus Torvalds with help of a group of hackers around the net.

Please read the file INSTALL for installation instructions.

Many Git online resources are accessible from https://git-scm.com/ including full documentation and Git related tools.

See Documentation/gittutorial.txt to get started, then see Documentation/giteveryday.txt for a useful minimum set of commands, and Documentation/git-<commandname>.txt for documentation of each command. If git has been correctly installed, then the tutorial can also be read with man gittutorial or git help tutorial, and the documentation of each command with man git-<commandname> or git help <commandname>.

CVS users may also want to read Documentation/gitcvs-migration.txt (man gitcvs-migration or git help cvs-migration if git is installed).

The user discussion and development of Git take place on the Git mailing list -- everyone is welcome to post bug reports, feature requests, comments and patches to git@vger.kernel.org (read Documentation/SubmittingPatches for instructions on patch submission and Documentation/CodingGuidelines).

Those wishing to help with error message, usage and informational message string translations (localization l10) should see po/README.md (a po file is a Portable Object file that holds the translations).

To subscribe to the list, send an email with just "subscribe git" in the body to majordomo@vger.kernel.org (not the Git list). The mailing list archives are available at https://lore.kernel.org/git/, http://marc.info/?l=git and other archival sites.

Issues which are security relevant should be disclosed privately to the Git Security mailing list git-security@googlegroups.com.

The maintainer frequently sends the "What's cooking" reports that list the current status of various development topics to the mailing list. The discussion following them give a good reference for project status, development direction and remaining tasks.

The name "git" was given by Linus Torvalds when he wrote the very first version. He described the tool as "the stupid content tracker" and the name as (depending on your mood):

  • random three-letter combination that is pronounceable, and not actually used by any common UNIX command. The fact that it is a mispronunciation of "get" may or may not be relevant.
  • stupid. contemptible and despicable. simple. Take your pick from the dictionary of slang.
  • "global information tracker": you're in a good mood, and it actually works for you. Angels sing, and a light suddenly fills the room.
  • "goddamn idiotic truckload of sh*t": when it breaks