Go to file
Johannes Schindelin f30afdabbf mingw: introduce the 'core.hideDotFiles' setting
On Unix (and Linux), files and directories whose names start with a dot
are usually not shown by default. This convention is used by Git: the
.git/ directory should be left alone by regular users, and only accessed
through Git itself.

On Windows, no such convention exists. Instead, there is an explicit flag
to mark files or directories as hidden.

In the early days, Git for Windows did not mark the .git/ directory (or
for that matter, any file or directory whose name starts with a dot)
hidden. This lead to quite a bit of confusion, and even loss of data.

Consequently, Git for Windows introduced the core.hideDotFiles setting,
with three possible values: true, false, and dotGitOnly, defaulting to
marking only the .git/ directory as hidden.

The rationale: users do not need to access .git/ directly, and indeed (as
was demonstrated) should not really see that directory, either. However,
not all dot files should be hidden by default, as e.g. Eclipse does not
show them (and the user would therefore be unable to see, say, a
.gitattributes file).

In over five years since the last attempt to bring this patch into core
Git, a slightly buggy version of this patch has served Git for Windows'
users well: no single report indicated problems with the hidden .git/
directory, and the stream of problems caused by the previously non-hidden
.git/ directory simply stopped. The bugs have been fixed during the
process of getting this patch upstream.

Note that there is a funny quirk we have to pay attention to when
creating hidden files: we use Win32's _wopen() function which
transmogrifies its arguments and hands off to Win32's CreateFile()
function. That latter function errors out with ERROR_ACCESS_DENIED (the
equivalent of EACCES) when the equivalent of the O_CREAT flag was passed
and the file attributes (including the hidden flag) do not match an
existing file's. And _wopen() accepts no parameter that would be
transmogrified into said hidden flag. Therefore, we simply try again
without O_CREAT.

A slightly different method is required for our fopen()/freopen()
function as we cannot even *remove* the implicit O_CREAT flag.
Therefore, we briefly mark existing files as unhidden when opening them
via fopen()/freopen().

The ERROR_ACCESS_DENIED error can also be triggered by opening a file
that is marked as a system file (which is unlikely to be tracked in
Git), and by trying to create a file that has *just* been deleted and is
awaiting the last open handles to be released (which would be handled
better by the "Try again?" logic, a story for a different patch series,
though). In both cases, it does not matter much if we try again without
the O_CREAT flag, read: it does not hurt, either.

For details how ERROR_ACCESS_DENIED can be triggered, see
https://msdn.microsoft.com/en-us/library/windows/desktop/aa363858

