wslbridge icon indicating copy to clipboard operation
wslbridge copied to clipboard

Git for Windows can't find %UserProfile%\.gitconfig when running through wslbridge

Open nickbudi opened this issue 6 years ago • 7 comments

Originally opened as a ConEmu issue here https://github.com/Maximus5/ConEmu/issues/1654

Versions

ConEmu build: 180626 x64 (portable) OS version: Windows 10 Pro Build 17134 x64 Used shell version: wslbridge + zsh

Problem description

Git for Windows (installed separately) doesn't find .gitconfig in windows user profile when running git through wslbridge, instead looking for the global gitconfig in %ConEmuBaseDirShort%/home/budi/.gitconfig. But running Git for Windows through wsl.exe + zsh works fine.

Steps to reproduce

  1. Install Git for Windows and add to path
  2. place .gitconfig in %UserProfile%\.gitconfig
  3. wslbridge task:
set "PATH=%ConEmuBaseDirShort%\wsl;%PATH%" & %ConEmuBaseDirShort%\conemu-cyg-64.exe --wsl -cur_console:pnm:/mnt -t zsh
  1. run git.exe config --global --list

Actual results

fatal: unable to read config file 'C:/Program Files/ConEmu/App/ConEmu/ConEmu/home/budi/.gitconfig': No such file or directory

Expected results

user.name=nickbudi
(prints rest of .gitconfig...)

nickbudi avatar Jul 24 '18 00:07 nickbudi

Same issue here.

gmanche avatar Aug 06 '18 23:08 gmanche

Same problem here too. is there any why to set the Home drive to other location where we have our .gitConfig file saved ?

aravindnadumane avatar Sep 20 '18 13:09 aravindnadumane

@nickbudi, @gmanche, @aravindnadumane have you found any decision yet?

I can't using vscode git due to this

solesensei avatar Jan 05 '19 20:01 solesensei

Hi @SoleSensei, I'm finally using only Ubuntu Git version in WSLBridge, and with it's own .gitconfig file (making a symlink on those of Git for Windows may works, not using specific tools (merge, diff, etc) Hope this helps

gmanche avatar Jan 06 '19 10:01 gmanche

Hello, this one helped me: echo "export WSLENV=HOME/p" >> ~/.profile

WSLENV will forward all passed env variables to wsl, flag \p will convert wsl to windows path.

zviryatko avatar Jun 06 '19 16:06 zviryatko

Tested with git-for-windows version 2.25.0.windows.1 and wslbridge-0.2.4-cygwin64:

C:\Users\username>echo %HOME%
%HOME%                                          so HOME is not set in my global environment
C:\Users\username>D:\Programs\Git\bin\git.exe config --global -e
                                                has opened C:/Users/username/.gitconfig
C:\Users\username>D:\ExcludeFromBackup\tmp\wslbridge-0.2.4-cygwin64\wslbridge.exe
User@hostname:/mnt/c/Users/username$ echo $HOME
/home/User
User@hostname:/mnt/c/Users/username$ cmd.exe /c@ echo '%HOME%'
D:\ExcludeFromBackup\tmp\home\username          Windows Environment variable 'HOME' is set to 
                                                a different value than WSL internal 'HOME'
User@hostname:/mnt/c/Users/username$ /mnt/d/Programs/Git/bin/git.exe config --global -e
fatal: cannot create configuration file D:/ExcludeFromBackup/tmp/home/Timo/.gitconfig: No such file or directory
                                                git for Windows looks in Windows Environment variable 'HOME'

The value of Windows Environment variable HOME has the value it had, when WSL was launched, so in this case its the value it had within wslbridge.exe. As wslbridge.exe is a cygwin application, cygwin1.dll startup code ensures, that a proper cygwin environment is present. cygwin1.dll assumes, that the cygwin root directory is one directory above the directory in which cygwin1.dll is located. If HOME is not set, cygwin sets it to cygwin-root\home\username.

Git for Windows checks if HOME is set, and in that case assumes, that its .gitconfig is located there. Otherwise it assumes that .gitconfig is located in the Windows User home directory.

Solution

Create file nsswitch.conf in <path to cygwin1.dll>\..\etc\ containing db_home: <cygwin style path to desired location> (See https://stackoverflow.com/questions/1494658/how-can-i-change-my-cygwin-home-folder-after-installation for nsswitch.conf)

C:\Users\username>mkdir D:\ExcludeFromBackup\tmp\wslbridge-0.2.4-cygwin64\..\etc\
C:\Users\username>echo db_home: /%H > D:\ExcludeFromBackup\tmp\wslbridge-0.2.4-cygwin64\..\etc\nsswitch.conf

/%H means, that the cygwin HOME variable is set to the Windows User home directory, which is the path, where git for Windows otherwise looks by default.

Test

C:\Users\username>D:\ExcludeFromBackup\tmp\wslbridge-0.2.4-cygwin64\wslbridge.exe
User@hostname:/mnt/c/Users/username$ echo $HOME
/home/User
User@hostname:/mnt/c/Users/username$ cmd.exe /c@ echo '%HOME%'
C:\Users\username
User@hostname:/mnt/c/Users/username$ /mnt/d/Programs/Git/bin/git.exe config --global -e
                                                has opened C:/Users/username/.gitconfig

TLDR - Solution in ConEmu:

ConEmu.exe -run "{Shells::Cmd (Admin)}"

Or open admin cmd with ConEmu-variables set in any way. Then:

mkdir "%ConEmuBaseDir%\etc"
echo db_home: /%H > "%ConEmuBaseDir%\etc\nsswitch.conf"
exit

TSlivede avatar Jan 18 '20 17:01 TSlivede

@zviryatko The problem with export WSLENV=HOME/p is that the Windows HOME variable then points to the WSL directory, so git for Windows is then using the .gitconfig of you WSL user. That may or may not be what you want.

TSlivede avatar Jan 18 '20 17:01 TSlivede