In the GitFaq I can read, that
Git sets the current time as the timestamp on every file it modifies, but only those.
However, I tried this command sequence:
$ git init test && cd test
Initialized empty Git repository in d:/test/.git/
$ touch filea fileb
$ git add .
$ git commit -m "first commit"
[master (root-commit) fcaf171] first commit
0 files changed, 0 insertions(+), 0 deletions(-)
create mode 100644 filea
create mode 100644 fileb
$ ls -l > filea
$ touch fileb -t 200912301000
$ ls -l
total 1
-rw-r--r-- 1 exxxxxxx Administ 132 Feb 12 18:36 filea
-rw-r--r-- 1 exxxxxxx Administ 0 Dec 30 10:00 fileb
$ git stat开发者_C百科us -a
warning: LF will be replaced by CRLF in filea
# On branch master
warning: LF will be replaced by CRLF in filea
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: filea
#
$ git checkout .
$ ls -l
total 0
-rw-r--r-- 1 exxxxxxx Administ 0 Feb 12 18:36 filea
-rw-r--r-- 1 exxxxxxx Administ 0 Feb 12 18:36 fileb
Why did Git change the timestamp of file fileb
? I'd expect the timestamp to be unchanged.
Are my commands causing a problem?
Maybe it is possible to do something like a git checkout . --modified
instead?
I am using git version 1.6.5.1.1367.gcd48
under MinGW and Windows XP.
This doesn't occur on a Linux filesystem. I tested the exact scenario you described and my modification times are preserved for the files I have left untouched:
sean@SEAN-PC:~/Desktop/test$ ls -la tests/BusTests.*
-r--r--r-- 1 sean sean 8 2010-02-11 11:53 tests/BusTests.c
-r--r--r-- 1 sean sean 1 2010-02-11 11:51 tests/BusTests.h
sean@SEAN-PC:~/Desktop/test$ git status -a
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: tests/BusTests.c
#
sean@SEAN-PC:~/Desktop/test$ git checkout .
sean@SEAN-PC:~/Desktop/test$ ls -la tests/BusTests.*
-r--r--r-- 1 sean sean 1 2010-02-11 11:55 tests/BusTests.c
-r--r--r-- 1 sean sean 1 2010-02-11 11:51 tests/BusTests.h
I suspect that this is an unknown bug in the MinGW build of Git. You might want to report it to the developers: http://code.google.com/p/msysgit/issues/list
It would be interesting to see if the BusTests.h modification stamp is modified when you only checkout the modified file:
git checkout -- tests/BusTests.c
git ls-files -m | xargs git co --
helps to checkout only the modified files. But I still can't explain, why git checkout
causes the problems.
I have noticed a similar problem with git reset --hard as of msysgit version 1.7.0.2. Before, it would only change timestamps of modified files. Now, it changes timestamps of all files. I went back to using 1.6.5.1 for that reason, because it doesn't have this problem :)
精彩评论