development

두 개의 Git 커밋간에 변경된 모든 파일 목록을 얻는 방법은 무엇입니까?

big-blog 2020. 6. 10. 07:53
반응형

두 개의 Git 커밋간에 변경된 모든 파일 목록을 얻는 방법은 무엇입니까?


관료주의로 인해 보고서를 위해 저장소에 변경된 모든 파일 목록을 가져와야합니다 (기존 소스 코드로 시작).

이 목록을 얻으려면 어떻게해야합니까?


지정된 SHA와 현재 커밋간에 변경된 파일의 경우 :

git diff --name-only <starting SHA> HEAD

또는 아직 커밋되지 않은 변경 파일을 포함하려는 경우 :

git diff --name-only <starting SHA>

보다 일반적으로 다음 구문은 두 커밋간에 변경된 파일 (SHA 또는 다른 이름으로 지정)을 항상 알려줍니다.

git diff --name-only <commit1> <commit2>

마지막 커밋 이후 수정 된 모든 파일의 이름을 찾으려면

git diff --name-only

또는 (추적되지 않은 파일을 포함하여 조금 더 자세한 정보를 위해) :

git status

  • 스테이지되지 않은 추적 된 변경된 파일을 모두 나열하려면 다음을 수행 하십시오.

    git diff --name-only
    
  • 준비된 모든 추적 된 변경된 파일 을 나열하려면

    git diff --name-only --staged
    
  • 모든 스테이지 및 스테이지되지 않은 추적 된 변경된 파일 을 나열하려면 다음을 수행 하십시오.

    { git diff --name-only ; git diff --name-only --staged ; } | sort | uniq
    
  • 추적되지 않은 모든 파일 (에 의해 나열된 파일 git status이므로 무시 된 파일은 포함하지 않음)을 나열 하려면 다음을 수행하십시오 .

    git ls-files --other --exclude-standard
    

쉘 스크립트에서 이것을 사용하고 있고 이러한 명령이 무엇이든 반환했는지 프로그래밍 방식으로 확인하려면 git diff--exit-code옵션에 관심이 있습니다 .


많은 파일을 추가 / 수정 / 삭제하면 (마지막 커밋 이후) 해당 수정 사항을 시간 순으로보고 싶습니다.

이를 위해 나는 다음을 사용합니다.

  • 스테이지되지 않은 모든 파일을 나열하려면 다음을 수행하십시오.

    git ls-files --other --modified --exclude-standard
    
  • 각 파일의 마지막 수정 날짜를 얻으려면

    while read filename; do  echo -n "$(stat -c%y -- $filename 2> /dev/null) "; echo $filename;  done
    
  • 가장 오래된 것부터 최신 것까지 정렬하려면 :

    sort
    

별칭을 사용하면보다 쉽게 ​​사용할 수 있습니다.

alias gstlast='git ls-files --other --modified --exclude-standard|while read filename; do  echo -n "$(stat -c%y -- $filename 2> /dev/null) "; echo $filename;  done|sort'

예를 들면 다음과 같습니다.

username@hostname:~> gstlast
2015-01-20 11:40:05.000000000 +0000 .cpl/params/libelf
2015-01-21 09:02:58.435823000 +0000 .cpl/params/glib
2015-01-21 09:07:32.744336000 +0000 .cpl/params/libsecret
2015-01-21 09:10:01.294778000 +0000 .cpl/_deps
2015-01-21 09:17:42.846372000 +0000 .cpl/params/npth
2015-01-21 12:12:19.002718000 +0000 sbin/git-rcd

이제 가장 오래된 것부터 가장 최근에 이르는 수정 사항을 검토 할 수 있습니다.


두 커밋 사이에 내용이 변경된 파일 목록이 필요하므로 (추가 또는 수정 만) 다음과 같이 사용했습니다.

git diff --name-only --diff-filter=AM <commit hash #1> <commit hash #2>

git diff 문서 와 다른 diff-filter 옵션은 다음과 같습니다.

diff-filter = [(A | C | D | M | R | T | U | X | B)… [[]]

추가 된 파일 (A), 복사 된 파일 (C), 삭제 된 파일 (D), 수정 된 파일 (M), 이름이 변경된 파일 (R) 만 유형 (예 : 일반 파일, 심볼릭 링크, 하위 모듈 등)이 변경된 파일 (T)을 선택하십시오. 병합되지 않음 (U), 알 수 없음 (X) 또는 페어링 끊어짐 (B)이 있습니다. 필터 문자의 조합 (없음 포함)을 사용할 수 있습니다. * (모두 또는 없음)이 조합에 추가되면 비교에서 다른 기준과 일치하는 파일이 있으면 모든 경로가 선택됩니다. 다른 기준과 일치하는 파일이 없으면 아무것도 선택되지 않습니다.

또한이 대문자는 소문자로 제외 할 수 있습니다. 예를 들어 --diff-filter = ad는 추가 및 삭제 된 경로를 제외합니다.

상태 (예 : A / M)도 나열하려면로 변경 --name-only하십시오 --name-status.


다음 git status과 같은 grep명령을 사용하여 비 단계적 수정 목록을 얻을 수 있습니다 . 같은 것 git status -s | grep M:

root@user-ubuntu:~/project-repo-directory# git status -s | grep '^ M'
 M src/.../file1.js
 M src/.../file2.js
 M src/.../file3.js
 ....

함께 git show사용하면 비슷한 결과를 얻을 수 있습니다. git log포함 된 파일 목록이 있는 커밋 ( 보기에 보이는 것처럼)을 보려면 다음을 사용하십시오.

git show --name-only [commit-id_A]^..[commit-id_B]

[commit-id_A]초기 커밋은 어디에 있고 [commit-id_B]표시하려는 것보다 마지막 커밋입니다.

특별한주의^기호. 이를 넣지 않으면 commit-id_A 정보가 배포되지 않습니다.


변경된 파일을 확인하려면 변경 한 파일 중 어떤 것이 변경되었는지 확인하려는 경우와 같이 사용하기 가장 좋은 작은 것들을 처리해야합니다.

git status -- it will show the files with changes

then if you want to know what changes are to be made it can be checked in ways ,

git diff -- will show all the changes in all files

it is good only when only one file is modified

and if you want to check particular file then use

git diff

참고URL : https://stackoverflow.com/questions/5096268/how-to-get-a-list-of-all-files-that-changed-between-two-git-commits

반응형