2009-06-08 4 views
29

최근 개발을 위해 사용하는 주 기계가 과열되기 시작했습니다. 나는 하루에 4 번이나 5 번 락업을하기 시작했다. 모든 것이 멈 춥니 다. 모든 프로젝트는 git을 사용하여 버전 제어하에 있습니다.Git 파일 무결성

Google에서 Linus의 이야기를보고 git이 파일이 손상되지 않았 음을 알았습니다. 내 상황에서는 소스 파일 중 하나가 손상되면 git이 경고 메시지를 표시한다고 가정하는 것이 안전합니다.

OS는 Mac OS X 10.4 파일 시스템은 HFS +입니다.

답변

36

Git이 전체 저장소를 git fsck으로 확인하도록 강제 할 수 있습니다. Git 저장소가 손상된 경우 손상되지 않은 저장소에서 새 복제본을 가져와야합니다.

정상적으로 작동되면 저장소가 읽힐 때 저장소의 일부를 확인해야하므로 손상이 발생하는 데 시간이 오래 걸릴 수 있지만 은 손상된 데이터에 처음 액세스 할 때 나타납니다.

+5

무엇 원격으로 밀어하려고하면 어떻게됩니까 : –

+5

리모컨으로 밀어 넣으면 모든 파일이 함께 정리되고받는 사람 (푸시 할 곳)은 모든 파일의 SHA1을 다시 계산해야합니다. 따라서 파일이 어떻게 든 손상된 경우 트리의 개체 ID가 일치하지 않아 손상이 표시됩니다. 이전에 있던 위치로 언제든지 롤백하고 git fsck를 사용하여 문제를 찾을 수 있습니다 . – araqnid

+5

마지막으로, 오브젝트 파일은 불변이므로 일단 작성되면 내용이 변경되지 않습니다. 발생하는 유일한 작업은 재 포장이므로, 이미 가지고있는 파일의 다른 사본을 작성하지 않으므로 밀어 넣기로 원격을 손상시킬 수 없습니다. –

9
그는, 그는 특정를 참조 할 때 (해시로 식별) 커밋 사실을 언급했다 힘내 파일이 손상되지 보장했다 때 리누스가 무엇을 의미

, 당신이 보장 것을 항상 을 것이다은 정확히 동일한 저장소 상태를 나타냅니다. Linus의 나무에서 리눅스 커널을 가져 오면 그는 ae6bcd1을 참조하고, 로컬 저장소에서도 (심지어 로컬 저장소에서도) ae6bcd1을 수행 할 수있는 것이 아무것도 없다. 리누스는 그가 그것을 언급 할 때 그것을보고 있습니다.

또한 커밋 개체는 상위 커밋 (모든)에 대한 참조를 포함하므로 커밋을 참조 할 때 DAG에서도 전체 기록을 보장합니다.

까지 파일 손상, 일종의 독립적 인 문제; 작업 트리 파일 중 하나가 손상되면 실제 BLOB 객체 (예 : .git/objects/ob/ject_hashname)가 손상되지 않고 이전 커밋 상태 또는 색인/캐시 상태에서 복원 할 수 있습니다.

강제 푸시 (리모컨의 기록을 덮어 씁니다)를하지 않는 한이 경우 리모컨을 손상시킬 수 없습니다. 푸시는 커밋 개체가 지속적인 기록 그래프를 형성하도록 보장하기 때문입니다.

for gitdir in $(sudo find/-name ".git" -type d -printf "%h "); do 
    cd $gitdir && (git fsck && echo "${gitdir} - "'HAPPY !') \ 
    || echo "${gitdir} - "'ERROR !'; 
done 
+0

기본적으로 부패한 repo를 푸시하면 경고 메시지가 표시되며 언제든지 다시 내 Repo를 복제하고 안전 할 수 있습니다. –

6

최근에 나는 다음과 같은 명령을 사용하여, 추락 서버에 REPOS을 확인했다? 부패를 알아 차리기 전에 리모컨을 손상 시키거나 불만을 제기합니까?