`git pull`은 내 숙제를 어떻게 먹었습니까? (delta 0) Unpacking

나는 교장실에있는 한 아이가 개가 숙제를하기 전날 밤 숙제를 먹었다 고 설명하지만 얼굴에 미친 데이터 손실 버그를 쳐다보고 있는데 어떻게 된 것인지 알 수 없습니다. git이 어떻게 저장소 전체를 먹을 수 있는지 알고 싶습니다! 나는 자식을 여러 번 꿰 뚫었 고 결코 깜박이지 않았습니다. 나는 그것을 사용하여 20 Gig Subversion 저장소를 27 git repos로 나누고 엉망을 풀기 위해 foo를 필터링했습니다. Reflog는 항상 폴백합니다. 이번에는 카펫이 사라졌습니다!

내 관점에서, 내가 한 모든 것은 실행 git pull되고 전체 로컬 저장소를 손상시켰다. 나는 그것이 “체크 아웃 된 버전을 엉망으로 만들었다”또는 “내가 있던 지점”또는 이와 유사한 것을 의미하지는 않는다. 모든 것이 사라 졌음을 의미 합니다 .

사건에 대한 내 터미널의 스크린 샷은 다음과 같습니다.

사건 스크린 샷

그 과정을 안내해 드리겠습니다. 내 명령 프롬프트에는 현재 git repo (prezto의 vcs_info 구현 사용)에 대한 데이터가 포함되어 있으므로 git repo가 ​​사라진 시점을 확인할 수 있습니다. 첫 번째 명령은 충분히 정상입니다.

  » caleb » jaguar » ~/p/w/incil.info » ◼  zend ★ »
❯❯❯ git co master
Switched to branch 'master'
Your branch is up-to-date with 'origin/master'.

거기에서 내가 ‘zend’지점에 있었고 마스터를 체크 아웃 한 것을 볼 수 있습니다. 여태까지는 그런대로 잘됐다. 다음 명령 전에 프롬프트에서 분기가 성공적으로 전환되었음을 알 수 있습니다.

  » caleb » jaguar » ~/p/w/incil.info » ◼  master ★ »
❯❯❯ git pull
remote: Counting objects: 37, done.
remote: Compressing objects: 100% (37/37), done.
remote: Total 37 (delta 25), reused 0 (delta 0)
Unpacking objects: 100% (37/37), done.
From gitlab.alerque.com:ipk/incil.info
 + 7412a21...eca4d26 master     -> origin/master  (forced update)
   f03fa5d..c8ea00b  devel      -> origin/devel
 + 2af282c...009b8ec verse-spinner -> origin/verse-spinner  (forced update)
First, rewinding head to replay your work on top of it...
>>> elapsed time 11s

그리고 그처럼 사라졌습니다. 10 초 이상 경과하면 다음 프롬프트 전에 경과 시간 마커가 출력됩니다. 힘내는 다시 재생하기 위해 되감기 고지 이상의 출력을 제공하지 않았습니다. 완료되었다는 표시가 없습니다.

다음 프롬프트에는 현재 어떤 브랜치 또는 git 상태에 대한 데이터가 없습니다.

그것이 실패했다는 것을 알지 못했지만 나는 분명히 git repo에 있지 않다는 것을 알리기 위해 다른 git 명령을 실행하려고 시도했습니다. PWD는 변경되지 않았습니다.

  » caleb » jaguar » ~/p/w/incil.info »
❯❯❯ git fetch --all
fatal: Not a git repository (or any parent up to mount point /home)
Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set).

이 후 주변을 살펴본 결과 완전히 빈 디렉토리에 있음을 알 수있었습니다. 아무것도. ‘.git’디렉토리가 없습니다. 빈.

내 로컬 자식은 버전 2.0.2입니다. 다음은 git config의 몇 가지 tidbits입니다.

[branch]
        autosetuprebase = always
        rebase = preserve
[pull]
        rebase = true
[rebase]
        autosquash = true
        autostash = true
[alias]
        co = checkout

예를 들어 git pull, 병합 대신 항상 리베이스를 수행하도록 설정했기 때문에 위 출력의 일부가 정상입니다.

