힘내 : "부패 느슨한 개체"


329

리모컨에서 뽑을 때마다 압축에 대해 다음과 같은 오류가 발생합니다. 수동 압축을 실행할 때도 동일합니다.

$ git gc
error: Could not read 3813783126d41a3200b35b6681357c213352ab31
fatal: bad tree object 3813783126d41a3200b35b6681357c213352ab31
error: failed to run repack

누구든지 알고 있습니까?

고양이 파일에서 나는 이것을 얻는다 :

$ git cat-file -t 3813783126d41a3200b35b6681357c213352ab31
error: unable to find 3813783126d41a3200b35b6681357c213352ab31
fatal: git cat-file 3813783126d41a3200b35b6681357c213352ab31: bad file

그리고 git fsck에서 이것을 얻습니다 (실제로 관련되어 있는지 모르겠습니다).

$ git fsck
error: inflate: data stream error (invalid distance too far back)
error: corrupt loose object '45ba4ceb93bc812ef20a6630bb27e9e0b33a012a'
fatal: loose object 45ba4ceb93bc812ef20a6630bb27e9e0b33a012a (stored in .git/objects/45/ba4ceb93bc812ef20a6630bb27e9e0b33a012a) is corrupted

누구든지 이것을 해독하도록 도울 수 있습니까?


후자 (45ba4ceb93bc812ef20a6630bb27e9e0b33a012a)를 보셨습니까?
Gintautas Miliauskas

4
고마워 ...하지만 어떻게 객체를 "보는"것입니까? git :)에 아직 처음

2
'git show'는 불행히도 'git fsck'보다 더 좋은 것은 없습니다.
asgerhallas

4
Linus Torvalds는이 오류와 파일이있는 경우 수동으로 얼룩을 재구성하는 방법에 대해 다음과 같은 유용한 문서를 작성했습니다 . 손상된 얼룩 개체를 복구하는 방법 손상된 저장소를 수정하기 위해 얼룩 개체를 재구성하는 몇 가지 트릭
Uwe Kleine-König

2
허용 된 답변을 추가하거나 편집 할 수 있습니까? 나는 똑같은 상황에 처해 있으며 받아 들여진 대답에 "Just Work TM"에 대한 충분한 세부 사항이 포함되어 있지 않지만 대신 세부 사항을 직접 살펴볼 것입니다.
ripper234

답변:


57

손상된 트리 개체가있는 것 같습니다. 다른 사람에게서 해당 개체를 가져와야합니다. 잘만되면 그들은 부패하지 않은 버전을 갖게 될 것입니다.

어떤 파일이 있어야하는지 추측하여 다른 사람으로부터 유효한 버전을 찾을 수없는 경우 실제로 재구성 할 수 있습니다. 객체의 날짜와 시간이 일치하는지 확인할 수 있습니다. 그것들은 관련된 얼룩 일 수 있습니다. 해당 객체에서 트리 객체의 구조를 유추 할 수 있습니다.

git internals에 관한 Scott Chacon의 Git Screencast 를 살펴보십시오 . 이것은 git이 어떻게 작동하는지 보여주고 실제로 붙어 있고 다른 사람으로부터 그 물체를 얻을 수없는 경우이 탐정 작업을 수행하는 방법을 보여줍니다.


2
팩 파일에 저장 될 수 있습니다. 이것은 git이 델타를 저장하여 객체의 스토리지를 압축하는 방법입니다. 느슨한 개체는 아직 패키지에없는 개체입니다. 팩 파일 용 Google, 색인 파일을 git에 저장하면 필요한만큼 깊이 들어갈 수 있습니다.
Adam Dymitruk

2
Chacon의 Git 스크린 캐스트에 대한 답변에 링크를 제공 할 수 있습니까?
Ehtesh Choudhury

1
git cat-file -t <SHA1>유형을 알려줍니다. 손상되지 않았다면, 당신은 그 git cat-file <type> <SHA1>내용을 볼 수 있습니다. (나는 그것을 위해 사용했습니다 blob. 다른 유형의 내용도 보여줄 것입니다.)
Carl G

