git add .
약간의 작업이긴하지만 색인에 추가 한 모든 파일을 복구 할 수 있어야합니다 (예 :를 사용하여 상황에서 ). 색인에 파일을 추가하기 위해 git은 파일을 객체 데이터베이스에 추가합니다. 즉, 가비지 수집이 아직 발생하지 않은 한 복구 할 수 있습니다. Jakub Narębski의 답변에 제공된 방법에 대한 예가 있습니다.
그러나 테스트 저장소에서 시도해 보았고 몇 가지 문제가있었습니다. --cached
이어야하며 --cache
실제로 .git/lost-found
디렉터리를 생성하지 않았 음을 발견했습니다 . 그러나 다음 단계가 저에게 효과적이었습니다.
git fsck --cache --unreachable $(git for-each-ref --format="%(objectname)")
어떤 ref, 인덱스 또는 reflog를 통해 도달 할 수없는 개체 데이터베이스의 모든 개체를 출력해야합니다. 출력은 다음과 같습니다.
unreachable blob 907b308167f0880fb2a5c0e1614bb0c7620f9dc3
unreachable blob 72663d3adcf67548b9e0f0b2eeef62bce3d53e03
... 각 blob에 대해 다음을 수행 할 수 있습니다.
git show 907b308
파일의 내용을 출력합니다.
너무 많은 출력?
아래 sehe 의 의견 에 대한 응답으로 업데이트 :
해당 명령의 출력에 많은 커밋과 트리가 나열되어있는 경우 참조되지 않은 커밋에서 참조되는 모든 객체를 출력에서 제거 할 수 있습니다. (일반적으로 리플 로그를 통해 이러한 커밋으로 돌아갈 수 있습니다. 인덱스에 추가되었지만 커밋을 통해 찾을 수없는 객체에만 관심이 있습니다.)
먼저 다음을 사용하여 명령의 출력을 저장합니다.
git fsck --cache --unreachable $(git for-each-ref --format="%(objectname)") > all
이제 도달 할 수없는 커밋의 개체 이름은 다음을 사용하여 찾을 수 있습니다.
egrep commit all | cut -d ' ' -f 3
따라서 다음을 사용하여 인덱스에 추가되었지만 커밋되지 않은 트리와 개체 만 찾을 수 있습니다.
git fsck --cache --unreachable $(git for-each-ref --format="%(objectname)") \
$(egrep commit all | cut -d ' ' -f 3)
이는 고려해야 할 대상의 수를 엄청나게 줄여줍니다.
업데이트 : 아래의 Philip Oakley 는 고려할 개체 수를 줄이는 또 다른 방법을 제안합니다. 이는 .NET에서 가장 최근에 수정 된 파일 만 고려하는 것 .git/objects
입니다. 다음을 통해 찾을 수 있습니다.
find .git/objects/ -type f -printf '%TY-%Tm-%Td %TT %p\n' | sort
( 여기서find
호출을 찾았 습니다 .) 목록의 끝은 다음과 같습니다.
2011-08-22 11:43:43.0234896770 .git/objects/b2/1700b09c0bc0fc848f67dd751a9e4ea5b4133b
2011-09-13 07:36:37.5868133260 .git/objects/de/629830603289ef159268f443da79968360913a
이 경우 다음과 같은 개체를 볼 수 있습니다.
git show b21700b09c0bc0fc848f67dd751a9e4ea5b4133b
git show de629830603289ef159268f443da79968360913a
( /
객체 이름을 얻으려면 경로 끝에 있는를 제거해야합니다 .)