Original-patch-by: Erik Faye-Lund <kusmabite@gmail.com>
Initial-Test-By: Pat Thoyts <patthoyts@users.sourceforge.net>
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2016-05-11 13:54:53 -07:00
Documentation mingw: introduce the 'core.hideDotFiles' setting 2016-05-11 13:54:53 -07:00
block-sha1
…
builtin Merge branch 'sb/submodule-module-list-pathspec-fix' 2016-03-24 12:27:13 -07:00
compat mingw: introduce the 'core.hideDotFiles' setting 2016-05-11 13:54:53 -07:00
contrib Merge branch 'pw/completion-stash' into maint 2016-02-22 13:10:20 -08:00
ewah ewah: convert to REALLOC_ARRAY, etc 2016-02-22 14:51:09 -08:00
git-gui
…
gitk-git Merge branch 'master' of git://ozlabs.org/~paulus/gitk 2016-03-20 18:05:10 -07:00
gitweb gitweb: squelch "uninitialized value" warning 2016-01-12 13:21:15 -08:00
mergetools mergetool: reorder vim/gvim buffers in three-way diffs 2016-02-12 10:14:09 -08:00
perl git-svn: shorten glob error message 2016-03-15 01:35:39 +00:00
po Merge branch 'master' of https://github.com/vnwildman/git 2016-03-23 23:01:51 +08:00
ppc
…
refs Merge branch 'jk/tighten-alloc' 2016-02-26 13:37:16 -08:00
t mingw: introduce the 'core.hideDotFiles' setting 2016-05-11 13:54:53 -07:00
templates Merge branch 'ma/update-hooks-sample-typofix' into maint 2016-03-10 11:13:50 -08:00
vcs-svn
…
xdiff Merge branch 'ps/plug-xdl-merge-leak' into maint 2016-03-10 11:13:49 -08:00
.gitattributes
…
.gitignore gitignore: ignore generated test-fake-ssh executable 2016-02-08 12:18:51 -08:00
.mailmap
…
.travis.yml add DEVELOPER makefile knob to check for acknowledged warnings 2016-02-25 12:49:45 -08:00
COPYING
…
GIT-VERSION-GEN Git 2.8 2016-03-28 12:19:45 -07:00
INSTALL
…
LGPL-2.1
…
Makefile Merge branch 'jc/sane-grep' 2016-03-16 13:16:54 -07:00
README.md README.md: move down historical explanation about the name 2016-02-25 09:33:58 -08:00
RelNotes Git 2.7.4 2016-03-17 11:32:13 -07:00
abspath.c
…
aclocal.m4
…
advice.c
…
advice.h
…
alias.c convert trivial cases to ALLOC_ARRAY 2016-02-22 14:51:09 -08:00
alloc.c
…
archive-tar.c
…
archive-zip.c
…
archive.c use st_add and st_mult for allocation size computation 2016-02-22 14:51:09 -08:00
archive.h
…
argv-array.c argv-array: add detach function 2016-02-22 14:50:32 -08:00
argv-array.h argv-array: add detach function 2016-02-22 14:50:32 -08:00
attr.c convert trivial cases to FLEX_ARRAY macros 2016-02-22 14:51:09 -08:00
attr.h
…
base85.c
…
bisect.c Merge branch 'jk/tighten-alloc' 2016-02-26 13:37:16 -08:00
bisect.h
…
blob.c
…
blob.h
…
branch.c config: rename git_config_set to git_config_set_gently 2016-02-22 10:23:55 -08:00
branch.h branch: report errors in tracking branch setup 2016-02-22 10:23:30 -08:00
builtin.h
…
bulk-checkin.c
…
bulk-checkin.h
…
bundle.c
…
bundle.h
…
cache-tree.c Merge branch 'jk/tighten-alloc' into maint 2016-03-10 11:13:43 -08:00
cache-tree.h
…
cache.h mingw: introduce the 'core.hideDotFiles' setting 2016-05-11 13:54:53 -07:00
check-builtins.sh
…
check-racy.c
…
check_bindir
…
color.c
…
color.h
…
column.c use xmallocz to avoid size arithmetic 2016-02-22 14:51:09 -08:00
column.h
…
combine-diff.c use st_add and st_mult for allocation size computation 2016-02-22 14:51:09 -08:00
command-list.txt
…
commit-slab.h
…
commit.c use st_add and st_mult for allocation size computation 2016-02-22 14:51:09 -08:00
commit.h
…
config.c mingw: introduce the 'core.hideDotFiles' setting 2016-05-11 13:54:53 -07:00
config.mak.in
…
config.mak.uname Merge branch 'tb/avoid-gcc-on-darwin-10-6' 2016-03-21 09:20:13 -07:00
configure.ac Merge branch 'jc/sane-grep' 2016-03-16 13:16:54 -07:00
connect.c Merge branch 'cn/deprecate-ssh-git-url' 2016-03-16 13:16:40 -07:00
connect.h connect & http: support -4 and -6 switches for remote operations 2016-02-12 11:34:14 -08:00
connected.c
…
connected.h
…
convert.c Merge branch 'tb/conversion' 2016-02-26 13:37:23 -08:00
convert.h ls-files: add eol diagnostics 2016-01-18 19:48:43 -08:00
copy.c
…
credential-cache--daemon.c Merge branch 'jg/credential-cache-chdir-to-sockdir' 2016-02-26 13:37:20 -08:00
credential-cache.c
…
credential-store.c strbuf: introduce strbuf_getline_{lf,nul}() 2016-01-15 10:12:51 -08:00
credential.c strbuf: introduce strbuf_getline_{lf,nul}() 2016-01-15 10:12:51 -08:00
credential.h
…
csum-file.c
…
csum-file.h
…
ctype.c
…
daemon.c Merge branch 'jk/tighten-alloc' 2016-02-26 13:37:16 -08:00
date.c
…
decorate.c
…
decorate.h
…
delta.h
…
diff-delta.c
…
diff-lib.c
…
diff-no-index.c Merge branch 'nd/diff-with-path-params' into maint 2016-02-05 14:54:15 -08:00
diff.c Merge branch 'jk/tighten-alloc' into maint 2016-03-10 11:13:43 -08:00
diff.h Merge branch 'maint-2.5' into maint-2.6 2016-03-17 11:26:18 -07:00
diffcore-break.c
…
diffcore-delta.c use st_add and st_mult for allocation size computation 2016-02-22 14:51:09 -08:00
diffcore-order.c convert trivial cases to ALLOC_ARRAY 2016-02-22 14:51:09 -08:00
diffcore-pickaxe.c
…
diffcore-rename.c use st_add and st_mult for allocation size computation 2016-02-22 14:51:09 -08:00
diffcore.h
…
dir.c Revert "Merge branch 'nd/exclusion-regression-fix'" 2016-03-18 11:06:15 -07:00
dir.h Revert "Merge branch 'nd/exclusion-regression-fix'" 2016-03-18 11:06:15 -07:00
editor.c
…
entry.c use xmallocz to avoid size arithmetic 2016-02-22 14:51:09 -08:00
environment.c mingw: introduce the 'core.hideDotFiles' setting 2016-05-11 13:54:53 -07:00
exec_cmd.c Merge branch 'ak/extract-argv0-last-dir-sep' into maint 2016-03-10 11:13:47 -08:00
exec_cmd.h prepare_{git,shell}_cmd: use argv_array 2016-02-22 14:51:09 -08:00
fast-import.c Merge branch 'jk/tighten-alloc' 2016-02-26 13:37:16 -08:00
fetch-pack.c fetch-pack: ignore SIGPIPE in sideband demuxer 2016-02-25 13:51:47 -08:00
fetch-pack.h
…
fmt-merge-msg.h
…
fsck.c convert trivial cases to ALLOC_ARRAY 2016-02-22 14:51:09 -08:00
fsck.h
…
generate-cmdlist.sh
…
gettext.c
…
gettext.h
…
git-add--interactive.perl
…
git-archimport.perl
…
git-bisect.sh
…
git-compat-util.h Merge branch 'es/st-add4-gcc-4.2-workaround' into maint 2016-03-21 09:19:27 -07:00
git-cvsexportcommit.perl
…
git-cvsimport.perl
…
git-cvsserver.perl git-cvsserver.perl: fix typo 2016-02-17 10:00:53 -08:00
git-difftool--helper.sh
…
git-difftool.perl
…
git-filter-branch.sh Merge branch 'jk/filter-branch-no-index' into maint 2016-02-05 14:54:13 -08:00
git-instaweb.sh
…
git-merge-octopus.sh
…
git-merge-one-file.sh Merge branch 'jk/no-diff-emit-common' into maint 2016-03-10 11:13:42 -08:00
git-merge-resolve.sh
…
git-mergetool--lib.sh
…
git-mergetool.sh
…
git-p4.py git-p4.py: add support for filetype change 2016-01-13 09:06:54 -08:00
git-parse-remote.sh
…
git-quiltimport.sh
…
git-rebase--am.sh
…
git-rebase--interactive.sh Merge branch 'jc/sane-grep' 2016-03-16 13:16:54 -07:00
git-rebase--merge.sh
…
git-rebase.sh Merge branch 'jk/ok-to-fail-gc-auto-in-rebase' into maint 2016-02-05 14:54:13 -08:00
git-relink.perl
…
git-remote-testgit.sh
…
git-request-pull.sh
…
git-send-email.perl Merge branch 'ew/send-email-mutt-alias-fix' into maint 2016-02-05 14:54:09 -08:00
git-sh-i18n.sh
…
git-sh-setup.sh sane_grep: pass "-a" if grep accepts it 2016-03-10 15:35:43 -08:00
git-stash.sh
…
git-submodule.sh submodule: try harder to fetch needed sha1 by direct fetching sha1 2016-02-24 15:24:49 -08:00
git-svn.perl git-svn: fix URL canonicalization during init w/ SVN 1.7+ 2016-03-16 20:16:23 +00:00
git-web--browse.sh
…
git.c Merge branch 'ak/git-strip-extension-from-dashed-command' into maint 2016-03-10 11:13:48 -08:00
git.rc
…
git.spec.in
…
gpg-interface.c
…
gpg-interface.h
…
graph.c convert trivial cases to ALLOC_ARRAY 2016-02-22 14:51:09 -08:00
graph.h
…
grep.c use xmallocz to avoid size arithmetic 2016-02-22 14:51:09 -08:00
grep.h
…
hashmap.c convert trivial cases to FLEX_ARRAY macros 2016-02-22 14:51:09 -08:00
hashmap.h
…
help.c convert trivial cases to FLEX_ARRAY macros 2016-02-22 14:51:09 -08:00
help.h
…
hex.c
…
http-backend.c
…
http-fetch.c
…
http-push.c Merge branch 'jk/path-name-safety-2.6' into jk/path-name-safety-2.7 2016-03-16 10:42:32 -07:00
http-walker.c
…
http.c Merge branch 'jx/http-no-proxy' 2016-03-10 10:56:43 -08:00
http.h Merge branch 'ew/force-ipv4' 2016-02-24 13:25:54 -08:00
ident.c Merge branch 'da/user-useconfigonly' 2016-02-17 10:13:31 -08:00
imap-send.c use xmallocz to avoid size arithmetic 2016-02-22 14:51:09 -08:00
khash.h convert trivial cases to ALLOC_ARRAY 2016-02-22 14:51:09 -08:00
kwset.c
…
kwset.h
…
levenshtein.c convert trivial cases to ALLOC_ARRAY 2016-02-22 14:51:09 -08:00
levenshtein.h
…
line-log.c convert trivial cases to ALLOC_ARRAY 2016-02-22 14:51:09 -08:00
line-log.h
…
line-range.c
…
line-range.h
…
list-objects.c Merge branch 'jk/path-name-safety-2.6' into jk/path-name-safety-2.7 2016-03-16 10:42:32 -07:00
list-objects.h list-objects: pass full pathname to callbacks 2016-03-16 10:41:04 -07:00
ll-merge.c use xmallocz to avoid size arithmetic 2016-02-22 14:51:09 -08:00
ll-merge.h
…
lockfile.c
…
lockfile.h
…
log-tree.c convert trivial cases to FLEX_ARRAY macros 2016-02-22 14:51:09 -08:00
log-tree.h
…
mailinfo.c strbuf: introduce strbuf_getline_{lf,nul}() 2016-01-15 10:12:51 -08:00
mailinfo.h
…
mailmap.c
…
mailmap.h
…
match-trees.c
…
merge-blobs.c Merge branch 'jk/no-diff-emit-common' into maint 2016-03-10 11:13:42 -08:00
merge-blobs.h
…
merge-recursive.c merge-recursive: find-renames resets threshold 2016-02-24 10:39:02 -08:00
merge-recursive.h merge-recursive: option to disable renames 2016-02-17 10:20:51 -08:00
merge.c
…
mergesort.c
…
mergesort.h
…
name-hash.c convert trivial cases to FLEX_ARRAY macros 2016-02-22 14:51:09 -08:00
notes-cache.c notes: allow treeish expressions as notes ref 2016-01-12 15:10:01 -08:00
notes-cache.h
…
notes-merge.c
…
notes-merge.h
…
notes-utils.c notes: allow treeish expressions as notes ref 2016-01-12 15:10:01 -08:00
notes-utils.h
…
notes.c Merge branch 'jk/tighten-alloc' 2016-02-26 13:37:16 -08:00
notes.h Merge branch 'jk/notes-merge-from-anywhere' 2016-02-03 14:15:59 -08:00
object.c
…
object.h
…
pack-bitmap-write.c Merge branch 'jk/path-name-safety-2.6' into jk/path-name-safety-2.7 2016-03-16 10:42:32 -07:00
pack-bitmap.c Merge branch 'jk/path-name-safety-2.6' into jk/path-name-safety-2.7 2016-03-16 10:42:32 -07:00
pack-bitmap.h
…
pack-check.c convert trivial cases to ALLOC_ARRAY 2016-02-22 14:51:09 -08:00
pack-objects.c
…
pack-objects.h
…
pack-revindex.c Merge branch 'jk/tighten-alloc' 2016-02-26 13:37:16 -08:00
pack-revindex.h
…
pack-write.c
…
pack.h
…
pager.c Merge branch 'jc/am-i-v-fix' into maint 2016-03-10 11:13:41 -08:00
parse-options-cb.c
…
parse-options.c
…
parse-options.h
…
patch-delta.c
…
patch-ids.c
…
patch-ids.h
…
path.c config --show-origin: report paths with forward slashes 2016-03-23 09:58:48 -07:00
pathspec.c convert trivial cases to ALLOC_ARRAY 2016-02-22 14:51:09 -08:00
pathspec.h
…
pkt-line.c
…
pkt-line.h
…
preload-index.c
…
pretty.c
…
prio-queue.c
…
prio-queue.h
…
progress.c use xmallocz to avoid size arithmetic 2016-02-22 14:51:09 -08:00
progress.h
…
prompt.c
…
prompt.h
…
quote.c
…
quote.h
…
reachable.c Merge branch 'maint-2.5' into maint-2.6 2016-03-17 11:26:18 -07:00
reachable.h
…
read-cache.c Merge branch 'nd/ita-cleanup' into maint 2016-02-22 13:10:21 -08:00
ref-filter.c ref-filter.c: mark strings for translation 2016-02-29 14:27:58 -08:00
ref-filter.h
…
reflog-walk.c Merge branch 'dk/reflog-walk-with-non-commit' into maint 2016-02-05 14:54:10 -08:00
reflog-walk.h
…
refs.c use st_add and st_mult for allocation size computation 2016-02-22 14:51:09 -08:00
refs.h Merge branch 'dt/initial-ref-xn-commit-doc' 2016-02-26 13:37:27 -08:00
remote-curl.c Merge branch 'jk/tighten-alloc' into maint 2016-03-10 11:13:43 -08:00
remote-testsvn.c strbuf: introduce strbuf_getline_{lf,nul}() 2016-01-15 10:12:51 -08:00
remote.c Merge branch 'jk/tighten-alloc' into maint 2016-03-10 11:13:43 -08:00
remote.h remote: simplify remote_is_configured() 2016-02-16 13:33:12 -08:00
replace_object.c
…
rerere.c Merge branch 'jk/rerere-xsnprintf' 2016-02-17 10:13:33 -08:00
rerere.h
…
resolve-undo.c
…
resolve-undo.h
…
revision.c Merge branch 'maint-2.5' into maint-2.6 2016-03-17 11:26:18 -07:00
revision.h Merge branch 'maint-2.5' into maint-2.6 2016-03-17 11:26:18 -07:00
run-command.c Merge branch 'jk/tighten-alloc' into maint 2016-03-10 11:13:43 -08:00
run-command.h Merge branch 'sb/submodule-parallel-fetch' 2016-03-04 13:46:30 -08:00
send-pack.c
…
send-pack.h
…
sequencer.c Merge branch 'jk/tighten-alloc' 2016-02-26 13:37:16 -08:00
sequencer.h
…
server-info.c
…
setup.c Merge branch 'jk/tighten-alloc' into maint 2016-03-10 11:13:43 -08:00
sh-i18n--envsubst.c
…
sha1-array.c
…
sha1-array.h
…
sha1-lookup.c
…
sha1-lookup.h
…
sha1_file.c Merge branch 'jk/pack-idx-corruption-safety' into maint 2016-03-10 11:13:46 -08:00
sha1_name.c Merge branch 'jk/tighten-alloc' into maint 2016-03-10 11:13:43 -08:00
shallow.c use st_add and st_mult for allocation size computation 2016-02-22 14:51:09 -08:00
shell.c strbuf: introduce strbuf_getline_{lf,nul}() 2016-01-15 10:12:51 -08:00
shortlog.h
…
show-index.c convert trivial cases to ALLOC_ARRAY 2016-02-22 14:51:09 -08:00
sideband.c
…
sideband.h
…
sigchain.c
…
sigchain.h
…
split-index.c
…
split-index.h
…
strbuf.c Merge branch 'jk/tighten-alloc' 2016-02-26 13:37:16 -08:00
strbuf.h Merge branch 'jc/strbuf-getline' 2016-01-28 16:10:14 -08:00
streaming.c
…
streaming.h
…
string-list.c
…
string-list.h
…
submodule-config.c config: add 'origin_type' to config_source struct 2016-02-22 09:36:33 -08:00
submodule-config.h
…
submodule.c Merge branch 'jk/tighten-alloc' into maint 2016-03-10 11:13:43 -08:00
submodule.h Merge branch 'sb/submodule-parallel-fetch' 2016-01-12 15:16:54 -08:00
symlinks.c
…
tag.c
…
tag.h
…
tar.h
…
tempfile.c
…
tempfile.h
…
test-chmtime.c
…
test-config.c
…
test-ctype.c
…
test-date.c
…
test-delta.c
…
test-dump-cache-tree.c
…
test-dump-split-index.c
…
test-dump-untracked-cache.c test-dump-untracked-cache: don't modify the untracked cache 2016-01-27 12:30:07 -08:00
test-fake-ssh.c mingw: fix t5601-clone.sh 2016-01-27 14:27:19 -08:00
test-genrandom.c
…
test-hashmap.c
…
test-index-version.c
…
test-line-buffer.c
…
test-match-trees.c
…
test-mergesort.c
…
test-mktemp.c
…
test-parse-options.c
…
test-path-utils.c Merge branch 'jk/tighten-alloc' 2016-02-26 13:37:16 -08:00
test-prio-queue.c
…
test-read-cache.c
…
test-regex.c
…
test-revision-walking.c
…
test-run-command.c run-command: do not pass child process data into callbacks 2016-03-01 09:42:01 -08:00
test-scrap-cache-tree.c
…
test-sha1-array.c test-sha1-array: read command stream with strbuf_getline() 2016-01-15 10:35:08 -08:00
test-sha1.c
…
test-sha1.sh
…
test-sigchain.c
…
test-string-list.c
…
test-submodule-config.c
…
test-subprocess.c
…
test-svn-fe.c
…
test-urlmatch-normalization.c
…
test-wildmatch.c
…
thread-utils.c
…
thread-utils.h
…
trace.c
…
trace.h
…
trailer.c trailer.c: mark strings for translation 2016-02-29 14:27:58 -08:00
trailer.h interpret-trailers: add option for in-place editing 2016-01-14 12:22:17 -08:00
transport-helper.c Merge branch 'ew/force-ipv4' 2016-02-24 13:25:54 -08:00
transport.c Merge branch 'cn/deprecate-ssh-git-url' 2016-03-16 13:16:40 -07:00
transport.h connect & http: support -4 and -6 switches for remote operations 2016-02-12 11:34:14 -08:00
tree-diff.c Merge branch 'maint-2.4' into maint-2.5 2016-03-17 11:24:14 -07:00
tree-walk.c do_compare_entry: use already-computed path 2016-01-05 13:39:46 -08:00
tree-walk.h do_compare_entry: use already-computed path 2016-01-05 13:39:46 -08:00
tree.c
…
tree.h
…
unicode_width.h
…
unimplemented.sh
…
unix-socket.c
…
unix-socket.h
…
unpack-trees.c unpack-trees: fix accidentally quadratic behavior 2016-01-22 13:03:10 -08:00
unpack-trees.h
…
update_unicode.sh
…
upload-pack.c
…
url.c
…
url.h
…
urlmatch.c
…
urlmatch.h
…
usage.c
…
userdiff.c
…
userdiff.h diff: clarify textconv interface 2016-02-22 10:40:35 -08:00
utf8.c
…
utf8.h
…
varint.c
…
varint.h
…
version.c
…
version.h
…
versioncmp.c
…
walker.c strbuf: introduce strbuf_getline_{lf,nul}() 2016-01-15 10:12:51 -08:00
walker.h
…
wildmatch.c
…
wildmatch.h
…
worktree.c worktree.c: fix indentation 2016-01-19 11:22:29 -08:00
worktree.h
…
wrap-for-bin.sh
…
wrapper.c Merge branch 'jk/tighten-alloc' 2016-02-26 13:37:16 -08:00
write_or_die.c write_or_die: handle EPIPE in async threads 2016-02-25 13:51:45 -08:00
ws.c
…
wt-status.c Merge branch 'mg/wt-status-mismarked-i18n' 2016-03-14 10:46:17 -07:00
wt-status.h
…
xdiff-interface.c convert trivial cases to ALLOC_ARRAY 2016-02-22 14:51:09 -08:00
xdiff-interface.h
…
zlib.c
…

README.md

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 http://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). To subscribe to the list, send an email with just "subscribe git" in the body to majordomo@vger.kernel.org. The mailing list archives are available at http://news.gmane.org/gmane.comp.version-control.git/, http://marc.info/?l=git and other archival sites.

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