1
또한 Linus 의이 게시물 에서는 복구 방법에 대해 설명합니다 blob. 그래도이 지시를 따랐을 때 성공적으로 실행 되었음에도 불구하고 git status응답 fatal: unable to read <SHA1>했습니다 git hash-object -w <file>(아마도 그의 지시에 따라 해당 오브젝트 파일을 이동 시켰기 때문에 반환했을 때 같은 corrupt loose object오류가 발생했습니다.)
Carl G

2
이제 영어로 반복하십시오
Mehdi

359

나는 같은 문제가 있었다 (왜 그런지 모르겠다).

이 수정 사항은 저장소의 손상되지 않은 원격 사본에 액세스해야하며 로컬 작업 사본을 그대로 유지합니다.

그러나 몇 가지 단점이 있습니다.

  • 푸시되지 않은 커밋에 대한 기록을 잃어 버리고 다시 커밋해야합니다.
  • 당신은 숨김을 잃을 것입니다.

수정

repo 위의 상위 디렉토리에서 다음 명령을 실행하십시오 ( 'foo'를 프로젝트 폴더 이름으로 바꾸십시오).

  1. 손상된 디렉토리의 백업을 작성하십시오.
    cp -R foo foo-backup
  2. 원격 저장소의 새 복제본을 새 디렉토리에 작성하십시오.
    git clone git@www.mydomain.de:foo foo-newclone
  3. 손상된 .git 서브 디렉토리를 삭제하십시오.
    rm -rf foo/.git
  4. 새로 복제 된 .git 서브 디렉토리를 foo로 이동하십시오.
    mv foo-newclone/.git foo
  5. 나머지 임시 새 클론을 삭제하십시오.
    rm -rf foo-newclone

Windows에서는 다음을 사용해야합니다.

  • copy 대신에 cp -R
  • rmdir /S 대신에 rm -rf
  • move 대신에 mv

이제 foo는 원래 .git하위 디렉토리를 가지고 있지만 모든 로컬 변경 사항이 여전히 있습니다. git status, commit, pull, push, 그들이해야으로 다시 등을 작동합니다.


11
이 방법은 저에게 효과적이었습니다. 그러나 나는 모든 커밋되지 않은 커밋이 손실되었다고 생각합니다. Repo 데이터는 변경되지 않았습니다.
wonton

30
푸시되지 않은 커밋 정보는 손실됩니다. 그러나 일반적인 시나리오 (현재와 다른 것의 변경되지 않은 여러 개의 로컬 브랜치가 없음)에서 가장 최근의 모든 파일 수정 (inkl. 삭제)은 여전히 ​​디스크에 있으므로 이전의 푸시되지 않은 커밋을 쉽게 반복 할 수 있습니다. 커밋 순서 후에 항상 푸시하기 때문에이 문제가 발생하지 않았습니다.
큐빅 양상추

7
간단하고 간단합니다. 이것은 git에 관한 모든 것을 이해하지 못하고 저장소와 바이올린을 사용하고 싶지 않은 경우 가장 효율적인 솔루션 인 IMO입니다.
Oliboy50

4
모든 숨김 파일이 .git 하위 디렉토리에 저장되어 있기 때문에 모든 숨김을 제거한다고 생각합니다.
Anthony Elliott

4
프로젝트에 하위 모듈이있는 경우 .git폴더 를 검색하기 전에 하위 모듈을 초기화해야 합니다.
AdrieanKhisbe

242

가장 좋은 방법은 아마도 원격 저장소 (예 : Github 또는 기타)에서 단순히 복제하는 것입니다. 불행히도 커밋되지 않은 커밋과 숨김 변경 사항은 손실되지만 작업 복사본은 그대로 유지됩니다.

먼저 로컬 파일의 백업 사본을 만드십시오. 그런 다음 작업 트리의 루트에서이 작업을 수행하십시오.

rm -fr .git
git init
git remote add origin [your-git-remote-url]
git fetch
git reset --mixed origin/master
git branch --set-upstream-to=origin/master master  

그런 다음 필요에 따라 변경된 파일을 커밋하십시오.


12
IMHO 이것은 정답입니다. 저장소를 삭제하고 다시 복제하는 것보다 훨씬 쉽습니다! :) 비록 당신이 단계적인 커밋을 잃어 버릴지라도 ...
Nick

