Skip to content

Instantly share code, notes, and snippets.

@nickbudi
Last active November 4, 2023 10:53
Show Gist options
  • Save nickbudi/4b489f50086db805ea0f3864aa93a9f8 to your computer and use it in GitHub Desktop.
Save nickbudi/4b489f50086db805ea0f3864aa93a9f8 to your computer and use it in GitHub Desktop.
Cygwin git compatibility with VS Code (or other Windows programs) using cygpath

Cygwin Git + VS Code compatibility

Thanks and credit to mattn and ferreus on GitHub.

Also check out Developing on WSL and/or wslpath (Windows 10 Build 17046 or later) if you're using the Windows Subsystem for Linux.

#!/bin/bash
# wrapper to convert linux paths to windows
# so vscode will work as a git editor with cygwin
# editor="/home/this/file.sh" in .gitconfig
# extract last argument (the file path)
for last; do true; done
# get all the initial command arguments
all="${@:1:$(($#-1))}"
# launch editor with windows path
code $all $(cygpath -w $last)
@echo off
REM wrapper to convert linux paths to windows
REM so vscode git integration will work with cygwin
REM "git.path"="C:\\this\\file.bat" in settings.json
setlocal
set PATH=C:\cygwin\bin;%PATH%
if "%1" equ "rev-parse" goto rev_parse
git %*
goto :eof
:rev_parse
for /f %%1 in ('git %*') do cygpath -w %%1
@musm
Copy link

musm commented Jul 4, 2020

Actually this line needs to be set to

code $all $(cygpath -w $last)

and also change

export GIT_EDITOR="$HOME/cygpath-git-editor.sh -w"

@ubw
Copy link

ubw commented Apr 23, 2021

works for me! thank you!

@DanKaplanSES
Copy link

DanKaplanSES commented Sep 27, 2021

Thank you for sharing this! I have provided some step-by-step instructions here: https://stackoverflow.com/a/69340165/61624

@StLeoX
Copy link

StLeoX commented Mar 28, 2022

Emmm...There may be still a small problom for me. In this way, it's display file status correctly. But when using the source manage in the VSCode Sidebar, it doesn't work. It still prompt "can't spawn git.bat". So sad :(

@gene-pavlovsky
Copy link

I tried the bat wrapper, it worked for basic git status display, but trying to stage/unstage a file resulted in errors.

I.e. either of these commands issued by VS Code failed:
Stage: git add -A -- C:\project\hxcalc\package.json
Unstage: git reset -q HEAD -- C:\project\hxcalc\package.json
Both of them result result in fatal: C:\project\hxcalc\package.json: 'C:\project\hxcalc\package.json' is outside repository at '/mnt/c/project/hxcalc'

I tried the same commands in Cygwin bash, and indeed, Cygwin git doesn't seem to be able to handle Windows paths.

What worked for me is this: github.com/nukata/cyg-git. It's a tiny C wrapper that you compile with gcc (for my use case, regular Cygwin gcc worked), and a Zsh wrapper script that works similar to cygpath-git-vscode.bat, but it also takes care of converting paths passed to git. I had to make a small change to this script to make it handle rev-parse commands that produce multiple lines of output (made a PR to the original repo).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment