GIT 오류를 수정하는 방법 : 개체 파일이 비어 있습니까?


443

변경 사항을 커밋하려고하면 다음 오류가 발생합니다.

error: object file .git/objects/31/65329bb680e30595f242b7c4d8406ca63eeab0 is empty
fatal: loose object 3165329bb680e30595f242b7c4d8406ca63eeab0 (stored in .git/objects/31/65329bb680e30595f242b7c4d8406ca63eeab0) is corrupt

이 오류를 해결하는 방법을 알고 있습니까?

편집하다

나는 git fsck내가 가지고 시도했다 :

error: object file .git/objects/03/dfd60a4809a3ba7023cbf098eb322d08630b71 is empty
fatal: loose object 03dfd60a4809a3ba7023cbf098eb322d08630b71 (stored in .git/objects/03/dfd60a4809a3ba7023cbf098eb322d08630b71) is corrupt

git add작전 을 강제 종료 했습니까 ? 하드 디스크가 꽉 찼습니까?
cdhowie

아니요, 내 하드 디스크가 꽉 찼습니다. git add 작업을 강제로 종료했다는 것을 기억하지 않습니다. 어떻게 해결할 수 있습니까?
simo

아니, 오류는 여전히 존재합니다 ...
simo

2
이 저장소가 원격 저장소에 있으면 해당 파일을 원격 저장소에있는 경우 해당 파일을 로컬 저장소로 복사 할 수 있습니다.
Attila Szeremi

2
.git 디렉토리의 권한이 어떻게 든 망가졌고 읽기 권한이 없을 때이 오류가 발생했습니다. 따라서 파일이 비어 있지 않지만 쓸 수없는 경우에 발생할 수 있습니다. 권한 수정 및 실행으로 git fsck처리했습니다.
Jake Anderson

답변:


900

나는 비슷한 문제가 있었다. 자식 작업 중에 랩톱의 배터리가 부족합니다. 우우.

나는 백업이 없었다. (NB Ubuntu One은 git의 백업 솔루션이 아니며 손상된 저장소로 정상 저장소를 덮어 쓰는 데 도움이됩니다.)

자식 마법사 에게이 문제를 해결하는 나쁜 방법이라면 의견을 남겨주세요. 그러나 그것은 적어도 일시적으로 나를 위해 일했습니다.

1 단계 : .git 백업 (실제로 변경하는 모든 단계 사이에 .git-old-1, .git-old-2 등의 새로운 복사 대상 이름으로 수행) :

cp -a .git .git-old

2 단계 : 실행 git fsck --full

nathanvan@nathanvan-N61Jq:~/workspace/mcmc-chapter$ git fsck --full
error: object file .git/objects/8b/61d0135d3195966b443f6c73fb68466264c68e is empty
fatal: loose object 8b61d0135d3195966b443f6c73fb68466264c68e (stored in .git/objects/8b/61d0135d3195966b443f6c73fb68466264c68e) is corrupt

3 단계 : 빈 파일을 제거합니다. 나는 도대체 무엇을 알아 냈다; 어쨌든 그것의 공백.