6
분명히, 부패가 발생했을 때 마스터 이외의 지점에 있었다면 master지점 이름으로 바꾸 십시오.
Timothy Zorn

주로 그대로 작동했지만 working손상되었을 때 다른 지점에 있었고이 단계를 수행하면 master 이외의 다른 지점의 로컬 사본이 제공되지 않았습니다 (그렇습니다. 위의 master로 바꾸려고 working했지만 작동하지 않았습니다). 으로 위의 단계를 수행 master한 다음 내 변경 사항을 checkout -b working origin/working숨기고 숨김을 수행 하고 터뜨 렸습니다 . 일한 것 같습니다-감사합니다!
fantabolous

1
내 저장소에는 손상되지 않은 하위 모듈이 있습니다. 이 프로세스는 리포지토리와 해당 하위 모듈을 같은 명령이 git status생성 된 상태로 유지했습니다 fatal: Not a git repository: submodules/my-sub/../../.git/modules/my-sub. 파일 시스템에서 서브 모듈을 삭제하고 프로세스를 다시 시작하면 정상적인 상태로 복원됩니다. 아마도 서브 모듈에 변경되지 않은 변경 세트가 없는지 확인하는 것이 좋습니다.
Steven Baldasty

5
나는 오늘 이것을했고 파일에 대한 커밋되지 않은 변경 사항을 잃지 않았습니다 :) (git 2.17.1)
Fábio Dias

173

내 노트북에서 VM으로 작업하면서 배터리가 죽었습니다.이 오류가 발생했습니다.

오류 : 개체 파일 .git / objects / ce / theRef가 비어 있습니다 오류 : 개체 파일 .git / objects / ce / theRef가 비어 있습니다 치명적 : 느슨한 개체 theRef (.git / objects / ce / theRef에 저장 됨)가 손상되었습니다

나는 2 개의 명령으로 작업을 잃지 않고 repo를 다시 작동시킬 수있었습니다 (수정 된 파일 / 커밋되지 않은 변경 사항)

find .git/objects/ -size 0 -exec rm -f {} \;
git fetch origin

그 후 나는을 실행했고 git status, repo는 괜찮 았고 내 변화가있었습니다 (커밋되기를 기다리고 있습니다 ..).

자식 버전 1.9.1

이 솔루션이 작동하지 않고보다 급진적 인 접근 방식이 필요한 경우를 대비하여 기억하는 모든 변경 사항을 백업해야합니다.


10
find .git/objects/ -size 0 -exec rm -f {} \;나를 위해 작동)
라자로 페르난데스 리마 술레이

같은 문제가 있었지만 명령을 실행하고 Mint VM에서 완벽하게 작동했습니다.
Ludvig Rydahl

다른 작업을하지 않아도 완벽하게 작동했습니다.
Halsafar

1
VM이 아니며 이것은 여러 번 효과가있었습니다. IDK가 현재 프로젝트에서 계속 발생하는 이유는 있지만 매번 수정합니다.
James L.

7
git symbolic-ref HEAD refs/heads/master.빈 객체를 삭제 한 후에 실행해야 할 수도 있습니다 .
스테판

43

커밋 메시지를 작성하는 동안 컴퓨터가 다운되었습니다. 재부팅 후, 작업 트리는 그대로두고 변경 사항을 성공적으로 커밋 할 수있었습니다.

내가 시도 할 때 그러나 실행 git status내가 가진

error: object file .git/objects/xx/12345 is empty
fatal: loose object xx12345 (stored in .git/objects/xx/12345 is corrupt

대부분의 다른 답변과 달리 데이터를 복구하려고하지 않았습니다. . 빈 객체 파일에 대한 불평을 멈추기 위해 Git이 필요했습니다.

개요

"객체 파일"은 관심있는 실제 파일의 git 해시 표현입니다. Git은 해시 버전이 some/file.whatever저장되어 있어야한다고 생각합니다 ..git/object/xx/12345 하고 오류를 수정하는 것은 "느슨한 객체"가 어떤 파일을 나타내는 지 알아내는 문제로 판명되었습니다.

세부

가능한 옵션은

  1. 빈 파일을 삭제
  2. Git에 적합한 상태로 파일을 가져옵니다.

접근법 1 : 오브젝트 파일 제거

가장 먼저 시도한 것은 객체 파일을 옮기는 것입니다.

mv .git/objects/xx/12345 ..

그것은 작동하지 않았다-자식은 깨진 링크에 대해 불평하기 시작했다. 접근법 2로 넘어갑니다.

접근 방식 2 : 파일 수정

Linus Torvalds는 나에게 문제를 해결 한 객체 파일을 복구하는 방법에 대한 훌륭한 글을 썼습니다 . 주요 단계가 여기에 요약되어 있습니다.

$> # Find out which file the blob object refers to
$> git fsck
broken link from    tree 2d9263c6d23595e7cb2a21e5ebbb53655278dff8
           to    blob xx12345
missing blob xx12345

$> git ls-tree 2d926
...
10064 blob xx12345  your_file.whatever

이것은 빈 객체가 해시로 간주되는 파일을 알려줍니다. 이제 수리 할 수 ​​있습니다.

$> git hash-object -w path/to/your_file.whatever

이 작업을 수행 한 후 나는 .git/objects/xx/12345더 이상 비워 두지 않았으며 자식은 불평을 중단했습니다.


리포지토리에 원격 또는 백업이없고 손상된 객체가 초기 커밋 근처에 추가되어 어쨌든 전체 트리가 손상되었을 수 있습니다. 다른 리포지토리에서 객체를 다시 만들려고 시도했지만이 대답은 더 세밀하게 동일한 결과를 얻습니다.
Estecka

13

시험

git stash

이것은 나를 위해 일했습니다. 그것은 당신이 저 지르지 않았고 문제를 해결 한 것을 숨 깁니다.


기묘한!?! 오늘 아침이 오류가 발생했습니다. 어제 커밋 했으므로 커밋되지 않은 변경은 없습니다. 다음나요 git stash ... 치명적인 : 입력 / 출력 오류 : '/home/<user>/.git/index.lock'만들 수 없습니다 touch .git/a 터치 : 건드릴 수 없어 '.git / A': 입력 / 출력 오류 sudo touch /home/guest/.git/a 오류 git stash 없음 로컬 변경 사항 저장 git status ... 커밋 할 내용 없음, 작업 디렉토리 정리
go2null

1
@ go2null 이것에 조금 늦었지만 입 / 출력 오류는 일반적으로 하드 드라이브 문제를 의미합니다. 비록 당신이 지금까지 이것을 이해했다고 확신하지만.
arleslie

"현재 색인 상태를 저장할 수 없습니다"
Vladimir Brasil

9

가비지 컬렉션은 내 문제를 해결 :

git gc --aggressive --prune=now

완료하는 데 시간이 걸리지 만 모든 느슨한 개체 및 / 또는 손상된 인덱스가 수정되었습니다.


이것은 좋은 해결책입니다. 나를 위해 일했다. 시스템이 실수로 종료되었습니다. 그러나이 하나의 명령으로 복제 및 모든 무거운 작업에서 벗어날 수있었습니다. 고마워요
Mukesh Kumar

"reflog를 실행하지 못했습니다"
Vladimir Brasil

5

git prune나를 위해이 문제를 해결하기 만하면됩니다.


이것은 저에게 효과적이며 가장 쉬운 해결책 인 것 같습니다. 이 답변이 더 많은 표를 얻지 못한 이유를 잘 모르겠습니다. 유일한 단점은 다음 git pull은 평소보다 조금 오래 걸리는 것입니다. 제거 된 객체 또는 무언가를 대체하기 때문에 추측합니다.
steev

1
그 이유는 자식 정리가 문제를 전혀 해결하지 못하기 때문일 수 있습니다.
user3072843

4

방금 이것을 경험했습니다-Git 저장소에 쓰는 동안 내 컴퓨터가 추락하여 손상되었습니다. 다음과 같이 수정했습니다.

원격 리포지토리로 푸시하지 않은 커밋 수를 살펴 보았습니다.

gitk &

이 도구를 사용하지 않으면 내가 아는 한 모든 운영 체제에서 사용할 수있어 매우 편리합니다. 이것은 내 리모컨에 두 개의 커밋이 누락되었음을 나타냅니다. 따라서 최신 원격 커밋을 나타내는 레이블을 클릭했습니다 (보통 이것이 될 것입니다 /remotes/origin/master) (해시 길이는 40 자이지만 간결함을 위해 10을 사용하고 있습니다-이것은 일반적으로 작동합니다).

여기있어:

14c0fcc9b3

그런 다음 다음 커밋 (예 : 리모트에없는 첫 번째 커밋)을 클릭하고 해시를 얻습니다.

04d44c3298

그런 다음이 두 가지를 모두 사용 하여이 커밋에 대한 패치를 만듭니다.

git diff 14c0fcc9b3 04d44c3298 > 1.patch

그런 다음 다른 누락 된 커밋과 마찬가지로 커밋의 해시와 커밋 자체의 해시를 사용했습니다.

git diff 04d44c3298 fc1d4b0df7 > 2.patch

그런 다음 새 디렉토리로 이동하여 원격에서 저장소를 복제했습니다.

git clone git@github.com:username/repo.git

나는 다음 새 폴더에 패치 파일을 이동, 그들을 적용 (이러한에서 붙여 넣을 수 있습니다 자신의 정확한 커밋 메시지로 최선을 다하고 git log또는 gitk창) :

patch -p1 < 1.patch
git commit

patch -p1 < 2.patch
git commit

이것은 나를 위해 일을 복원했습니다 (그리고 많은 커밋을 위해 더 빠른 방법이있을 수 있습니다). 그러나 손상된 저장소의 트리를 복구 할 수 있는지 알고 싶었습니다. 위와 같이 복구 된 리포지토리를 사용하여 손상된 폴더에서이 명령을 실행하십시오.

git fsck 

다음과 같은 것을 얻을 것입니다 :

error: object file .git/objects/ca/539ed815fefdbbbfae6e8d0c0b3dbbe093390d is empty
error: unable to find ca539ed815fefdbbbfae6e8d0c0b3dbbe093390d
error: sha1 mismatch ca539ed815fefdbbbfae6e8d0c0b3dbbe093390d

복구하려면 깨진 폴더 에서이 작업을 수행하십시오.

rm .git/objects/ca/539ed815fefdbbbfae6e8d0c0b3dbbe093390d
cp ../good-repo/.git/objects/ca/539ed815fefdbbbfae6e8d0c0b3dbbe093390d .git/objects/ca/539ed815fefdbbbfae6e8d0c0b3dbbe093390d

즉, 손상된 파일을 제거하고 좋은 파일로 교체하십시오. 이 작업을 여러 번 수행해야 할 수도 있습니다. 마지막으로 당신이 실행할 수있는 지점이있을 것입니다fsck 오류없이 . 보고서에 "dangling commit"및 "dangling blob"행이있을 것입니다.이 폴더의 리베이스 및 수정 결과이며 정상입니다. 가비지 수집기는 적절한 과정에서 제거합니다.

따라서 (적어도 나의 경우) 손상된 트리는 푸시되지 않은 커밋이 손실되는 것을 의미하지는 않습니다.


3

손상된 느슨한 객체 오류도 발생했습니다.

./objects/x/x

손상된 객체의 디렉토리로 이동하여 성공적으로 수정했습니다. 해당 객체에 할당 된 사용자가 내 자식 사용자 가 아니라는 것을 알았습니다 . 나는 그것이 어떻게 일어 났는지 모르지만 chown git:git그 파일을 실행 한 다음 다시 작동했습니다.

이것은 일부 사람들의 문제에 대한 잠재적 인 해결책 일 수 있지만 모든 사람들에게 필요한 것은 아닙니다.


2

내 (Windows) 시스템이 재부팅을 결정한 후이 오류가 발생했습니다. 고맙게도 내 원격 저장소는 최신 상태이므로 신선한 git-lone을 수행했습니다.



2

나는 여기에서 다른 많은 단계들을 따라 갔다. 자식 트리 / 객체를보고 누락 된 것을 찾는 방법에 대한 Linus의 설명이 특히 도움이되었습니다. git-git은 손상된 얼룩을 복구

그러나 결국, 부분 디스크 오류로 인해 느슨하거나 손상된 트리 객체가 있었고 트리 객체는 그 문서에 의해 쉽게 복구되지 않습니다.

결국, 나는 갈등 objects/<ha>/<hash>git unpack-objects피하고 합리적으로 최신 복제본에서 팩 파일과 함께 사용 했습니다. 누락 된 트리 오브젝트를 복원 할 수있었습니다.

또 이전에 보관 된 물건을 풀고의 부작용이 될 수 매달려 모양의 많은 저를 떠났고, 다른 질문에서 해결 여기


2

@ user1055643에 대한 답변으로 마지막 단계가 누락되었습니다.

$ rm -fr .git
$ git init
$ git remote add origin your-git-remote-url
$ git fetch
$ git reset --hard origin/master
$ git branch --set-upstream-to=origin/master master  

--set-upstream-이 유효한 인수입니까? 나는 그렇게 생각하지 않습니다!
샤리프 마문

2
자식 분기 (--set-upstream-to = <upstream> | -u <upstream>) [<branchname>]
Ertuğrul Altınboğa

.git복제 된 프로젝트에서 제거 하고 복사하면 repo가 ​​작동하지만 로컬 브랜치 나 숨김은 유지되지 않습니다.
Vladimir Vukanac

1

우리는 여기서 사건을 가졌습니다. 문제는 손상된 파일의 소유권이 일반 사용자 대신 루트였습니다. 누군가가 "sudo su-"를 수행 한 후 서버에서 수행 된 커밋으로 인해 발생했습니다.

먼저 다음과 같이 손상된 파일을 식별하십시오.

$> git fsck --full

다음과 같은 답변을 받아야합니다.

fatal: loose object 11b25a9d10b4144711bf616590e171a76a35c1f9 (stored in .git/objects/11/b25a9d10b4144711bf616590e171a76a35c1f9) is corrupt

손상된 파일이있는 폴더로 이동하여 다음을 수행하십시오.

$> ls -la

손상된 파일의 소유권을 확인하십시오. 다른 경우 리포지토리의 루트로 돌아가서 다음을 수행하십시오.

$> sudo chown -R YOURCORRECTUSER:www-data .git/

그것이 도움이되기를 바랍니다!


1

나에게 이것은 정전으로 인해 발생했습니다 git push.

메시지는 다음과 같습니다.

$ git status
error: object file .git/objects/c2/38824eb3fb602edc2c49fccb535f9e53951c74 is empty
error: object file .git/objects/c2/38824eb3fb602edc2c49fccb535f9e53951c74 is empty
fatal: loose object c238824eb3fb602edc2c49fccb535f9e53951c74 (stored in .git/objects/c2/38824eb3fb602edc2c49fccb535f9e53951c74) is corrupt

나는 같은 것을 시도했지만 git fsck도움이되지 못했습니다. 에서 충돌이 발생했기 때문에 git push서버가 업데이트 된 후 발생하는 클라이언트 측에서 다시 쓰는 동안 발생했습니다. 주위를 둘러보고의 c2388경우 항목이 참조했기 때문에 커밋 객체라고 생각했습니다 .git/refs. 그래서 나는 c2388역사 를 볼 때 (웹 인터페이스 또는 두 번째 클론을 통해) 찾을 수 있음을 알았습니다 .

두 번째 클론에서 나는 git log -n 2 c2388의 전임자를 식별하기 위해 수행했습니다 c2388. 그런 다음 수동으로 수정 .git/refs/heads/master하고.git/refs/remotes/origin/masterc2388대신 전신이 되었습니다 c2388. 그런 다음 할 수 있습니다 git fetch. 는 git fetch빈 객체에 대한 충돌을 몇 번 실패했습니다. git fetch성공할 때까지이 빈 개체를 각각 제거했습니다 . 그것은 저장소를 치유했습니다.


1

이 방법으로 해결했습니다. 손상되지 않은 오브젝트 파일을 백업의 복제본에서 원래 저장소로 간단히 복사하기로 결정했습니다. 이것은 잘 작동했습니다. (그런데 : 이름으로 .git / objects /에서 객체를 찾을 수 없다면 공간을 절약하기 위해 [packed] [pack]되었을 것입니다.)


0

맨손으로 원격 git repo에서 이와 동일한 문제가있었습니다. 많은 문제 해결 후 동료 중 한 명이 .git / objects의 일부 파일에서 444 (r--r--r) 대신 440 (r--r -----) 권한을 갖는 커밋을 확인했습니다. -). 동료에게 git repo 내부의 "chmod 444 -R objects"를 사용하여 권한을 변경하도록 요청한 후 문제가 해결되었습니다.


