programing

Git에서 파일이 삭제된 시간 찾기

i4 2023. 6. 15. 21:34
반응형

Git에서 파일이 삭제된 시간 찾기

커밋이 n개인 Git 저장소가 있습니다.

제게 필요한 파일이 있는데, 그 파일이 저장소에 있었는데, 갑자기 "오! 그 파일은 어디로 갔나요?"라고 생각했습니다.

"file really_needed"라는 Git 명령어가 있습니까?txt가 commit n-13"에서 삭제되었습니까?

다시 말해, 모든 개별 커밋을 확인하지 않고 Gitrepo가 모든 파일의 모든 변경 사항을 가지고 있다는 것을 알지 못한 채, 해당 파일이 있는 마지막 커밋을 빠르게 찾을 수 있습니까?

파일이 삭제된 경우에도 파일을 변경한 커밋을 표시하려면 다음 명령을 실행합니다.

git log --full-history -- [file path]

커밋만 파을삭마지커밋보사다다용합니음을려면만일을 사용합니다.-1위의 명령 외에 다음과 같은 기능이 있습니다.

git log --full-history -1 -- [file path]

내 기사도 참조:파일을 삭제한 커밋입니다.

단답:

git log --full-history -- your_file

병합 커밋을 포함하여 보고서 기록에 있는 모든 커밋을 표시합니다.your_file마지막(위) 항목이 파일을 삭제한 항목입니다.

몇 가지 설명:

--full-history여기 깃발은 중요합니다.파일이 없으면 Git는 파일의 로그를 요청할 때 "기록 단순화"를 수행합니다.문서들은 이것이 정확히 어떻게 작동하는지에 대한 세부 사항을 가볍게 알고 있으며 소스 코드에서 그것을 알아내려고 하는 데 필요한 용기와 용기가 부족하지만, git-log 문서들은 다음과 같이 말할 것이 많습니다.

기본 모드

트리의 최종 상태를 설명하는 가장 간단한 기록으로 기록을 단순화합니다.최종 결과가 동일한 경우(즉, 동일한 콘텐츠로 분기 병합) 일부 사이드 분기를 잘라내기 때문에 가장 간단합니다.

삭제된 파일의 최종 상태를 설명하는 가장 단순한 기록은 기록이 아니기 때문에, 이것은 분명히 우리가 원하는 기록이 삭제되는 시점에 관한 것입니다.다음과 같은 위험이 있습니까?git log 없이--full-history단순히 파일이 만들어지지 않았다고 주장할 것인가요?유감스럽게도 그렇습니다.다음은 시연입니다.

mark@lunchbox:~/example$ git init
Initialised empty Git repository in /home/mark/example/.git/
mark@lunchbox:~/example$ touch foo && git add foo && git commit -m "Added foo"
[master (root-commit) ddff7a7] Added foo
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 foo
mark@lunchbox:~/example$ git checkout -b newbranch
Switched to a new branch 'newbranch'
mark@lunchbox:~/example$ touch bar && git add bar && git commit -m "Added bar"
[newbranch 7f9299a] Added bar
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 bar
mark@lunchbox:~/example$ git checkout master
Switched to branch 'master'
mark@lunchbox:~/example$ git rm foo && git commit -m "Deleted foo"
rm 'foo'
[master 7740344] Deleted foo
 1 file changed, 0 insertions(+), 0 deletions(-)
 delete mode 100644 foo
mark@lunchbox:~/example$ git checkout newbranch
Switched to branch 'newbranch'
mark@lunchbox:~/example$ git rm bar && git commit -m "Deleted bar"
rm 'bar'
[newbranch 873ed35] Deleted bar
 1 file changed, 0 insertions(+), 0 deletions(-)
 delete mode 100644 bar
mark@lunchbox:~/example$ git checkout master
Switched to branch 'master'
mark@lunchbox:~/example$ git merge newbranch
Already up-to-date!
Merge made by the 'recursive' strategy.
mark@lunchbox:~/example$ git log -- foo
commit 77403443a13a93073289f95a782307b1ebc21162
Author: Mark Amery 
Date:   Tue Jan 12 22:50:50 2016 +0000

    Deleted foo

commit ddff7a78068aefb7a4d19c82e718099cf57be694
Author: Mark Amery 
Date:   Tue Jan 12 22:50:19 2016 +0000

    Added foo
