This is a follow-on to the series in: http://public-inbox.org/git/20160913032242.coyuhyhn6uklewuk@xxxxxxxxxxxxxxxxxxxxx/ That series avoided looking at ".git/config" when we haven't discovered whether we are in a git repo. This takes that further and avoids ever looking at ".git" as a fallback. Patches 1-6 just teach various low-level code to detect and handle the case when we are not in a configure repository (along with associated cleanups). The final patch actually disallows this case (and the early fixes were found by running the test suite with just the final patch). I think this is a step in the right direction, both in fixing bugs, but also in making our setup and repository-access code easier to reason about. However, it does carry a risk of regression, if there are more "fixes" that I missed. If we wanted to be really conservative, we could hold back the 7th patch as a separate topic and cook it in "next" for an extra release cycle or something. I'm not all that worried, though. I built this on top of jc/diff-unique-abbrev-comments, as it refactors that same function (and it didn't seem like a bad topic to be held hostage by). [1/7]: read info/{attributes,exclude} only when in repository [2/7]: test-*-cache-tree: setup git dir [3/7]: find_unique_abbrev: use 4-buffer ring [4/7]: diff_unique_abbrev: rename to diff_aligned_abbrev [5/7]: diff_aligned_abbrev: use "struct oid" [6/7]: diff: handle sha1 abbreviations outside of repository [7/7]: setup_git_env: avoid blind fall-back to ".git" attr.c | 6 +++++- builtin/merge.c | 11 +++++----- builtin/receive-pack.c | 16 ++++++--------- cache.h | 4 ++-- combine-diff.c | 6 +++--- diff.c | 43 +++++++++++++++++++++++++--------------- diff.h | 6 +++++- dir.c | 12 +++++------ environment.c | 5 ++++- sha1_name.c | 4 +++- t/helper/test-dump-cache-tree.c | 1 + t/helper/test-scrap-cache-tree.c | 1 + 12 files changed, 68 insertions(+), 47 deletions(-)