2009-11-22 7 views
49

git이 파일 수정을 어떻게 빨리 감지합니까?git은 파일이 수정되었음을 어떻게 감지합니까?

repo의 모든 파일을 해시하고 SHA1을 비교합니까? 이것은 많은 시간이 걸릴 것입니다, 그렇지 않습니까?

또는 atime, ctime 또는 mtime과 비교합니까?

+0

플랫폼마다 다를 수 있습니다. 나는 Git/Windows가하는 일에 특히 관심이있다. – Pacerier

답변

3

글쎄, 내가 변경된 것처럼 보이게하려고 stat() 콜의 조합을 사용하고있다는 것을 추측해야한다. 그런 다음 실제로는이 엔진을 사용하고 있는지를 확인하기 위해 실제로 묶는다.

차이점 엔진 here에 대한 코드를 통해 아이디어를 얻을 수 있습니다. 나는 상태 코드가 실제로이 코드를 호출하는지 확인하기 위해 코드베이스를 추적했다. (이것은 많은 것들처럼 보인다!) 그리고 사실이 모든 것은 Git이 Windows에서 꽤 나쁘게 수행한다는 것을 알 때 실제로 많은 의미가있다. 이러한 POSIX 유형 호출을 수행하기 위해 에뮬레이션 계층을 사용하고 있습니다. 즉, 해당 플랫폼에서 git status을 수행하는 것이 더 느립니다.

어쨌든, 위에서 아래로 모든 코드를 읽는 것이 부족합니다. (나중에 시간이 있으면 나중에 읽을 수 있습니다!) 지금까지 내가 할 수있는 한 ... 어쩌면 누군가가 더 효과적 일 수 있습니다. 코드베이스와 함께.

참고 : 명확한 의미가있는 곳에서 inline 기능을 적절하게 사용하면 속도가 빨라질 수 있습니다. 헤더에서이를 분명하게 볼 수 있습니다.

[편집 : stat()에 대한 설명 here 참조]

+0

'stat()'가 무엇인지 설명하는 데주의를 기울인다. – hasen

+0

@hansen j : stat() 맨 페이지에 대한 참조로 업데이트되었습니다. – jkp

6

이 "자식 상태"와 같은 보고서에 대한 초기에 mtime 검사가하지만 최종 계산 확약 할 때, mtimes 중요하지 않습니다 ... 그것은이다 중요한 SHA1.

+1

@Randal : 이것이 사실이라고 생각하지 않습니다. 항상 차이가 있습니다 : http://gist.github.com/240775. 'git status '에 mtime 만 사용 되었다면, 내가했던 붙여 넣기에 수정 사항을 볼 수 있습니다. – jkp

+2

@jkp 제 자신의 strace-ing은 변경되지 않은 worktree 파일들에 대해서'lstat' 만 수행한다는 것을 보여줍니다. – Tobu

2

플랫폼에 따라 Git이 상태를 파악하는 데 사용하는 syscall을 찾을 수 있어야합니다. Linux에서 , SunOS에서 truss git status 또는 Mac OS X에서 Apple Developer Tools와 함께 제공되는 DTrace 기반 도구처럼 보입니다.

28

Git은 작업 트리가 일치하는 lstat() 값만으로는 열심히 노력합니다. 왜냐하면 파일 내용을 뒤집는 것은 매우 비싸기 때문입니다.

Documentation/technical/racy-git.txt은 사용되는 stat 필드와 낮은 mtime 세분화로 인한 경쟁 조건이 발생하지 않도록하는 방법을 설명합니다. This article has some more detail.

통계 값은 변조되지 않습니다 (futimens (3) 참조). 힘내라 파일에 대한 변경 사항을 놓친 것일 수 있습니다; 콘텐츠 해시의 무결성을 손상시키지 않습니다.

+1

그러나 모든 커밋은 파일 내용으로 대체됩니까? 또는 커밋시에도 추측됩니까? – Pacerier

관련 문제