-
Notifications
You must be signed in to change notification settings - Fork 2.4k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Windows: Symlinks are not treated as a directory in gitignore #6250
Comments
Thanks @ehuss - you need not apologize for including rust repro steps. Windows junction points / symlinks are ... complex, so apologies for the question. When you say that it's a symlink - how was this created? |
Yea, |
I am investigating the issue for When reproducing the issue on MacOS with this script… git init excluded-symlinks-to-dir
(cd excluded-symlinks-to-dir
cat <<EOF >.gitignore
src1
src2/
EOF
git add .gitignore && git commit -m "init"
mkdir src
>src/file
ln -s src src1
ln -s src src2
) …and running ❯ git status
On branch main
Untracked files:
(use "git add <file>..." to include in what will be committed)
src/
src2
nothing added to commit but untracked files present (use "git add" to track) …I would have expected that Thus it seems that Git also doesn't handle this case. Arguments can probably be made for and against this behaviour, such that…
…by the exclude/gitignore machinery of the directory walk. It seems that |
I would expect us to match git's behavior on POSIXy systems. But I think that windows is just different. There's several different types of things that are "links", all (IIRC) implemented as "reparse points", and potentially all treated a little bit differently. We should probably match git for windows behavior here, but I don't think that there's been some well-designed, thoughtful plan around this, I think it's just "whatever mingw does". So it will most likely be a disappointing change. |
When there is a gitignore entry with a trailing slash,
git_index_add_all
will add symlinks that match the gitignore patterns on Windows but not other platforms.Reproduction steps
The following Rust program demonstrates the problem. Sorry for only including a Rust reproduction, hopefully it is easy to see the equivalent C api calls (it is mostly 1:1). I couldn't figure out how to build a project with Visual Studio linking to libgit2 (if there are docs somewhere on how to do that, I'd be happy to make a C example).
In this example, there is a file
src/samplefile
and a symlinksrc2 -> src
. The.gitignore
has a pattern/src2/
intending to preventsrc2
from being added.Expected behavior
git_index_add_all
will only add.gitignore
andsrc/samplefile
.Actual behavior
On Windows, it also adds the
src2
symlink, causing the final assert to fail.This seems to only happen with patterns with a trailing slash. A summary of the the gitignore pattern behavior:
/src2/
andsrc2/
fail on Windows./src2
andsrc2
work as expected on all platforms.I've also tested with
core.symlinks=true
orfalse
, it doesn't seem to affect it.Version of libgit2 (release number or SHA1)
2a0d0bd
Operating system(s) tested
Windows, macOS, Linux
The text was updated successfully, but these errors were encountered: