git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: Windows support

From
Shawn O. Pearce <spearce@spearce.org>
Date
Jul 26, 2007, 06:53 UTC
Message-ID
<20070726065332.GB18114@spearce.org>
In-Reply-To
<08588116-8E66-4F40-BC77-E0B272BE7776@zib.de>
Steffen Prohaska <prohaska@zib.de> wrote:
Show 10 quoted lines
> On Jul 26, 2007, at 5:15 AM, Shawn O. Pearce wrote:
> >git-gui is fairly well supported under Cygwin, as I use it a lot
> >in my day-job.  As do a lot of my coworkers.  Which actually gives
> >me a pretty good testing ground; ~20 people all beating on git-gui
> >all day long is a pretty sizable testing group.  I actually wonder
> >some days if git-gui is better tested on Cygwin than it is on Linux.
> 
> So apparently you're working in a reasonably sized group of people all
> testing git on cygwin. I'd be completely satisfied if git ran rock solid
> on cygwin.

It is just as rock solid as it is on Mac OS X (my real Git development system) and Solaris. If your Cygwin DLL does not support pread() you do need to compile with NO_PREAD=1, but that's a minor issue. Personally I build Git on Cygwin with pread() and mmap() enabled and it runs fine. Of course we only use it on local drives, and only on NTFS drives.

As has been stated already, Git's checksums work nicely to make
sure data hasn't been corrupted.  I've seen one user have trouble
with checksums failing in his repository.  Usually he recopies it
from another user and picks up where he left off.  Twice I've seen
his packfile corrupted and Git caught the corruption.  We seriously
suspect some bad blocks on his drive.  But budget says we cannot
replace the disk for another 4 years.
 
Show 5 quoted lines
> I found the following list of warnings about cygwin in the wiki
> entry WindowsInstall [1]. Some points look quite scary to me.
> 
> What is your real-world experience? Are the warning still valid?
> Must I really fear to break cygwin if I press Ctrl-C?

Its not that Cygwin breaks. Its that sometimes pressing Ctrl-C doesn't actually stop the process, e.g. the signal isn't sent or just gets ignored. So its annoying because you can't abort things as readily as you might on a good UNIX. Sometimes you get weird stack traces from a Git process when you Ctrl-C it. But I also see this same garbage out of a native Windows JVM when I Ctrl-C it from a Cygwin bash. Its just general Cygwin-ism or something.

Despite those failures I've never seen that stack dump actually
corrupt Git data.  Think about it.  Git needs to be safe on any
platform, even if the running Git program terminates unexpectedly
in the middle of an operation, such as because of an OOM from the
kernel, or an angry admin `kill -9`ing it.  So this little stack
spew is just annoying more than anything.
 
> Do I really need to reboot regularly? I don't think this is an
> option. Nowadays our Windows boxes run for months, too. I can't
> seriously tell people that they need to regularly reboot if they
> want to use git.