데이터를 복구 할 수 있습니다. 다른 저장소로 푸시되지 않은 중요하지 않은 스태 이스 이외의 자식 객체는 없다고 생각하지만 어떤 일이 있었는지 알고 싶습니다 .

나는 확인했다 :

  • dmesg 또는 시스템 저널의 메시지 원격으로 관련된 것도 없습니다.
  • 드라이브 또는 파일 시스템 오류가 표시되지 않습니다 (LVM + LUKS + EXT4 모두 정상으로 보입니다). 잃어버린 + 발견에는 아무것도 없습니다.
  • 나는 다른 것을 달리지 않았다. 위에 표시되지 않은 기록에는 아무것도 없으며이 기간 동안 다른 터미널이 사용되지 않았습니다. rm잘못된 CWD 등에서 실행되었을 수있는 명령 이 없습니다 .
  • 다른 디렉토리에서 다른 자식 저장소를 파고 들면 git pulls를 실행하는 명백한 이상이 없습니다 .

여기서 무엇을 더 찾아야합니까?



답변

예, git숙제를 먹었습니다. 그것의 모든.

dd사건이 발생한 후이 디스크 의 이미지를 만들어 나중에 엉망으로 만들었 습니다. 시스템 로그에서 일련의 이벤트를 재구성하면 다음과 같은 상황이 발생했다고 추론합니다.

  1. pacman -Syu이 사건이 발생하기 며칠 전에 시스템 업데이트 명령 ( )이 발행되었습니다.
  2. 확장 된 네트워크 중단으로 인해 패키지 다운로드를 다시 시도하고있었습니다. 인터넷이 부족한 것에 실망한 나는 시스템을 잠들게하고 잠자리에 들었다.
  3. 며칠 후 시스템이 깨어 났고 다시 패키지를 찾아 다운로드하기 시작했습니다.
  4. 이 저장소를 엉망으로 만들기 직전에 패키지 다운로드가 완료되었습니다.
  5. 시스템 glibc 설치가 git checkout및 이후에 업데이트되었습니다 git pull.
  6. git(가) 후 이진 교체있어 git pull시작이 완료되기 전에.
  7. 그리고 일곱째 날에는 git모든 일에서 쉬었다. 그리고 세상을 삭제하여 다른 사람들도 쉬어야했습니다.

나는 이것이 일어나게 된 경쟁 조건이 무엇 인지 정확히 알지 못하지만 작업 중간에 바이너리를 바꾸는 것은 확실히 좋지 않거나 테스트 가능한 / 반복 가능한 조건은 아닙니다. 일반적으로 실행중인 바이너리의 사본은 메모리에 저장되지만 git이상하고 자체 버전을 다시 생성하는 방식에 관한 것입니다. 분명히 모든 것을 파괴하기보다는 죽었어야했지만, 그 일이 일어났습니다.


답변

삭제 될 파일 경로를 정의하지 못했을 수 있습니다.

귀하의 사례 remove(path)는 주어진 매개 변수가 빈 문자열이기 때문에 OS에서 루트 폴더로 수정 한 (!) 빈 문자열이기 때문에 내 수제 방법으로 루트 폴더를 제거하려고 했을 때 아름다운 날을 상기 시켰습니다 .

이것은 비슷한 자식 버그 일 수 있습니다. 그런 :

  1. Rebase 명령이 remove(project_folder + file_path)(의사 코드) 와 같은 파일을 삭제하려고했습니다.
  2. file_path당시에는 어쨌든 비어있었습니다.
  3. 명령은 다음과 같은 것으로 평가되었습니다. remove(project_folder)

답변

운이 좋으면 다음 명령으로이 문제를 해결할 수 있습니다.

git reset --hard ORIG_HEAD

잠재적 인 위험한 변경이 시작되면 git은 ORIG_HEAD의 현재 상태를 숨 깁니다. 그것으로 당신은 병합 또는 리베이스를 취소 할 수 있습니다.

힘내 매뉴얼 : 병합 취소


답변

누군가이 리포지토리를 실행 한 것처럼 git push --force보이며 그 변경 사항을 풀다운했습니다. 저장소를 새로 복제하면 깨끗한 작업 상태로 다시 돌아갑니다.