I don't think its as simple as first thoughts indicate, project files don't get stored in the tree by default, they default to `~/projects`.
My projects are stored on a raid array mounted at `/data` so paths relative to the project file would be something like `../../../../data/what/ever/hello_world.cpp` which won't travel either. You would need to be sure all paths were below the project file.
As you alluded to, Windows could be trickier, I'm not sure `..` will go from `c:` to `d:` nor between two SMB mounted systems `//a/` and `//b/`.
Finally, as I said, projects are basically session files, changes in which files are open get stored in the project file. So if you store it in git it is likely to get stored on every commit or you will likely get "changed but not committed" messages when you do some git things.
There have been various discussions about separating the settings and the session so its cleaner to store project settings in VCS, but no flexible, good, simple, efficient, and easy solution was found.