0

방금 이런 문제가있었습니다. 내 특정 문제는 가장 최근의 커밋 (및 마스터 분기)을 손상시킨 시스템 충돌로 인해 발생했습니다. 나는 밀지 않았고 그 커밋을 다시 만들고 싶었습니다. 내 특별한 경우에는 다음과 같이 처리 할 수있었습니다.

  1. 다음을 백업하십시오 .git/.rsync -a .git/ git-bak/
  2. 를 확인 .git/logs/HEAD하고 유효한 커밋 ID가있는 마지막 줄을 찾으십시오. 저에게는 이것이 가장 최근의 커밋이었습니다. 파일의 작업 디렉토리 버전이 있었으므로 원하는 모든 버전이 있었기 때문에 이것은 좋았습니다.
  3. 해당 커밋에서 분기를 만듭니다. git branch temp <commit-id>
  4. 작업중인 디렉토리의 파일로 끊어진 커밋을 다시 실행하십시오.
  5. git reset master temp 마스터 브랜치를 2 단계에서 작성한 새 커밋으로 이동하십시오.
  6. git checkout master제대로 표시되는지 확인하십시오 git log.
  7. git branch -d temp.
  8. git fsck --fullfsck에서 찾은 손상된 객체를 삭제해도 안전합니다.
  9. 모두 좋아 보인다면 밀어 넣으십시오. 그게 효과가 있다면

