Skip to contentSkip to conversation

Move Git for Windows' system config to its top-level directory's etc/

PATCH New Johannes Schindelin via GitGitGadget 1 participant 4 messages Jun 22, 2021

lore
Share & tools
lore
#0 lore raw

cover Move Git for Windows' system config to its top-level directory's etc/

Implementation details let Git for Windows' git.exe live in /mingw64/bin (that is the pseudo-Unix path, of course, the real Windows path will be prefixed by the actual installation location). This resulted in the awkward location of the system config in C:\Program Files\Git\mingw64\etc\gitconfig, and that is what Git for Windows v2.x used for a few years.

A much more natural location, however, is the same path without that mingw64 infix. Therefore, the Git for Windows project switched (back) to that location for a while now.

It is time to bring that change into core Git.

Dennis Ameling (1):
cmake(windows): set correct path to the system Git config

Johannes Schindelin (2):
mingw: move Git for Windows' system config where users expect it
config: normalize the path of the system gitconfig

 config.c                            |  7 ++++---
 config.mak.uname                    | 10 ++++++++++
 contrib/buildsystems/CMakeLists.txt | 11 +++++++----
 3 files changed, 21 insertions(+), 7 deletions(-)

base-commit: 670b81a890388c60b7032a4f5b879f2ece8c4558
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-984%2Fdscho%2Fmove-gfw-system-config-to-top-level-v1
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-984/dscho/move-gfw-system-config-to-top-level-v1
Pull-Request: https://github.com/gitgitgadget/git/pull/984

Signature · 1 line
gitgitgadget
#1 lore raw

PATCH 1/3 mingw: move Git for Windows' system config where users expect it

From: Johannes Schindelin <[email protected]>

Git for Windows' prefix is /mingw64/ (or /mingw32/ for 32-bit versions), therefore the system config is located at the clunky location C:\Program Files\Git\mingw64\etc\gitconfig.

This moves the system config into a more logical location: the mingw64 part of C:\Program Files\Git\mingw64\etc\gitconfig never made sense, as it is a mere implementation detail. Let's skip the mingw64 part and move this to C:\Program Files\Git\etc\gitconfig.

Side note: in the rare (and not recommended) case a user chooses to install 32-bit Git for Windows on a 64-bit system, the path will of course be C:\Program Files (x86)\Git\etc\gitconfig.

Background: During the Git for Windows v1.x days, the system config was located at C:\Program Files (x86)\Git\etc\gitconfig. With Git for Windows v2.x, it moved to C:\Program Files\Git\mingw64\gitconfig (or C:\Program Files (x86)\Git\mingw32\gitconfig). Rather than fixing it back then, we tried to introduce a "Windows-wide" config, but that never caught on.

Likewise, we move the system gitattributes into the same directory.

Obviously, we are cautious to do this only for the known install locations /mingw64 and /mingw32; If anybody wants to override that while building their version of Git (e.g. via make prefix=$HOME), we leave the default location of the system config and gitattributes alone.

---
 config.mak.uname | 10 ++++++++++
 1 file changed, 10 insertions(+)
config.mak.uname +10 -0
index cb443b4e023a..0587a23c1cb1 100644
@@ -437,6 +437,11 @@ ifeq ($(uname_S),Windows)
 	NO_POSIX_GOODIES = UnfortunatelyYes
 	NATIVE_CRLF = YesPlease
 	DEFAULT_HELP_FORMAT = html
+ifeq (/mingw64,$(subst 32,64,$(prefix)))
+	# Move system config into top-level /etc/
+	ETC_GITCONFIG = ../etc/gitconfig
+	ETC_GITATTRIBUTES = ../etc/gitattributes
+endif
 
 	CC = compat/vcbuild/scripts/clink.pl
 	AR = compat/vcbuild/scripts/lib.pl
@@ -671,6 +676,11 @@ else
 		USE_LIBPCRE= YesPlease
 		NO_CURL =
 		USE_NED_ALLOCATOR = YesPlease
+		ifeq (/mingw64,$(subst 32,64,$(prefix)))
+			# Move system config into top-level /etc/
+			ETC_GITCONFIG = ../etc/gitconfig
+			ETC_GITATTRIBUTES = ../etc/gitattributes
+		endif
 	else
 		COMPAT_CFLAGS += -D__USE_MINGW_ANSI_STDIO
 		NO_CURL = YesPlease