nathanvan@nathanvan-N61Jq:~/workspace/mcmc-chapter$ rm .git/objects/8b/61d0135d3195966b443f6c73fb68466264c68e 
rm: remove write-protected regular empty file `.git/objects/8b/61d0135d3195966b443f6c73fb68466264c68e'? y

3 단계 : git fsck다시 실행 빈 파일을 계속 삭제하십시오. 디렉토리 cd로 들어가서 빈 파일을 모두 제거 할 수도 있습니다. 결국 git은 실제로 객체 디렉토리로 무언가를하고 있다고 말하기 시작했습니다..gitfind . -type f -empty -delete -print

nathanvan@nathanvan-N61Jq:~/workspace/mcmc-chapter$ git fsck --full
Checking object directories: 100% (256/256), done.
error: object file .git/objects/e0/cbccee33aea970f4887194047141f79a363636 is empty
fatal: loose object e0cbccee33aea970f4887194047141f79a363636 (stored in .git/objects/e0/cbccee33aea970f4887194047141f79a363636) is corrupt

4 단계 : 빈 파일을 모두 삭제 한 후 결국 git fsck실제로 실행되었습니다.

nathanvan@nathanvan-N61Jq:~/workspace/mcmc-chapter$ git fsck --full
Checking object directories: 100% (256/256), done.
error: HEAD: invalid sha1 pointer af9fc0c5939eee40f6be2ed66381d74ec2be895f
error: refs/heads/master does not point to a valid object!
error: refs/heads/master.u1conflict does not point to a valid object!
error: 0e31469d372551bb2f51a186fa32795e39f94d5c: invalid sha1 pointer in cache-tree
dangling blob 03511c9868b5dbac4ef1343956776ac508c7c2a2
missing blob 8b61d0135d3195966b443f6c73fb68466264c68e
missing blob e89896b1282fbae6cf046bf21b62dd275aaa32f4
dangling blob dd09f7f1f033632b7ef90876d6802f5b5fede79a
missing blob caab8e3d18f2b8c8947f79af7885cdeeeae192fd
missing blob e4cf65ddf80338d50ecd4abcf1caf1de3127c229

5 단계 : 시도해보십시오 git reflog. 내 머리가 부러 졌기 때문에 실패했습니다.

nathanvan@nathanvan-N61Jq:~/workspace/mcmc-chapter$ git reflog
fatal: bad object HEAD

6 단계 : Google 이것을 찾으십시오 . reflog의 마지막 두 줄을 수동으로 가져옵니다.

nathanvan@nathanvan-N61Jq:~/workspace/mcmc-chapter$ tail -n 2 .git/logs/refs/heads/master
f2d4c4868ec7719317a8fce9dc18c4f2e00ede04 9f0abf890b113a287e10d56b66dbab66adc1662d Nathan VanHoudnos <nathanvan@gmail.com> 1347306977 -0400  commit: up to p. 24, including correcting spelling of my name
9f0abf890b113a287e10d56b66dbab66adc1662d af9fc0c5939eee40f6be2ed66381d74ec2be895f Nathan VanHoudnos <nathanvan@gmail.com> 1347358589 -0400  commit: fixed up to page 28

7 단계 : 6 단계에서 HEAD가 현재 마지막 커밋을 가리키고 있음을 알았습니다. 부모 커밋을 살펴 보자.

nathanvan@nathanvan-N61Jq:~/workspace/mcmc-chapter$ git show 9f0abf890b113a287e10d56b66dbab66adc1662d
commit 9f0abf890b113a287e10d56b66dbab66adc1662d
Author: Nathan VanHoudnos <nathanvan@XXXXXX>
Date:   Mon Sep 10 15:56:17 2012 -0400

    up to p. 24, including correcting spelling of my name

diff --git a/tex/MCMC-in-IRT.tex b/tex/MCMC-in-IRT.tex
index 86e67a1..b860686 100644
--- a/tex/MCMC-in-IRT.tex
+++ b/tex/MCMC-in-IRT.tex

효과가 있었다!

8 단계 : 이제 HEAD가 9f0abf890b113a287e10d56b66dbab66adc1662d를 가리켜 야합니다.

nathanvan@nathanvan-N61Jq:~/workspace/mcmc-chapter$ git update-ref HEAD 9f0abf890b113a287e10d56b66dbab66adc1662d

불평하지 않았다.

9 단계 : fsck의 내용을 확인하십시오.

nathanvan@nathanvan-N61Jq:~/workspace/mcmc-chapter$ git fsck --full
Checking object directories: 100% (256/256), done.
error: refs/heads/master.u1conflict does not point to a valid object!
error: 0e31469d372551bb2f51a186fa32795e39f94d5c: invalid sha1 pointer in cache-tree
dangling blob 03511c9868b5dbac4ef1343956776ac508c7c2a2
missing blob 8b61d0135d3195966b443f6c73fb68466264c68e
missing blob e89896b1282fbae6cf046bf21b62dd275aaa32f4
dangling blob dd09f7f1f033632b7ef90876d6802f5b5fede79a
missing blob caab8e3d18f2b8c8947f79af7885cdeeeae192fd
missing blob e4cf65ddf80338d50ecd4abcf1caf1de3127c229

10 단계 : 캐시 트리의 잘못된 sha1 포인터가 (현재 오래된) 인덱스 파일 ( source ) 에서 온 것 같습니다 . 그래서 나는 그것을 죽이고 repo를 재설정했습니다.

nathanvan@nathanvan-N61Jq:~/workspace/mcmc-chapter$ rm .git/index
nathanvan@nathanvan-N61Jq:~/workspace/mcmc-chapter$ git reset
Unstaged changes after reset:
M   tex/MCMC-in-IRT.tex
M   tex/recipe-example/build-example-plots.R
M   tex/recipe-example/build-failure-plots.R

11 단계 : fsck를 다시보고 ...

nathanvan@nathanvan-N61Jq:~/workspace/mcmc-chapter$ git fsck --full
Checking object directories: 100% (256/256), done.
error: refs/heads/master.u1conflict does not point to a valid object!
dangling blob 03511c9868b5dbac4ef1343956776ac508c7c2a2
dangling blob dd09f7f1f033632b7ef90876d6802f5b5fede79a

매달려 모양에 오류가 없습니다 . master.u1conflict에 관심이 없으며 이제 작동하므로 더 이상 만지고 싶지 않습니다!

12 단계 : 로컬 편집 내용 확인 :

nathanvan@nathanvan-N61Jq:~/workspace/mcmc-chapter$ git status
# On branch master
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   tex/MCMC-in-IRT.tex
#   modified:   tex/recipe-example/build-example-plots.R
#   modified:   tex/recipe-example/build-failure-plots.R
#
< ... snip ... >
no changes added to commit (use "git add" and/or "git commit -a")


nathanvan@nathanvan-N61Jq:~/workspace/mcmc-chapter$ git commit -a -m "recovering from the git fiasco"
[master 7922876] recovering from the git fiasco
 3 files changed, 12 insertions(+), 94 deletions(-)

nathanvan@nathanvan-N61Jq:~/workspace/mcmc-chapter$ git add tex/sept2012_code/example-code-testing.R
nathanvan@nathanvan-N61Jq:~/workspace/mcmc-chapter$ git commit -a -m "adding in the example code"
[master 385c023] adding in the example code
 1 file changed, 331 insertions(+)
 create mode 100644 tex/sept2012_code/example-code-testing.R

따라서 앞으로는 사람들에게 유용하게 사용될 수 있기를 바랍니다. 다행 이네요.


86
모든 단계와 함께 훌륭한 답변. 나는 당신이 나를 각각 인터넷 검색에서 구했다고 가정합니다!
Zlatko

24
매력처럼 일했다! 나는 이것을 여러 번
공표

1
흠, 내 노트북은 git 작업 (SparkleShare가 죽어 메모를 커밋하려고 시도 중)과 그 후에 리포지토리가 손상되었습니다. 나는 6 단계까지 당신의 단계를 따랐지만 마지막 몇 개의 커밋이 실제로 내가 삭제 한 빈 객체 파일의 일부로 간주 된 것처럼 보입니까? 사실 마지막 3 개의 커밋은 기본적으로 완전히 중단되었으므로 할 수있는 것이 없었습니다. 운 좋게도 실제로 SparkleShare의 개별 커밋이 필요하지 않으며 더러운 파일을 한 시스템에서 다른 시스템으로 복사하여 병합 할 수 있습니다.
이브라힘

14
대단하고 멋진 답변입니다. 각 단계마다 당신의 추론을 포함시켜 주셔서 감사합니다. 내 레포를 저장했습니다! (글쎄, 여전히 fsck에서 'refs / heads / master에 대한 나쁜 심판'오류가 있지만 상대적으로 가볍습니다.)
Jon Carter

3
고마워, 나는 git 기능에 대해 많이 배웠고 중요한 커밋에 베이컨을 절약했습니다! 우연히도 그것은 노트북의 배터리 부족 때문이었습니다.
HarbyUK

197

git 객체 파일이 손상되었습니다 (다른 답변에서도 지적했듯이). 이것은 기계 충돌 등에서 발생할 수 있습니다.

나는 같은 것을했다. 여기에 다른 상위 답변을 읽은 후 다음 명령을 사용하여 손상된 git 저장소를 수정하는 가장 빠른 방법을 찾았습니다 ( .git폴더 가 포함 된 git 작업 디렉토리에서 실행 ).

(git 저장소 폴더를 먼저 백업하십시오!)

find .git/objects/ -type f -empty | xargs rm
git fetch -p
git fsck --full

먼저 저장소 전체를 손상시키는 빈 오브젝트 파일제거한 다음 원격 저장소에서 누락 된 오브젝트 (최신 변경 사항) 를 페치 한 다음 전체 오브젝트 저장소 확인 을 수행합니다 . 이 시점에서 오류없이 성공해야합니다 (여전히 경고가있을 수 있습니다!)

추신. 이 답변은 git 저장소의 원격 사본이 어딘가에 있고 (예 : GitHub에서) 깨진 저장소는 원격 저장소에 연결된 로컬 저장소이며 여전히 유효합니다. 그렇지 않은 경우 권장하는 방식으로 수정하지 마십시오.


이것에 감사드립니다, 나는 종교적으로 내 원격 지점으로 밀고 당신의 해결책은 나를 위해 일했습니다. 먼저 @mCorr을 시도했지만 새 파일을 커밋 한 후 repo가 ​​다시 손상되었습니다. 이 접근법은 그것을 해결했다
mr_than September

대부분의 리모컨이 있습니다. 이 솔루션은 정말 깨끗하고 충분합니다.
jackOfAll

7
git repo로 작업하고있는 VM을 종료 한 후이 문제가 발생했습니다. 이 솔루션은 완벽하게 작동했습니다.
Giscard Biamby

훌륭하고 컴팩트 한 솔루션 인 Martin에게 감사합니다. 순진한 사용자가 로컬 설정에서 동일하게 시도하지 못하도록 경고를 굵게 표시하여 PS를 먼저 넣을 수도 있습니다. Giscard와 마찬가지로 VM을 종료 할 때마다 발생합니다 ... 매번 수행하는 것보다 더 영구적 인 해결책을 찾으면 업데이트됩니다.
thclark

2
VM이 호감 내 로컬 자식의 repo aswell 이런 짓을,이 솔루션은 100 % 그 경우에 작동하는지 확인 할 수 있습니다
Amin.T

35

이 오류는 커밋을 푸시하고 컴퓨터가 멈출 때 발생합니다. 이것이 내가 고친 방법입니다.


해결 단계

git status

비어 있거나 손상된 객체 파일 표시

rm .git/objects/08/3834cb34d155e67a8930604d57d3d302d7ec12

그것을 제거

git status

나는 fatal: bad object HEAD메시지를 받았다

rm .git/index

index재설정을 위해를 제거합니다

git reset

치명적 : 개체 'HEAD'을 (를) 구문 분석 할 수 없습니다.

git status
git pull

무슨 일이 일어나고 있는지 확인하기 위해

tail -n 2 .git/logs/refs/heads/MY-CURRENT-BRANCH

tail -n 2로그 분기 의 마지막 두 줄 을 인쇄하여 마지막 2 줄 을 표시합니다.commit hash

git update-ref HEAD 7221fa02cb627470db163826da4265609aba47b2

나는 마지막을 선택 commit hash

git status

파일을 deleted제거했기 때문에 모든 파일을 표시 .git/index합니다.

git reset

재설정을 계속

git status

내 수정 사항 확인


참고 : 이 질문에 착륙하고 답변을 참조로 사용하면 단계가 시작됩니다.


34

git fsck가 감지 한 다양한 빈 파일을 제거한 다음 간단한 git pull을 실행하여이를 해결했습니다.

파일 시스템조차도 fs sane을 유지하기 위해 저널링 및 기타 "트랜잭션"기술을 구현 했으므로 git은 정전이나 장치 공간으로 인해 손상된 상태가 될 수 있습니다 (자체적으로 복구 할 수 없음).


3
위의 답변이 기술적으로 더 낫다고 확신하지만 6 단계에서 작업을 중단하고 기술적으로 내 머리 위로 올라갔습니다. 편법 접근 방식은 자식 끌어 오기
mblackwell8

2
Nathan의 답변 (1)에서 1 ~ 11 단계를 수행 한 후 refs / origin / master 및 refs / origin / head가 정의되지 않았다는 오류가 발생했습니다 (또는 그). 자식 풀 고정. 그래서 두 솔루션이 함께 작동한다고 생각합니다.
bchurchill

2
사용 된 파일 시스템은 일반적으로 메타 데이터 만 저널링한다는 것을 알고 있습니다. 데이터 저널링을 켤 수도 있지만 오버 헤드 (?)로 인해 기본값이 아닌 것 같습니다. 아마도 파일이 비어있는 이유 일 것입니다 .... 파일 시스템은 일반적으로 파일 당 트랜잭션을 관찰하지만 git에는 여러 파일이 수정됩니다 트랜잭션마다, 따라서 fs가 파일마다 일관성을 유지하더라도 git이 그렇지 않으면 git이 일치하지 않는 상태를 초래할 것으로 생각합니다 ...
Heartinpiece

이 답변은 저에게 효과적이며 다른 사람들은 복잡합니다.
ldog

1
허용 된 답변보다 훨씬 빠른 솔루션. 지금까지 스크롤 한 모든 사람에게 서두르면이 답변을 따르십시오.
스리 하샤 카 팔라

9

방금 똑같은 문제가 발생했습니다. 원격 저장소를 가져온 후 git 상태를 수행했을 때 "오류 : 객체 파일 (...)이 비어 있습니다" "치명적인 : 느슨한 객체 (...)가 손상되었습니다"

내가 이것을 해결하는 방법은 다음과 같습니다.

  1. 자식 숨김
  2. 오류가있는 git 파일 제거 (필요하지 않음)
  3. 자식 숨김

나는 무슨 일이 일어 났는지 정확히 알지 못하지만 그 지침은 모든 것을 깨끗하게하는 것처럼 보였습니다.


2
나는 항상 더 간단한 답변을 좋아합니다 :) 여기 2 단계에서 @Nathan VanHoudnos의 답변에 제공된 명령을 사용했습니다 :cd .git/ && find . -type f -empty -delete
mopo922

8

VM을 정기적으로 재부팅해야하므로이 문제는 매우 자주 발생합니다. 그것의 몇 번 후에, 나는 그것이 항상 작동하지만, 이것이 일어날 때마다 @ Nathan-Vanhoudnos가 묘사 한 과정을 반복 할 수 없다는 것을 깨달았습니다. 그런 다음 다음과 같은 더 빠른 솔루션을 찾았습니다.

1 단계

전체 저장소를 다른 폴더로 이동하십시오.

mv current_repo temp_repo

2 단계

리포지를 원점에서 다시 복제하십시오.

git clone source_to_current_repo.git

3 단계

.git 폴더를 제외한 새 저장소 아래의 모든 항목 을 제거하십시오 .

4 단계

.git 폴더를 제외한 모든 것을 temp_repo 에서 새 저장소로 이동 하십시오 .

5 단계

temp_repo를 제거하면 완료됩니다.

몇 번이 지나면이 절차를 매우 빠르게 수행 할 수 있습니다.


2
또는 현재 리포지토리를 이동하지 마십시오. 1) 새 클론 생성 git clone source_to_current_repo.git clean_repo, 2) 이전 .git 폴더 백업, 3) 깨끗한 .git 폴더 위에 복사하십시오.
moi

네 말이 맞아 나는 이미 그것을했다. 나중에 답변을 편집합니다.
haoqiang

@haoqiang : 당신은 "내 VM을 정기적으로 재부팅해야하기 때문에이 문제는 매우 자주 발생합니다."라고 썼습니다. 우리도 같은 경험을합니다. 근본 원인-VM 설정에서 문제가 덜 자주 발생하도록 진행했습니까?
hansfn

6
  1. mv 폴더 응용 프로그램 백업, 즉 mv app_folder app_folder_bk ( git stash 와 같습니다 )
  2. 자식 복제 your_repository
  3. 드디어,. 병합 도구 (meld diff viewer linux 또는 Winmerge Windows 사용)를 열고 오른쪽 ( app_folder_bk )에서 왼쪽 (new app_folder )으로 변경 사항을 복사하십시오 ( git stash apply 와 같습니다 ).

그게 다야. 어쩌면 그것이 가장 좋은 방법은 아니지만 그렇게 실용적이라고 생각합니다.


1
모든 로컬 변경 사항을 업스트림으로 푸시하거나 변경 사항이 최소화되어 복제가 복구보다 빠를 때 수행해야합니다.
mu 無

3

필자의 경우 커밋 메시지를 입력하고 노트북이 꺼 졌기 때문에이 오류가 발생했습니다.

오류를 해결하기 위해 다음 단계를 수행했습니다.

  • git checkout -b backup-branch # 백업 브랜치 생성
  • git reset --hard HEAD~4# 모든 것이 잘 작동하는 커밋으로 재설정하십시오. 필자의 경우, 커밋 메시지를 입력하기 전까지 머릿속에 4 개의 커밋을 백업해야했다. 이 단계를 수행하기 전에 재설정 할 커밋의 해시를 복사하십시오. 제 경우에는 4 개의 마지막 커밋의 해시를 복사했습니다.
  • git cherry-pick <commit-hash> # Cherry는 이전 브랜치에서 새 브랜치로 재설정 된 커밋을 선택합니다 (제 경우에는 4 개의 커밋이므로이 단계를 4 번 수행했습니다).
  • git push origin backup-branch # 새로운 지점을 밀어 모든 것이 잘 작동하는지 확인하십시오
  • git branch -D your-branch # 지점을 로컬로 삭제합니다 ( 'your-branch'는 문제가있는 지점입니다)
  • git push origin :your-branch # 리모컨에서 지점 삭제
  • git branch -m backup-branch your-branch # 문제가 발생한 지점의 이름을 갖도록 백업 지점의 이름을 바꿉니다.
  • git push origin your-branch # 새로운 지점을 밀어
  • git push origin :backup-branch # 원격에서 백업 브랜치를 삭제

3
git stash
git checkout master
cd .git/ && find . -type f -empty -delete
git branch your-branch-name -D
git checkout -b your-branch-name
git stash pop

내 문제를 해결


도움이되었습니다. 감사합니다.
swateek

저장소가 깨끗하면 "cd .git / && find. -type f -empty -delete && cd-&& git pull" git status만 있으면됩니다. 일부 파일 이 비어 있기 때문에 일부 파일을 체크 아웃해야 할 수도 있습니다 .
CodyChan

2

다음은이 문제를 해결하기 위해 정말 간단하고 빠른 방법입니다 경우 당신은 당신이 필요로하는 모든 지점과 커밋과 지역의 repo을, 그리고 새로운 REPO를 작성 (또는 서버의 REPO을 삭제하고 새로운 하나를 만들어 나왔습니다 OK는 경우 그 자리에) :

  1. 서버에서 비어있는 새 저장소를 작성하십시오 (또는 이전 저장소를 삭제하고 대신 새 저장소를 작성하십시오).
  2. 새 사본의 원격 URL을 가리 키도록 로컬 사본의 원격 URL을 변경하십시오.
  3. 로컬 리포지토리의 모든 지점을 새 서버 리포지토리로 푸시하십시오.

이렇게하면 로컬 리포지토리에있는 모든 커밋 기록 및 분기가 유지됩니다.

리포지토리에 공동 작업자가있는 경우 많은 공동 작업자가 로컬 리포지토리의 원격 URL을 변경하고 서버에없는 커밋을 선택적으로 푸시하면됩니다.

이 솔루션은 동일한 문제가 발생했을 때 효과적이었습니다. 공동 작업자가 한 명있었습니다. 로컬 리포지토리를 새 원격 리포지토리로 푸시 한 후 원격 리포지토리 URL을 가리 키도록 로컬 리포지토리를 변경하면 모든 것이 제대로 작동했습니다.


2

모든 관련 변경 사항이 이미 적용된 리모컨이 있다고 가정합니다. 로컬 변경 사항에 신경 쓰지 않고 단순히 큰 리포지토리를 삭제하고 복제하지 않기를 원했습니다. 중요한 로컬 변경 사항이있는 경우 더주의해야합니다.

노트북이 고장난 후에도 같은 문제가있었습니다. 아마도 그것은 큰 저장소이기 때문에 호출 할 때 한 번에 하나씩 만 손상된 객체 파일이 상당히 많았 기 때문에 git fsck --full작은 쉘 하나의 라이너를 작성하여 그중 하나를 자동으로 삭제했습니다.

$ sudo rm `git fsck --full 2>&1 | grep -oE -m 1 ".git/objects/[0-9a-f]{2}/[0-9a-f]*"`

  • 2>&1 grep 할 수 있도록 오류 메시지를 stdout으로 리디렉션합니다.
  • 사용 된 grep 옵션 :
    • -o 실제로 일치하는 줄의 일부만 반환
    • -E 고급 정규식 사용
    • -m 1 첫 번째 경기 만 반환해야합니다
    • [0-9a-f]{2} 0과 9 사이의 문자 중 하나와 a와 f 중 하나가 일치하면
    • [0-9a-f]* 0에서 9 사이의 문자 수와 a와 f가 함께 발생합니다.

여전히 한 번에 하나의 파일 만 삭제하므로 다음과 같은 루프에서 파일을 호출 할 수 있습니다.

$ while true; do sudo rm `git fsck --full 2>&1 | grep -oE -m 1 ".git/objects/[0-9a-f]{2}/[0-9a-f]*"`; done

이것의 문제는 더 이상 유용한 것을 출력하지 않으므로 완료 시점을 알 수 없다는 것입니다 (시간이 지나면 유용한 것을해서는 안됩니다)

이것을 "수정"하기 위해 git fsck --full각 라운드 후에 다음과 같이 전화를 추가했습니다 . $ while true; do sudo rm `git fsck --full 2>&1 | grep -oE -m 1 ".git/objects/[0-9a-f]{2}/[0-9a-f]*"`; git fsck --full; done

이제는 절반 정도 빠르지 만 "상태"로 출력합니다.

이 나는 점에이 글의 제안을 일부 놀았 마침내 도착 후 어디 수 git stashgit stash drop깨진 물건을 많이.

첫 번째 문제 해결

그 후에도 여전히 다음과 같은 문제 unable to resolve reference 'refs/remotes/origin/$branch': reference broken가있었습니다. $ rm \repo.git\refs\remotes\origin\$branch

$ git fetch

그런 다음 $ git gc --prune=now

$ git remote prune origin

좋은 측정과

git reflog expire --stale-fix --all

error: HEAD: invalid reflog entry $blubb실행할 때 제거하십시오 git fsck --full.


2

간단하게 봅시다. 소스를 원격 git repo에 업로드 한 경우에만

  1. .git 백업
  2. 자식 확인

    git fsck --full
    
  3. 빈 객체 파일 제거 (모두)

    rm .git/objects/8b/61d0135d3195966b443f6c73fb68466264c68e
    
  4. 자식을 다시 확인하십시오.

    git fsck --full
    
  5. 원격 자식에서 소스를 당겨

    git pull origin master
    

2

가상 머신 에서이 문제가 많이 발생합니다.

나를 위해 다음과 같은 작품 :

cd /path/to/your/project
rm -rf .git

직접 다운로드를 저장하려면 파일 탐색기로 이동하여 이미 커밋 된 폴더의 모든 파일을 삭제하고 / vendor 및 / node_modules (나는 composer 및 npm으로 작업) 폴더에 남겨 둡니다.

그런 다음 새로운 저장소를 만드십시오.

git init

리모컨 추가

git remote add origin ssh://git@github.com/YourUsername/repoName.git

지점을 가져 오십시오.

git fetch origin somebranch

그리고 그것을 확인

git checkout somebranch

그런 다음 오류가 발생하기 전에 있어야합니다.

도움이 되었기를 바랍니다.

문안 인사.


1

같은 문제가 발생하여 매우 간단한 방법으로 문제를 해결합니다. 누락 된 파일이 팀원의 컴퓨터에있는 것으로 나타났습니다.

나는 그 파일 들을 git 서버 에 하나씩 복사 했고 (총 9 개의 파일) 문제를 해결했다.


1

내 동료들과 나는이 같은 문제로 여러 번 교차했으며 그것을 해결하기 위해 아래에서 설명하는 단계를 간단히 수행합니다. 가장 우아한 솔루션은 아니지만 데이터 손실없이 작동합니다.

  1. 현재 작업 디렉토리의 이름을 바꾸십시오. ( old_project이 예에서는).
  2. 을 사용하여 새 디렉토리 내에서 저장소를 복제하십시오 git clone.
  3. 명령 행에서 작업 디렉토리를 새로 작성된 프로젝트로 변경하고 작업중인 브랜치로 전환하십시오.
  4. 디렉토리를 old_project제외한 모든 파일과 디렉토리 .git를 새로 작성된 프로젝트 디렉토리에 복사하십시오 .
  5. 작업 트리 상태를 확인하고 (예상보다 많은 변경 사항이 있음) 변경 사항을 커밋하십시오.

도움이되기를 바랍니다 ...


1

github.com의 공개 리포지토리가 작동하지만 로컬 리포지토리가 손상된 경우 문제를 해결하는 방법은 다음과 같습니다. 로컬 리포지토리에서 수행 한 커밋을 모두 해제합니다.

좋아, 로컬에 하나의 object empty error리포지토리가 있고 github.com에 동일한 리포지토리가 있지만이 오류는 없습니다. 그래서 내가 단순히 한 일은 github에서 작동하는 저장소를 복제 한 다음 손상된 저장소 (.git 폴더 제외)의 모든 것을 복사하고 작동하는 복제 된 저장소에 붙여 넣는 것입니다.

이것은 로컬 커밋을 삭제하기 때문에 실용적인 해결책이 아닐 수도 있지만 코드와 복구 된 버전 제어는 유지 관리합니다.

이 방법을 적용하기 전에 백업해야합니다.


1

제 경우에는 지역 커밋 기록을 유지하는 것이 중요하지 않았습니다. 따라서 그것이 당신에게도 적용된다면, 위의 해결책에 대한 빠른 대안으로 이것을 할 수 있습니다 :

기본적으로 손상된 .git/디렉토리를 깨끗한 디렉토리로 바꿉니다 .

손상된 자식이있는 프로젝트의 다음 디렉토리를 가정하십시오. projects/corrupt_git/

  1. cp projects/corrupt_git projects/backup -(선택 사항) 백업합니다
  2. git clone [repo URL] projects/clean_git -당신이 얻을 수 있도록 projects/clean_git
  3. rm -rf corrupt_git/.git/ -손상된 .git 폴더를 제거
  4. mv clean_git/.git/ corrupt_git/ -깨끗한 자식을 corrupt_git/.git
  5. git status에서 projects/corrupt_git-작동하는지 확인

0

.git가 포함 된 폴더에있는 모든 것을 백업에 복사 한 다음 모든 것을 삭제하고 다시 시작하십시오. git remote를 편리하게 사용하십시오.

git remote -v
 origin git@github.com:rwldrn/idiomatic.js.git (fetch)
 origin git@github.com:rwldrn/idiomatic.js.git (push)

그때

mkdir mygitfolder.backup
cp mygitfolder/* mygitfolder.backup/
cd mygitfolder
rm -r * .git*
git init
git remote add origin git@github.com:rwldrn/idiomatic.js.git

그런 다음 새 파일을 수동으로 병합하고 컴퓨터 전원을 켜 두십시오.


rm -rf * 는 매우 나쁜 결과를 초래할 수 있습니다. 당신은 정말로 그것을 의미 했습니까?
tommyk

@tommyk 따라서 백업에 먼저 사본. 힘이 필요하지 않은 것 같습니다.
Shelvacu

0

클린 브랜치에서 마스터를 체크 아웃 한 후에도 같은 문제가있었습니다. 잠시 후 나는 마스터에서 많은 수정 된 파일을 인식했습니다. 깨끗한 지점에서 전환 한 후 왜 그들이 거기에 있었는지 모르겠습니다. 어쨌든 수정 된 파일이 이해가되지 않기 때문에 파일을 숨기고 오류가 사라졌습니다.

git:(master) git stash


0

OLD 백업이 있고 급한 경우 :

현재의 git-broken 프로젝트 경로를 새로 백업하십시오.

  1. .git휴지통으로 이동 (삭제하지 않음)
  2. .gitOLD 백업에서 복사
  3. git pull (병합 충돌을 일으킴)
  4. 모든 소스 (git에 넣은 모든 것)를 휴지통으로 옮기십시오 : ./src (삭제하지 마십시오)
  5. . 새로운 백업에서 모든 소스 (git에 넣은 모든 것)를 복사하십시오.
  6. 의 모든 "병합"을 수락하고 git gui밀고 ... 박수를칩니다!

0

위에서 다룬 12 단계 솔루션은 용지 걸림을 해결하는 데 도움이되었습니다. 감사. 핵심 단계는 다음과 같습니다.

git fsck --full 

빈 개체를 모두 제거하십시오.

rm .git/objects/...

그런 다음 flog의 두 줄을 가져옵니다.

tail -n 2 .git/logs/refs/heads/master

반환 값으로

git update-ref HEAD ...

이 시점에서 더 이상 오류가 없으므로 가장 최근 파일을 백업했습니다. 그런 다음 git pull과 git push를 차례로 수행하십시오. 백업을 내 git 저장소 파일에 복사하고 다른 git push를 수행했습니다. 그것은 나를 최신 상태로 만들었다.


0

내 자식 오류를 수정했습니다. 개체 파일이 비어 있습니다.

  1. 마지막으로 커밋 / 푸시 한 이후 편집 한 모든 파일의 사본을 저장
  2. 리포지토리 제거 및 다시 복제
  3. 이전 파일을 편집 한 파일로 바꿉니다.

이것이 도움이되기를 바랍니다.


0

이것은 나에게 거의 정기적으로 발생합니다. 이것이 정확히 일어날 때 프로토콜을 만들지 않았지만 가상 머신이 "예기치 않게"존재할 때마다 프로토콜이 의심됩니다. VM 창을 닫고 (Ubuntu 18.04를 사용하고 있음) 다시 시작하면 항상 작동합니다 (?). 그러나 랩톱을 종료 할 때 VM 창이 여전히 열려 있으면 (Windows 호스트 시스템)이 문제가 자주 발생합니다.

여기에 주어진 모든 답변에 관해서 :

  1. 감사합니다-그들은 매우 유용합니다. 일반적으로 코드의 로컬 사본을 저장하고 원격에서 저장소를 복원 한 다음 백업 사본을 로컬 폴더로 다시 이동합니다.

  2. 근본적인 문제는 실제로 git 문제가 아니라 VM 및 / 또는 Linux 문제이므로 이유를 증상을 치료할 수있는 방법이 없어야하는지 궁금합니다. 이런 종류의 오류는 일부 파일 시스템 변경 사항이 적절한 시간에 "적용되지"않고 캐시 된 것입니까? (예를 들어 /unix/464184/are-file-edits-in-linux-directly-saved-into-disk 참조 )-가상 리눅스 머신이 아닌 것처럼 보입니다. 그들의 물건을 자주 자주 fsynch. 이것이 Oracle VirtualBox (아주 훌륭하게 작동 함) 또는 게스트 파일 시스템 또는 우리가 간과하는 일부 설정의 문제인지 여부는 전문 지식을 벗어납니다. 그러나 누군가가 이것에 빛을 비출 수 있다면 나는 행복 할 것입니다.


0

사실 나는 같은 문제가 있었다. 시도하기 전에 코드 사본을 준비하십시오.

난 그냥했다 git reset HEAD~

내 마지막 커밋이 취소 된 다음 다시 커밋했습니다. 문제가 해결되었습니다!


-5

경고 : 더 많은 경험을 바탕으로, 이것은 핵 선택이며 일반적으로 수행해서는 안되며 아무것도 가르치지 않아야 함을 알고 있습니다. 그러나 개인 프로젝트의 경우는 드물지만 여전히 유용하다는 것을 알았습니다.

역사적 커밋을 유지하는 데 신경 쓰지 않는다면 실행하십시오.

rm -r .git

그런 다음 쓰기 방지 된 파일 삭제에 대한 질문에 예라고 대답하십시오. 1 분 안에 문제가 해결되었습니다.


3
당신의 역사를 재치있게하려면 이것을하지 마십시오.
mu 無
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.