Go to file
Patrick Steinhardt 2816b748e5 odb: handle changing a repository's commondir
The function `repo_set_gitdir()` is called in two situations:

  - To initialize the repository with its discovered location. As part
    of this we also set up the new object database.

  - To update the repository's discovered location in case the process
    changes its working directory so that we update relative paths. This
    means we also have to update any relative paths that are potentially
    used in the object database.

In the context of the object database we ideally wouldn't ever have to
worry about the second case: if all paths used by our object database
sources were absolute, then we wouldn't have to update them. But
unfortunately, the paths aren't only used to locate files owned by the
given source, but we also use them for reporting purposes. One such
example is `repo_get_object_directory()`, where we cannot just change
semantics to always return absolute paths, as that is likely to break
tooling out there.

One solution to this would be to have both a "display path" and an
"internal path". This would allow us to use internal paths for all
internal matters, but continue to use the potentially-relative display
paths so that we don't break compatibility. But converting the codebase
to honor this split is quite a messy endeavour, and it wouldn't even
help us with the goal to get rid of the need to update the display path
on chdir(3p).

Another solution would be to rework "setup.c" so that we never have to
update paths in the first place. In that case, we'd only initialize the
repository once we have figured out final locations for all directories.
This would be a significant simplification of that subsystem indeed, but
the current logic is so messy that it would take significant investments
to get there.

Meanwhile though, while object sources may still use relative paths, the
best thing we can do is to handle the reparenting of the object source
paths in the object database itself. This can be done by registering one
callback for each object database so that we get notified whenever the
current working directory changes, and we then perform the reparenting
ourselves.

Ideally, this wouldn't even happen on the object database level, but
instead handled by each object database source. But we don't yet have
proper pluggable object database sources, so this will need to be
handled at a later point in time.

The logic itself is rather simple:

  - We register the callback when creating the object database.

  - We unregister the callback when releasing it again.

  - We split up `set_git_dir_1()` so that it becomes possible to skip
    recreating the object database. This is required because the
    function is called both when the current working directory changes,
    but also when we set up the repository. Calling this function
    without skipping creation of the ODB will result in a bug in case
    it's already created.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2025-11-25 12:16:00 -08:00
