Development Tip

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

yourdevel 2020. 12. 5. 10:45
반응형

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


git은 어떻게 파일 수정을 그렇게 빨리 감지합니까?

저장소의 모든 파일을 해시하고 SHA1을 비교합니까? 시간이 많이 걸리 겠죠?

아니면 비교하면 atime, ctime또는 mtime?


Git은 lstat () 값만으로도 작업 트리가 인덱스와 일치한다는 것을 확신하기 위해 열심히 노력합니다. 파일 내용에 대한 폴백은 매우 비싸기 때문입니다.

Documentation / technical / racy-git.txt 는 어떤 stat 필드가 사용되는지, 그리고 낮은 mtime 세분성으로 인한 경쟁 조건을 피하는 방법을 설명합니다. 이 기사에는 좀 더 자세한 내용이 있습니다.

통계 값은 변조가 불가능합니다. futimens (3)를 참조하십시오. Git은 파일에 대한 변경 사항을 누락하도록 속일 수 있습니다. 콘텐츠 해싱의 무결성을 손상시키지 않습니다.


"git status"와 같은 보고서에 대한 초기 mtime 검사가 있지만 최종 커밋이 계산 될 때 mtimes는 중요하지 않습니다. 중요한 것은 SHA1입니다.


글쎄, 나는 stat()그것이 변경된 것처럼 보이는 것을 해결하기 위해 호출 조합을 사용하고 있다는 추측을 위험에 빠뜨린 다음 실제로 이것이 사실이라는 것을 비교 엔진을 사용하여 확인하기 위해 묶습니다.

여기 에서 diff 엔진에 대한 코드를 볼 수 있습니다 . 나는 상태 명령이 실제로이 코드를 호출하는지 확인하기 위해 코드베이스를 추적했고 (많은 것들이하는 것처럼 보인다!) 실제로이 모든 것은 Git이 Windows에서 매우 나쁘게 수행된다는 것을 알고있을 때 많은 의미가 있습니다. 이러한 POSIX 유형 호출을 수행하기 위해 에뮬레이션 계층을 사용 git status하고 있습니다. 해당 플랫폼 에서 수행하는 것이 훨씬 느립니다 .

어쨌든, 위에서 아래로 모든 코드를 읽는 것보다 (나중에 시간이 있으면 나중에 할 수 있습니다!) 지금 당장은 당신을 데려 갈 수 있습니다.

참고 : 또 다른 가능한 속도 향상은 inline명확하게 이해할 수있는 기능의 신중한 사용에서 비롯됩니다 . 헤더에서이를 명확하게 볼 수 있습니다.

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


플랫폼에 따라 Git이 상태를 파악하기 위해 사용하는 syscall을 찾을 수 있어야합니다. strace git statusLinux, truss git statusSunOS 또는 Apple이 Mac OS X에서 개발자 도구와 함께 제공하는 DTrace 기반 도구를 사용해보십시오 .

참고 URL : https://stackoverflow.com/questions/1778862/how-does-git-detect-that-a-file-has-been-modified

반응형