2010-08-10 6 views
2

이것은 상황입니다. git 저장소에서 일부 작업을 잃어 버렸습니다.이 작업은 한 번 커밋되었지만 지금 내 기록에 묻혀 있습니다. 어딘가에 있습니다. 그건 'git log --all'에 의해 접근 할 수 없을 수도 있습니다. 내가 기억할 수있는 유일한 사실은이 시간에 내 작업의 일부인 파일을 찾아 낼 수있는 뚜렷한 문자열입니다.주어진 문자열을 포함하는 파일을 포함하는 트리가있는 트리의 커밋 SHA1을 찾는 방법

해결책이 있습니다.하지만 길기 때문에 더 좋은 해결책이 있습니까?

내 여러 명령 일괄 처리에 의해 SHA1을 커밋 찾기 위해 관리했습니다 :

내 솔루션입니다 첫째

  • .git의 모든 '덩어리'개체를 찾는 데/객체를 '자식 고양이 grep을 사용하여 내 파일이 들어있는 BLOB의 SHA1을 찾으십시오.
  • 그런 다음 파일의 SHA1을 포함하는 다른 '트리'객체에 포함 된 트리 객체까지 모든 '트리'객체를 구문 분석해야했습니다.
  • 마지막으로이 루트 트리가 포함 된 모든 커밋을 구문 분석합니다.
+0

http://stackoverflow.com/questions/2839253/gest-history-find-lost-line-by-keyword – simplyharsh

+2

@simplyharsh :이 질문은 다릅니다. 커밋에 어떤 분기에서도 도달 할 수 없습니다. – Cascabel

답변

7

커밋이 일부 ref에서 도달 할 수있는 경우 최적의 해결 방법은 확실하게 곡괭이 검색 : git log -Sstring --all입니다.

도달 할 수없는 경우 네가 맞다. 일부 파기를해야 할 것입니다. 매달려있는 커밋이 생각 나면 가장 쉬운 방법은 git fsck --lost-found을 사용하여 매달린 커밋을 찾는 것입니다. (또한 매달린 얼룩을 인쇄 할 것입니다.) 그런 다음이 SHA1 각각에 git grep <commit>을 사용하고 문자열을 찾습니다.

한편, 정리 된 몇 가지 후보 분기가 있고 대상이 그 중 하나에있을 것이라고 생각되면 git reflog show을 사용하여 reflog를보고, 그들의 팁, 그리고 그들을 다시 만들려면, 당신은 할 수있는 git log -Sstring <branches> ^master.

+0

죄송합니다.이 질문에 대한 대답을하지 못합니다. 귀하의 3 가지 대안은 알 수없는 정보를 기반으로합니다 : "도달 가능한 지점에서의 커밋 여부"? 그리고 당신은 더 간단한 방법을 제공하지 않습니다. – vaab

+0

도달 할 수 있는지 여부를 모르더라도, 훨씬 빠르고 훨씬 빠를 것이므로 * 항상 * git log로 시도해야합니다. 그리고 두 번째 선택은 ref에서 도달 할 수 없다는 것에 의존하지 않습니다. 사실, 도달 할 수없는 커밋 만 나열합니다. 그것은 ** 대답이며 ** 접근 할 수있는 얼룩을 검사하는 것을 피하기 때문에 당신의 방법보다 낫습니다. 세 번째 것은 타협점이며, 현재 도달 할 수 없을 때를위한 것이지만 fsck가 시간 소모적이기 때문에 어디에서 볼지 생각할 수 있습니다. – Cascabel

관련 문제