gitvisual-studio-codevscodium

VSCode/VSCodium showing git gutters even though there are no actual changes in the repo


VSCodium version: 1.75.1, 1.76

Problem: switching to a different branch shows makes editor think that files were changed, but not commited.

There are no uncommited files/changes in my repository. Source control tab does not show any uncommited changes and git diff returns nothing. It's as if it's comparing the current branch to the one that I was on before opening the editor. Same happens if I switch the branch using git switch externally, from terminal.

The only way to "fix" this issue is to call a fill VSCode window reload, but if I switch to a different branch after that - the issue appears again. I tried creating a demo repo to show this issue, but it was not reproduced.

UPD1: here is what it looks like:

No changes in source control, diff still displaying

Before this I switched to a different branch (say from develop branch to a feature-1) and hit refresh on source control.

UPD2: VSCode git output from a repo that works fine

2023-03-05 17:02:53.265 [info] > git checkout -q lineageos-19.1 [796ms]
2023-03-05 17:02:53.273 [info] > git config --get commit.template [3ms]
2023-03-05 17:02:53.273 [info] > git for-each-ref --format=%(refname)%00%(upstream:short)%00%(objectname)%00%(upstream:track)%00%(upstream:remotename)%00%(upstream:remoteref) refs/heads/lineageos-19.1 refs/remotes/lineageos-19.1 [1ms]
2023-03-05 17:02:53.397 [info] > git status -z -uall [121ms]
2023-03-05 17:02:54.496 [info] > git ls-files --stage -- /mnt/sdb2/Kernels/SAKE_Kernel/drivers/cpufreq/qcom-cpufreq-hw.c [4ms]
2023-03-05 17:02:54.502 [info] > git cat-file -s 98f9456f8697fa03731b9db72b22d264ea51219d [1ms]
2023-03-05 17:02:54.513 [info] > git show --textconv :drivers/cpufreq/qcom-cpufreq-hw.c [5ms]
2023-03-05 17:03:00.801 [info] > git for-each-ref --sort -committerdate --format %(refname) %(objectname) %(*objectname) [78ms]
2023-03-05 17:03:01.993 [info] > git checkout -q lineage-19.1-yaro [141ms]
2023-03-05 17:03:02.000 [info] > git config --get commit.template [3ms]
2023-03-05 17:03:02.004 [info] > git for-each-ref --format=%(refname)%00%(upstream:short)%00%(objectname)%00%(upstream:track)%00%(upstream:remotename)%00%(upstream:remoteref) refs/heads/lineage-19.1-yaro refs/remotes/lineage-19.1-yaro [1ms]
2023-03-05 17:03:02.130 [info] > git status -z -uall [123ms]
2023-03-05 17:03:03.228 [info] > git ls-files --stage -- /mnt/sdb2/Kernels/SAKE_Kernel/drivers/cpufreq/qcom-cpufreq-hw.c [4ms]
2023-03-05 17:03:03.232 [info] > git cat-file -s 6a3f6cff159509b868f1ec14c97fc17fbaebdf86 [1ms]
2023-03-05 17:03:03.243 [info] > git show --textconv :drivers/cpufreq/qcom-cpufreq-hw.c [5ms]
2023-03-05 17:03:06.027 [info] > git check-ignore -v -z --stdin [27ms]
2023-03-05 17:03:11.230 [info] > git ls-files --stage -- /mnt/sdb2/Kernels/SAKE_Kernel/drivers/cpufreq/qcom-cpufreq-hw.c [5ms]
2023-03-05 17:03:11.236 [info] > git cat-file -s 6a3f6cff159509b868f1ec14c97fc17fbaebdf86 [1ms]
2023-03-05 17:03:11.251 [info] > git show --textconv :drivers/cpufreq/qcom-cpufreq-hw.c [5ms]
2023-03-05 17:03:11.675 [info] > git fetch [1637ms]
2023-03-05 17:03:11.683 [info] > git config --get commit.template [4ms]
2023-03-05 17:03:11.684 [info] > git for-each-ref --format=%(refname)%00%(upstream:short)%00%(objectname)%00%(upstream:track)%00%(upstream:remotename)%00%(upstream:remoteref) refs/heads/lineage-19.1-yaro refs/remotes/lineage-19.1-yaro [1ms]
2023-03-05 17:03:11.801 [info] > git status -z -uall [113ms]
2023-03-05 17:03:12.740 [info] > git ls-files --stage -- /mnt/sdb2/Kernels/SAKE_Kernel/drivers/cpufreq/qcom-cpufreq-hw.c [4ms]
2023-03-05 17:03:12.744 [info] > git cat-file -s 6a3f6cff159509b868f1ec14c97fc17fbaebdf86 [1ms]
2023-03-05 17:03:12.755 [info] > git show --textconv :drivers/cpufreq/qcom-cpufreq-hw.c [5ms]

And here is from a broken one:

2023-03-05 15:57:40.780 [info] > git checkout -q <branch name> [220ms]
2023-03-05 15:57:40.789 [info] > git config --get commit.template [4ms]
2023-03-05 15:57:40.789 [info] > git for-each-ref --format=%(refname)%00%(upstream:short)%00%(objectname)%00%(upstream:track)%00%(upstream:remotename)%00%(upstream:remoteref) refs/heads/<branch name> refs/remotes/<branch name> [1ms]
2023-03-05 15:57:40.795 [info] > git status -z -uall [2ms]

UPD3: I was able to narrow it down a little bit:

  1. The issue is reproduced only in repos where .git is a symlink to another folder (I am working in AOSP repos)
  2. Repos that do not have symlinks are not affected
  3. I finally learned that those bars are called git gutters
  4. Opened an issue in the official VSCode issue tracker: https://github.com/microsoft/vscode/issues/176497

UPD4: as a workaround I made the following script and added it to vscode's settings.json ("git.path": "/home/yaro/set-actual-git-dir"):

#!/bin/bash

git --git-dir="$(realpath .git/)" "${@}"

UPD5: git blame extension stopped working after the workaround from UPD4 so I had to update it:

#!/bin/bash

if [ -z "$VSCODE_GIT_COMMAND" ]; then
    git "${@}"
else
    git --git-dir="$(realpath .git/)" "${@}"
fi

Now it only sets --git-dir for VSCODE commands and not for extensions (at least not for git blame that I use: https://github.com/Sertion/vscode-gitblame/)


Solution

  • Check first if you have a setting like git config --global core.autocrlf set to true.
    It could transform EOL (end of lines) from LF to CRLF automatically at each branch switch.

    You can check those attributes (before and after a switch) with git ls-files --eol.

    If that is the issue, setting core.autocrlf to false is the recommended best practice.


    The issue is reproduced only in repos where .git is a symlink to another folder (I am working in AOSP repos)

    Yes, that was mentioned more generally before with "VS Code not to use the real path of a symlink" and "How do I get git changes to show in explorer in VS Code?"

    You can try and open VSCode from a session where:

    That needs to be done before launching VSCode.
    Or, as the OP did, modify the git call from VSCode settings.json:

    "git.path": "/home/yaro/set-actual-git-dir"):
    

    With set-actual-git-dir:

    #!/bin/bash
    
    git --git-dir="$(realpath .git/)" "${@}"
    

    I finally learned that those bars are called git gutters

    Gutter is the section beside the editor view in which you can have various indicators, including Git ones.