I *never* reboot my Windows system at day-job. Except when our local adminstration staff shoves some Microsoft uber-patch down onto our systems and that patch forces us to reboot the machine. So I never reboot for Cygwin (or Git's) sake. Ever.

Show 5 quoted lines
> Here's the list, copied from http://git.or.cz/gitwiki/WindowsInstall
> 
>    * Use git on local NTFS disks -- Network drives disks don't  
> support the filesystem semantics GIT needs; for interoperability  
> purposes you can store bare repositories on FAT32 disks.

Still true. Network drives have some issues as the SMB protocol doesn't support everything nicely. NTFS locally is fine. FAT32 has issues with mmap() not being well supported. If you must use FAT32 compile Git with NO_MMAP. Which is the default on Cygwin, as a lot of people still use FAT32.

>    * Be careful with the case in filenames. Similarly, avoid special  
> chars in filenames.

This is true. Git doesn't like getting file names with case only differences on such a platform. E.g. just today I wanted to do the following:

  git mv foo.c Foo.c
but had to instead do:
  git mv foo.c CRAP && git mv CRAP Foo.c

because the former won't work on a filesystem that ignores case. I have the same problem on my Mac OS X HFS+ volume as it also ignores case.

>    * Run git gc early and often. There are slowdowns with many  
> unpacked objects. Be careful to not create very big packfiles (bigger  
> than 2 Gb).

Both of these are still true. git-gui on Windows suggests a repack if you have ~256 loose objects, on UNIX platforms it suggest a repack at ~2048 loose objects. The problem is really just a performance issue, the more files we have to open to access data the slower things go. The loose objects tend to be the really recent stuff (that's why they aren't packed yet) and the really recent stuff tends to be what is accessed most.

Opening 200 files takes time on Windows. Its just a limitation of the OS apparently. And its a fundamental property of the Git object store that we always write to loose objects first, as its fast and easy to make safe.

Another aside to this is `git grep --cached` or `git grep ... TREE` is *always* faster for me then grepping the working directory. The first two will return nearly instantly (tiny lag) while the working directory grep will take days. On Linux and Mac OS X the exact reverse is true, the working directory grep is usually faster if the disk cache is hot.

>    * Avoid using ActiveState Perl if possible. Ask in the  
> MailingLists if you must.

Yea, we've had some issues with that. This comes from one particular user (Alex Riesen) who uses Cygwin but for strange reasons is not allowed to use the Cygwin perl and instead must only use the ActiveState Perl. We've had some issues in the past with our Perl scripts running on that perl port. Alex has fixed many of them, but some may still be lurking.

>    * Try to avoid interrupting (Ctrl-C) processes - it breaks cygwin.
Already talked about above.
Show 6 quoted lines
>    * Consider setting core.fileMode to false (git repo-config  
> core.fileMode false) if file modes are frequently the only  
> differences detected by Git. Many Windows applications make the  
> execute bit be set in Cygwin when they save a file. Besides Cygwin  
> detects file mode by stupid combination of content analysis, file  
> name extension and moon phase.

We currently default core.fileMode to false on Cygwin, for this very reason. We used to not do that. We got smarter and realized that although Cygwin itself (and all Cygwin tools) will properly handle the executable bit on NTFS native Windows tools (e.g. Eclipse) won't. Users use the native Windows tools, then blame Git. So we disable it.

>    * Insert "set CYGWIN=tty binmode" after the first line of C: 
> \cygwin\cygwin.bat, so you can use Ctrl-z in cygwin's bash to suspend  
> a program.

Oooooh. I did not know this tip. I still just cuss at Cygwin anytime I want to suspend a job and cannot.

>    * Windows usually writes end-of-line as CRLF, while Unix/POSIX  
> writes LF. This can cause a variety of problems. There are current  
> efforts to address this.

See the crlf feature in gitattributes. You can now have Git create working tree files in CRLF format, but check them into the object database with only LF.

>    * Setup binary mode for cygwin (there is an option in cygwin's  
> setup program), otherwise Cygwin mangles everything read and written  
> (Git repos have binary files in control structures).

I think binary mode is the default now on Cygwin. It used to not be. Because of this problem.

>    * Avoid big repos.

Yea, sort of. I'm using about 180M (fully packed as best as I can make Git do) and its fine. I don't know what a definition of "big" is.

>    * Avoid big blobs (very big files. Basically anything larger than  
> 10Mb is too big).

This I can't speak to. All of my blobs are source code, so they are small-ish.

>    * Avoid big trees (directories with many files in them).

Probably true. Most of my trees are reasonably well distributed (they aren't that big). I think my largest is 900 files in the same directory.

>    * Avoid deep hierarchies.

I/use/java/programs/on/windows/and/much/of/my/source/is/in/that/format. :-) I don't really have issues with deep trees, and I have some pretty darn deep source code trees.

>    * Reboot regularly (memory fragmentation)
Don't see that.
>    * Defragment often (filesystems fragmentation)

Yes! Very much so. The packfiles are the first things to fragment, and what with all of the small files that Git creates, especially with frequent branch switching, and then the small object files that my build system creates, my drive is almost always completely fragmented.

Which reminds me, I need to defrag again...
-- 
Shawn.
Previous: Steffen ProhaskaNext: Marius Storm-Olsen
Message 9 of 69 in “Windows support”
  1. Dmitry KakurinJul 25, 2007
  2. Johannes SchindelinJul 25, 2007
  3. Asger Ottar AlstrupAug 2, 2007
  4. Johannes SchindelinAug 2, 2007
  5. Steven GrimmJul 25, 2007
  6. Dmitry KakurinJul 26, 2007
  7. Shawn O. PearceJul 26, 2007
  8. Steffen ProhaskaJul 26, 2007
  9. Shawn O. PearceJul 26, 2007
  10. Marius Storm-OlsenJul 26, 2007
  11. Marius Storm-OlsenJul 26, 2007
  12. Steven GrimmJul 26, 2007
  13. Steven GrimmJul 25, 2007
  14. Nguyen Thai Ngoc DuyJul 25, 2007
  15. Johannes SchindelinJul 25, 2007
  16. Nguyen Thai Ngoc DuyJul 25, 2007
  17. Johannes SchindelinJul 25, 2007
  18. Christian MICHONJul 26, 2007
  19. Nguyen Thai Ngoc DuyJul 26, 2007
  20. Christian MICHONJul 26, 2007
  21. Nguyen Thai Ngoc DuyJul 26, 2007
  22. Johannes SixtJul 26, 2007
  23. Dmitry KakurinJul 26, 2007
  24. Junio C HamanoJul 26, 2007
  25. Shawn O. PearceJul 26, 2007
  26. Junio C HamanoJul 26, 2007
  27. Johannes SchindelinJul 26, 2007
  28. Han-Wen NienhuysJul 26, 2007
  29. Johannes SchindelinJul 26, 2007
  30. Han-Wen NienhuysJul 26, 2007
  31. Shawn O. PearceJul 26, 2007
  32. Han-Wen NienhuysJul 26, 2007
  33. Jakub NarebskiJul 26, 2007
  34. Julian PhillipsJul 26, 2007
  35. Nguyen Thai Ngoc DuyJul 26, 2007
  36. Christian MICHONJul 26, 2007
  37. Nguyen Thai Ngoc DuyJul 26, 2007
  38. Johannes SchindelinJul 26, 2007
  39. Nguyen Thai Ngoc DuyJul 26, 2007
  40. Johannes SchindelinJul 26, 2007
  41. Nguyen Thai Ngoc DuyJul 26, 2007
  42. David KastrupJul 26, 2007
  43. Nguyen Thai Ngoc DuyJul 26, 2007
  44. David KastrupJul 26, 2007
  45. Johannes SchindelinJul 26, 2007
  46. Marius Storm-OlsenJul 26, 2007
  47. Nguyen Thai Ngoc DuyJul 26, 2007
  48. Christian MICHONJul 26, 2007
  49. Robin RosenbergJul 26, 2007
  50. Johannes SixtJul 26, 2007
  51. Johannes SchindelinJul 26, 2007
  52. Dmitry KakurinJul 26, 2007
  53. Shawn O. PearceJul 26, 2007
  54. Johannes SchindelinJul 26, 2007
  55. Henning RoggeJul 26, 2007
  56. Andy ParkinsJul 26, 2007
  57. Steffen ProhaskaJul 25, 2007
  58. Noel GrandinJul 25, 2007
  59. Johannes SchindelinJul 26, 2007
  60. Junio C HamanoJul 26, 2007
  61. Stephen CuppettJul 25, 2007
  62. Russ DillJul 25, 2007
  63. Medve Emilian-EMMEDVE1Jul 25, 2007
  64. Russ DillJul 25, 2007
  65. Linus TorvaldsJul 25, 2007
  66. Wincent ColaiutaJul 25, 2007
  67. Marius Storm-OlsenJul 26, 2007
  68. Shawn O. PearceJul 26, 2007
  69. Daniel BarkalowJul 25, 2007

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.