그것은 나를 위해 일했습니다. 가장 최근의 커밋이 손상 될 가능성이 가장 높기 때문에 이것이 합리적으로 일반적인 시나리오라고 생각하지만, 다시 잃어 git cherrypick버린 경우 신중하게 사용하여 이와 같은 방법을 계속 사용할 수 있습니다. 에서 .git/logs/HEAD.


0

이 문제가 발생했을 때 최근 변경 사항을 백업하고 (내가 변경된 것을 알았으므로) .git / location에서 불평하는 파일을 삭제했습니다. 그런 다음 git pull을 수행했습니다. 그래도주의를 기울여도 효과가 없을 수 있습니다.


0

시스템이 다운되면이 문제가 발생했습니다. 내가 한 일은 이것입니다.

손상된 커밋은 손실되지만 변경 내용은 유지됩니다.이 절차가 끝나면 커밋을 다시 만들어야 할 수도 있습니다.

  • 코드를 백업하십시오.
  • 작업 디렉토리로 이동하여 .git폴더를 삭제하십시오 .
  • 이제 다른 위치에서 리모컨을 복제하고 .git폴더를 복사하십시오 .
  • 작업 디렉토리에 붙여 넣으십시오.
  • 원하는대로 커밋하십시오.

-7

.git 폴더를 제거하고 다시 추가하십시오. 이 간단한 솔루션은 저에게 효과적이었습니다.


3
로컬 리포지토리에 영향을 줄 수 있습니다 ..., 원하지 않는 부작용이있을 수 있습니다. :) 제안을 수정하고 해당 경고를 추가하십시오.
Felix

1
.git복제하고 복제 된 프로젝트에서 복사하면 repo는 작동하지만 로컬 브랜치 나 숨김은 유지되지 않습니다. 또한 친숙한 제안은, 투표를받지 않으려면 답변을 완전히 삭제하십시오.
Vladimir Vukanac

1
우와 넬리 .. 핀셋 직업에 바주카를 사용하는 것에 대해 이야기 해보세요.
Tuncay Göncüoğlu
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.