Signature · 1 line
gitgitgadget
#2 lore raw

PATCH 2/3 cmake(windows): set correct path to the system Git config

In reply to Johannes Schindelin via GitGitGadget

From: Dennis Ameling <[email protected]>

Currently, when Git for Windows is built with CMake, the system Git config is expected in a different location than when building via make: the former expects it to be in <runtime-prefix>/mingw64/etc/gitconfig, the latter in <runtime-prefix>/etc/gitconfig.

Because of this, things like git clone do not work correctly (because cURL is no longer able to find its certificate bundle that it needs to validate HTTPS certificates). See the full bug report and discussion here:
https://github.com/git-for-windows/git/issues/3071#issuecomment-789261386.

This commit aligns the CMake-based build by mimicking what is already done in config.mak.uname.

This closes https://github.com/git-for-windows/git/issues/3071.

---
 contrib/buildsystems/CMakeLists.txt | 11 +++++++----
 1 file changed, 7 insertions(+), 4 deletions(-)
contrib/buildsystems/CMakeLists.txt +7 -4
index a87841340e6a..bdc5ab58d038 100644
@@ -204,8 +204,6 @@ list(APPEND compat_SOURCES sha1dc_git.c sha1dc/sha1.c sha1dc/ubc_check.c block-s
 
 
 add_compile_definitions(PAGER_ENV="LESS=FRX LV=-c"
-			ETC_GITATTRIBUTES="etc/gitattributes"
-			ETC_GITCONFIG="etc/gitconfig"
 			GIT_EXEC_PATH="libexec/git-core"
 			GIT_LOCALE_PATH="share/locale"
 			GIT_MAN_PATH="share/man"
@@ -220,10 +218,15 @@ add_compile_definitions(PAGER_ENV="LESS=FRX LV=-c"
 
 if(WIN32)
 	set(FALLBACK_RUNTIME_PREFIX /mingw64)
-	add_compile_definitions(FALLBACK_RUNTIME_PREFIX="${FALLBACK_RUNTIME_PREFIX}")
+	# Move system config into top-level /etc/
+	add_compile_definitions(FALLBACK_RUNTIME_PREFIX="${FALLBACK_RUNTIME_PREFIX}"
+		ETC_GITATTRIBUTES="../etc/gitattributes"
+		ETC_GITCONFIG="../etc/gitconfig")
 else()
 	set(FALLBACK_RUNTIME_PREFIX /home/$ENV{USER})
-	add_compile_definitions(FALLBACK_RUNTIME_PREFIX="${FALLBACK_RUNTIME_PREFIX}")
+	add_compile_definitions(FALLBACK_RUNTIME_PREFIX="${FALLBACK_RUNTIME_PREFIX}"
+		ETC_GITATTRIBUTES="etc/gitattributes"
+		ETC_GITCONFIG="etc/gitconfig")
 endif()
 
 
Signature · 1 line
gitgitgadget
#3 lore raw

PATCH 3/3 config: normalize the path of the system gitconfig

In reply to Johannes Schindelin via GitGitGadget

From: Johannes Schindelin <[email protected]>

Git for Windows is compiled with a runtime prefix, and that runtime prefix is typically C:/Program Files/Git/mingw64. As we want the system gitconfig to live in the sibling directory etc, we define the relative path as ../etc/gitconfig.

However, as reported by Philip Oakley, the output of git config --show-origin --system -l looks rather ugly, as it shows the path as file:C:/Program Files/Git/mingw64/../etc/gitconfig, i.e. with the mingw64/../ part.

By normalizing the path, we get a prettier path.

---
 config.c | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)
config.c +4 -3
index f9c400ad3062..3cd10aeb9028 100644
@@ -1833,9 +1833,10 @@ static int git_config_from_blob_ref(config_fn_t fn,
 char *git_system_config(void)
 {
 	char *system_config = xstrdup_or_null(getenv("GIT_CONFIG_SYSTEM"));
-	if (system_config)
-		return system_config;
-	return system_path(ETC_GITCONFIG);
+	if (!system_config)
+		system_config = system_path(ETC_GITCONFIG);
+	normalize_path_copy(system_config, system_config);
+	return system_config;
 }
 
 void git_global_config(char **user_out, char **xdg_out)
Signature · 1 line
gitgitgadget