mark@lunchbox:~/example$ git log -- bar
mark@lunchbox:~/example$ git log --full-history -- foo
commit 2463e56a21e8ee529a59b63f2c6fcc9914a2b37c
Merge: 7740344 873ed35
Author: Mark Amery 
Date:   Tue Jan 12 22:51:36 2016 +0000

    Merge branch 'newbranch'

commit 77403443a13a93073289f95a782307b1ebc21162
Author: Mark Amery 
Date:   Tue Jan 12 22:50:50 2016 +0000

    Deleted foo

commit ddff7a78068aefb7a4d19c82e718099cf57be694
Author: Mark Amery 
Date:   Tue Jan 12 22:50:19 2016 +0000

    Added foo
mark@lunchbox:~/example$ git log --full-history -- bar
commit 873ed352c5e0f296b26d1582b3b0b2d99e40d37c
Author: Mark Amery 
Date:   Tue Jan 12 22:51:29 2016 +0000

    Deleted bar

commit 7f9299a80cc9114bf9f415e1e9a849f5d02f94ec
Author: Mark Amery 
Date:   Tue Jan 12 22:50:38 2016 +0000

    Added bar

방법에목의 방법에 하십시오.git log -- bar위의 터미널 덤프에서 문자 그대로 출력이 발생하지 않았습니다. Git은 역사를 소설로 "간소화"하고 있습니다.bar존재하지 않았습니다. git log --full-history -- bar반면에, 우리에게 창조된 헌신을 줍니다.bar그리고 그것을 삭제한 위원회.

분명한 것은 이 문제는 단순히 이론적인 문제가 아니라는 것입니다. 서만조발견건한고사하류overed▁the건▁i▁looked한▁and발견▁disc▁docs고▁only서를 발견했습니다.--full-history깃발을 내립니다.git log -- some_file삭제된 파일을 추적하려고 했던 실제 저장소에서 실패했습니다.기록 단순화는 현재 파일이 현재 상태가 된 방법을 이해하려고 할 때 도움이 될 수 있지만, 파일 삭제를 추적하려고 할 때 중요한 커밋을 숨겨 문제를 해결할 가능성이 높습니다.항상 다음을 사용--full-history이 사용 사례에 대한 플래그입니다.

파일을 삭제한 마지막 커밋을 다음과 같이 찾을 수 있습니다.

git rev-list -n 1 HEAD -- [file_path]

자세한 정보는 여기에서 확인할 수 있습니다.

Git 로그이지만 경로 앞에 다음을 추가해야 합니다.--

예:

dan-mac:test dani$ git log file1.txt
fatal: ambiguous argument 'file1.txt': unknown revision or path not in the working tree.

dan-mac:test dani$ git log -- file1.txt
 commit 0f7c4e1c36e0b39225d10b26f3dea40ad128b976
 Author: Daniel Palacio <danpal@gmail.com>
 Date:   Tue Jul 26 23:32:20 2011 -0500

 foo

regexp를 사용하여 삭제된 파일의 커밋을 찾을 수 있는 솔루션(저장소에 있는 모든 삭제된 파일을 나열하는 방법이 있습니까?)을 추가했습니다.

git log --diff-filter=D --summary | sed -n '/^commit/h;/\/some_dir\//{G;s/\ncommit \(.*\)/ \1/gp}'

이름이 지정된 디렉토리 내에서 삭제된 모든 항목을 반환합니다.some_dir(침투).거기에 있는 모든 sed regexp.\/some_dir\/할 것입니다.

OSX(@triplee 및 @keif 덕분)

git log --diff-filter=D --summary | sed -n -e '/^commit/h' -e '\:/:{' -e G -e 's/\ncommit \(.*\)/ \1/gp' -e }

이 명령은 나에게 효과가 없었습니다.

git log --full-history -1 -- [file path]

작동한 명령은 다음과 같습니다.

git log --follow -- [file path]

이것은 나에게 도움이 됩니다.

git log -- **/Myfile.cs

--full-history switch를 포함하면 파일과 관련 없는 많은 변경 사항이 표시됩니다.왜 그런지 모르겠어요.

시도:

git log --stat | grep file

정확한 파일 이름을 기억하지 못하는 경우에도 디렉터리에 대해 동일한 작업을 수행할 수 있습니다.삭제가 발생한 커밋을 찾아 그 전에 커밋을 체크아웃합니다.

git log -- the/dir/where/things/got/deleted/

언급URL : https://stackoverflow.com/questions/6839398/find-when-a-file-was-deleted-in-git

반응형