.github Merge branch 'js/ci-github-actions-update' 2025-11-06 14:52:57 -08:00
Documentation Git 2.52 2025-11-17 07:35:33 -08:00
bin-wrappers
block-sha1
builtin builtin/index-pack: fix deferred fsck outside repos 2025-11-25 12:15:59 -08:00
ci Merge branch 'jc/ci-use-arm64-p4-on-macos' 2025-11-17 07:00:12 -08:00
compat
compiler-tricks
contrib Merge branch 'dk/meson-html-dir' 2025-11-12 08:17:31 -08:00
ewah
git-gui
gitk-git
gitweb
mergetools
negotiator
oss-fuzz
perl
po l10n: zh_CN: updated translation for 2.52 2025-11-16 17:27:10 +08:00
refs Merge branch 'pk/reflog-migrate-message-fix' 2025-11-06 14:52:57 -08:00
reftable Merge branch 'kn/reftable-consistency-checks' 2025-10-13 22:00:35 -07:00
sha1
sha1collisiondetection@855827c583
sha1dc
sha256
src rust: support for Windows 2025-10-15 08:10:17 -07:00
subprojects
t t/helper: stop setting up `the_repository` repeatedly 2025-11-25 12:16:00 -08:00
templates
trace2
xdiff Merge branch 'en/xdiff-cleanup' 2025-10-14 12:56:09 -07:00
.cirrus.yml
.clang-format
.editorconfig
.gitattributes
.gitignore
.gitlab-ci.yml Merge branch 'ps/gitlab-ci-disable-windows-monitoring' into maint-2.51 2025-10-26 19:48:19 -07:00
.gitmodules
.mailmap
.tsan-suppressions
CODE_OF_CONDUCT.md
COPYING
Cargo.toml ci: verify minimum supported Rust version 2025-10-15 08:10:17 -07:00
GIT-BUILD-OPTIONS.in
GIT-VERSION-FILE.in
GIT-VERSION-GEN Git 2.52 2025-11-17 07:35:33 -08:00
INSTALL
LGPL-2.1
Makefile Merge branch 'tb/incremental-midx-part-3.1' 2025-10-29 12:38:24 -07:00
README.md
RelNotes Git 2.51.2 2025-10-26 19:48:21 -07:00
SECURITY.md
abspath.c
abspath.h
aclocal.m4
add-interactive.c Merge branch 'sj/string-list' 2025-10-14 12:56:08 -07:00
add-interactive.h
add-patch.c add-patch: quit on EOF 2025-10-26 16:34:39 -07:00
advice.c
advice.h
alias.c
alias.h
alloc.c
alloc.h
apply.c
apply.h
archive-tar.c
archive-zip.c
archive.c
archive.h
attr.c
attr.h
banned.h
base85.c
base85.h
bisect.c
bisect.h
blame.c
blame.h
blob.c
blob.h
bloom.c
bloom.h
branch.c
branch.h
builtin.h
bundle-uri.c
bundle-uri.h
bundle.c
bundle.h
cache-tree.c
cache-tree.h
cbtree.c
cbtree.h
chdir-notify.c chdir-notify: add function to unregister listeners 2025-11-25 12:16:00 -08:00
chdir-notify.h chdir-notify: add function to unregister listeners 2025-11-25 12:16:00 -08:00
check-builtins.sh
checkout.c
checkout.h
chunk-format.c
chunk-format.h
color.c
color.h
column.c
column.h
combine-diff.c
command-list.txt
commit-graph.c Merge branch 'ps/commit-graph-per-object-source' 2025-10-13 22:00:35 -07:00
commit-graph.h
commit-reach.c commit-reach: avoid commit_list_insert_by_date() 2025-10-24 10:13:17 -07:00
commit-reach.h
commit-slab-decl.h
commit-slab-impl.h
commit-slab.h
commit.c
commit.h
common-exit.c
common-init.c
common-init.h
common-main.c
config.c Merge branch 'dk/parseopt-optional-filename-fixes' 2025-11-06 15:17:01 -08:00
config.h
config.mak.dev
config.mak.in
config.mak.uname
configure.ac
connect.c
connect.h
connected.c packfile: introduce macro to iterate through packs 2025-10-16 14:42:39 -07:00
connected.h
convert.c
convert.h
copy.c
copy.h
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.h
diff-delta.c
diff-lib.c
diff-merges.c
diff-merges.h
diff-no-index.c
diff.c diff: simplify run_external_diff() quiet logic 2025-10-24 10:38:58 -07:00
diff.h diff: replace diff_options.dry_run flag with NULL file 2025-10-24 10:15:22 -07:00
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.h
dir.c Merge branch 'jk/match-pathname-fix' 2025-11-03 06:49:55 -08:00
dir.h
editor.c
editor.h
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
for-each-ref.h
fsck.c builtin/index-pack: fix deferred fsck outside repos 2025-11-25 12:15:59 -08:00
fsck.h builtin/index-pack: fix deferred fsck outside repos 2025-11-25 12:15:59 -08:00
fsmonitor--daemon.h
fsmonitor-ipc.c
fsmonitor-ipc.h
fsmonitor-ll.h
fsmonitor-path-utils.h
fsmonitor-settings.c
fsmonitor-settings.h
fsmonitor.c
fsmonitor.h
generate-cmdlist.sh
generate-configlist.sh
generate-hooklist.sh
generate-perl.sh perl: also mark git-contacts executable 2025-11-06 09:57:47 -08:00
generate-python.sh
generate-script.sh
gettext.c
gettext.h
git-archimport.perl
git-compat-util.h
git-curl-compat.h
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-zlib.c
git-zlib.h
git.c
git.rc.in
gpg-interface.c Merge branch 'cc/fast-import-export-i18n-cleanup' 2025-11-06 15:17:01 -08:00
gpg-interface.h gpg-interface: use left shift to define GPG_VERIFY_* 2025-10-30 07:06:58 -07:00
graph.c
graph.h
grep.c
grep.h
hash-lookup.c
hash-lookup.h
hash.c
hash.h
hashmap.c
hashmap.h
help.c
help.h
hex-ll.c
hex-ll.h
hex.c
hex.h
hook.c
hook.h
http-backend.c path: move `enter_repo()` into "setup.c" 2025-11-19 17:41:03 -08:00
http-fetch.c
http-push.c http-push: stop setting up `the_repository` for each reference 2025-11-25 12:16:00 -08:00
http-walker.c
http.c packfile: introduce macro to iterate through packs 2025-10-16 14:42:39 -07:00
http.h
ident.c Merge branch 'ps/reflog-migrate-fixes' into maint-2.51 2025-10-15 10:29:28 -07:00
ident.h
imap-send.c Merge branch 'js/curl-off-t-fixes' into maint-2.51 2025-10-14 13:40:53 -07:00
iterator.h
json-writer.c
json-writer.h
khash.h
kwset.c
kwset.h
levenshtein.c
levenshtein.h
line-log.c Merge branch 'sg/line-log-boundary-fixes' into maint-2.51 2025-10-15 10:29:30 -07:00
line-log.h
line-range.c
line-range.h
linear-assignment.c
linear-assignment.h
list-objects-filter-options.c
list-objects-filter-options.h
list-objects-filter.c
list-objects-filter.h
list-objects.c
list-objects.h
list.h
lockfile.c
lockfile.h
log-tree.c Merge branch 'kh/format-patch-range-diff-notes' 2025-10-14 12:56:09 -07:00
log-tree.h
loose.c object-file: move loose object map into loose source 2025-11-03 12:18:47 -08:00
loose.h
ls-refs.c
ls-refs.h
mailinfo.c
mailinfo.h
mailmap.c
mailmap.h
match-trees.c
match-trees.h
mem-pool.c
mem-pool.h
merge-blobs.c
merge-blobs.h
merge-ll.c
merge-ll.h
merge-ort-wrappers.c
merge-ort-wrappers.h
merge-ort.c Merge branch 'en/ort-rename-fixes' into maint-2.51 2025-10-15 10:29:28 -07:00
merge-ort.h
merge.c
merge.h
mergesort.h
meson.build meson: make GIT_HTML_PATH configurable 2025-11-06 09:58:56 -08:00
meson_options.txt meson: make GIT_HTML_PATH configurable 2025-11-06 09:58:56 -08:00
midx-write.c odb: adopt logic to close object databases 2025-11-19 17:41:03 -08:00
midx.c
midx.h
name-hash.c
name-hash.h
notes-cache.c
notes-cache.h
notes-merge.c
notes-merge.h
notes-utils.c
notes-utils.h
notes.c
notes.h
object-file-convert.c
object-file-convert.h
object-file.c object-file: refactor writing objects via a stream 2025-11-03 12:18:48 -08:00
object-file.h object-file: refactor writing objects via a stream 2025-11-03 12:18:48 -08:00
object-name.c object-file: move loose object cache into loose source 2025-11-03 12:18:46 -08:00
object-name.h
object.c
object.h last-modified: implement faster algorithm 2025-11-03 07:25:41 -08:00
odb.c odb: handle changing a repository's commondir 2025-11-25 12:16:00 -08:00
odb.h odb: handle changing a repository's commondir 2025-11-25 12:16:00 -08:00
oid-array.c
oid-array.h
oidmap.c
oidmap.h
oidset.c oidset: introduce `oidset_equal()` 2025-11-25 12:15:59 -08:00
oidset.h oidset: introduce `oidset_equal()` 2025-11-25 12:15:59 -08:00
oidtree.c
oidtree.h
pack-bitmap-write.c
pack-bitmap.c packfile: introduce macro to iterate through packs 2025-10-16 14:42:39 -07:00
pack-bitmap.h
pack-check.c
pack-mtimes.c
pack-mtimes.h
pack-objects.c Merge branch 'ps/remove-packfile-store-get-packs' 2025-10-30 08:00:19 -07:00
pack-objects.h
pack-refs.c
pack-refs.h
pack-revindex.c
pack-revindex.h
pack-write.c
pack.h
packfile.c odb: adopt logic to close object databases 2025-11-19 17:41:03 -08:00
packfile.h odb: adopt logic to close object databases 2025-11-19 17:41:03 -08:00
pager.c
pager.h
parallel-checkout.c
parallel-checkout.h
parse-options-cb.c
parse-options.c Merge branch 'dk/parseopt-optional-filename-fixes' 2025-11-06 15:17:01 -08:00
parse-options.h
parse.c
parse.h
patch-delta.c
patch-ids.c
patch-ids.h
path-walk.c
path-walk.h
path.c path: move `enter_repo()` into "setup.c" 2025-11-19 17:41:03 -08:00
path.h path: move `enter_repo()` into "setup.c" 2025-11-19 17:41:03 -08:00
pathspec.c
pathspec.h
pkt-line.c
pkt-line.h
preload-index.c
preload-index.h
pretty.c
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
pseudo-merge.c
pseudo-merge.h
quote.c
quote.h
range-diff.c
range-diff.h
reachable.c
reachable.h
read-cache-ll.h
read-cache.c
read-cache.h
rebase-interactive.c
rebase-interactive.h
rebase.c
rebase.h
ref-filter.c ref-filter: export ref_kind_from_refname() 2025-10-21 14:40:37 -07:00
ref-filter.h Merge branch 'jt/repo-structure' 2025-11-04 07:48:07 -08:00
reflog-walk.c
reflog-walk.h
reflog.c
reflog.h
refs.c odb: move logic to disable ref updates into repo 2025-11-25 12:15:59 -08:00
refs.h Merge branch 'kn/refs-files-case-insensitive' into maint-2.51 2025-10-15 10:29:31 -07:00
refspec.c
refspec.h
remote-curl.c Merge branch 'js/curl-off-t-fixes' into maint-2.51 2025-10-14 13:40:53 -07:00
remote.c Merge branch 'dl/push-missing-object-error' into maint-2.51 2025-10-15 10:29:28 -07:00
remote.h
repack-cruft.c packfile: introduce macro to iterate through packs 2025-10-16 14:42:39 -07:00
repack-filtered.c repack: move `write_filtered_pack()` out of the builtin 2025-10-16 10:08:57 -07:00
repack-geometry.c packfile: introduce macro to iterate through packs 2025-10-16 14:42:39 -07:00
repack-midx.c repack: 'write_midx_included_packs' API from the builtin 2025-10-16 10:08:56 -07:00
repack-promisor.c builtin/repack.c: remove "repack_promisor_objects()" from the builtin 2025-10-16 10:08:55 -07:00
repack.c packfile: introduce macro to iterate through packs 2025-10-16 14:42:39 -07:00
repack.h repack: move `write_cruft_pack()` out of the builtin 2025-10-16 10:08:57 -07:00
replace-object.c
replace-object.h
repo-settings.c
repo-settings.h
repository.c odb: handle changing a repository's commondir 2025-11-25 12:16:00 -08:00
repository.h odb: handle changing a repository's commondir 2025-11-25 12:16:00 -08:00
rerere.c
rerere.h
reset.c
reset.h
resolve-undo.c
resolve-undo.h
revision.c Merge branch 'ps/commit-graph-per-object-source' 2025-10-13 22:00:35 -07:00
revision.h Merge branch 'kh/format-patch-range-diff-notes' 2025-10-14 12:56:09 -07:00
run-command.c odb: adopt logic to close object databases 2025-11-19 17:41:03 -08:00
run-command.h
sane-ctype.h
scalar.c odb: adopt logic to close object databases 2025-11-19 17:41:03 -08:00
send-pack.c
send-pack.h
sequencer.c Merge branch 'pw/rebase-i-cleanup-fix' into maint-2.51 2025-10-15 10:29:31 -07:00
sequencer.h
serve.c
serve.h
server-info.c packfile: introduce macro to iterate through packs 2025-10-16 14:42:39 -07:00
server-info.h
setup.c odb: handle changing a repository's commondir 2025-11-25 12:16:00 -08:00
setup.h setup: convert `set_git_dir()` to have file scope 2025-11-19 17:41:03 -08:00
sh-i18n--envsubst.c
sha1dc_git.c
sha1dc_git.h
shallow.c
shallow.h
shared.mak
shell.c
shortlog.h
sideband.c
sideband.h
sigchain.c
sigchain.h
simple-ipc.h
sparse-index.c sparse-index: improve advice message instructions 2025-10-20 09:20:50 -07:00
sparse-index.h
split-index.c
split-index.h
stable-qsort.c
statinfo.c
statinfo.h
strbuf.c
strbuf.h
streaming.c object-file: read objects via the loose object source 2025-11-03 12:18:47 -08:00
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
symlinks.h
tag.c
tag.h
tar.h
tempfile.c
tempfile.h
thread-utils.c
thread-utils.h
tmp-objdir.c
tmp-objdir.h
trace.c
trace.h
trace2.c
trace2.h
trailer.c
trailer.h
transport-helper.c
transport-internal.h
transport.c
transport.h
tree-diff.c
tree-walk.c
tree-walk.h
tree.c
tree.h
unicode-width.h unicode: update the width tables to Unicode 17 2025-10-21 10:03:00 -07:00
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 'ps/upload-pack-oom-protection' into maint-2.51 2025-10-15 10:29:30 -07:00
upload-pack.h
url.c
url.h
urlmatch.c
urlmatch.h
usage.c
userdiff.c
userdiff.h
utf8.c
utf8.h
varint.c
varint.h
version-def.h.in
version.c
version.h
versioncmp.c
versioncmp.h
walker.c
walker.h
wildmatch.c
wildmatch.h
worktree.c
worktree.h
wrapper.c
wrapper.h
write-or-die.c
write-or-die.h
ws.c
ws.h
wt-status.c Merge branch 'jk/status-z-short-fix' 2025-10-24 13:48:04 -07:00
wt-status.h
xdiff-interface.c
xdiff-interface.h

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.adoc to get started, then see Documentation/giteveryday.adoc for a useful minimum set of commands, and Documentation/git-<commandname>.adoc 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.adoc (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 to git+subscribe@vger.kernel.org (see https://subspace.kernel.org/subscribing.html for details). The mailing list archives are available at https://lore.kernel.org/git/, https://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