자식 저장소에있는 모든 파일의 마지막 수정 날짜를 검색하는 방법


64

git 저장소에서 단일 파일의 마지막 수정 날짜를 검색하는 방법을 알고 있습니다.

git log -1 --format="%ad" -- path/to/file

현재 리포지토리에있는 모든 파일에 대해 간단하고 효율적인 방법이 있습니까?

답변:


74

간단한 대답은 각 파일을 반복하고 수정 시간을 표시하는 것입니다.

git ls-tree -r --name-only HEAD | while read filename; do
  echo "$(git log -1 --format="%ad" -- $filename) $filename"
done

결과는 다음과 같습니다.

Fri Dec 23 19:01:01 2011 +0000 Config
Fri Dec 23 19:01:01 2011 +0000 Makefile

분명히이 시점에서 bash 스크립트이기 때문에이를 제어 할 수 있으므로 마음의 내용에 자유롭게 사용자 정의하십시오!


2
하나의 git log 실행에서 결합 된 출력을 얻을 수있는 옵션이 있기를 바랐지만 find를 사용하여 생각한 것보다 답이 낫습니다. 리포지토리에 저장된 파일 만 나열하고 .git 폴더를 건너 뛰고 파일을 무시할 수 있다는 장점이있는 git-ls-tree를 알지 못했습니다. 감사.
Eric Bréchemier

문제 없습니다, Eric; 당신은 내가했던 것과 같은 경로를 따르고 있습니다. 즉, .git 디렉토리를 찾고 무시합니다! :) git plumbing 명령을 사용하는 옵션이있을 수 있지만 솔직히 이것은 꽤 잘 작동합니다. 파일 단위로 정보를 한꺼번에 얻을 수있는 방법을 찾을 수 있다면 가장 효과적 일 것입니다. 그러나 git은 개별 파일의 상태가 아닌 커밋 상태에서 작동합니다.
Andrew M.

11
사람이 읽을 수있는 날짜 대신 정렬 가능한 타임 스탬프를 원하면 --format = "% ai"를 사용하는 것이 좋습니다.
ThorSummoner 2014 년

2
"HEAD"는 참조 일 뿐이므로 태그, 브랜치, 커밋 해시 등 원하는 모든 참조를 사용할 수 있습니다.
Andrew M.

1
@ThorSummoner가 말했듯이 날짜에 % ai 형식을 사용한 다음 파이프를 사용하여 결과를 정렬하십시오.git ls-tree -r --name-only HEAD | while read filename; do echo "$(git log -1 --format="%ai" -- $filename) $filename"; done | sort
John Hunt

21

이 방법은 공백이 포함 된 파일 이름에도 적용됩니다.

git ls-files -z | xargs -0 -n1 -I{} -- git log -1 --format="%ai {}" {}

출력 예 :

2015-11-03 10:51:16 -0500 .gitignore
2016-03-30 11:50:05 -0400 .htaccess
2015-02-18 12:20:26 -0500 .travis.yml
2016-04-29 09:19:24 +0800 2016-01-13-Atlanta.md
2016-04-29 09:29:10 +0800 2016-03-03-Elmherst.md
2016-04-29 09:41:20 +0800 2016-03-03-Milford.md
2016-04-29 08:15:19 +0800 2016-03-06-Clayton.md
2016-04-29 01:20:01 +0800 2016-03-14-Richmond.md
2016-04-29 09:49:06 +0800 3/8/2016-Clayton.md
2015-08-26 16:19:56 -0400 404.htm
2016-03-31 11:54:19 -0400 _algorithms/acls-bradycardia-algorithm.htm
2015-12-23 17:03:51 -0500 _algorithms/acls-pulseless-arrest-algorithm-asystole.htm
2016-04-11 15:00:42 -0400 _algorithms/acls-pulseless-arrest-algorithm-pea.htm
2016-03-31 11:54:19 -0400 _algorithms/acls-secondary-survey.htm
2016-03-31 11:54:19 -0400 _algorithms/acls-suspected-stroke-algorithm.htm
2016-03-31 11:54:19 -0400 _algorithms/acls-tachycardia-algorithm-stable.htm
...

| sort마지막 에 추가 하여 수정 타임 스탬프별로 출력을 정렬 할 수 있습니다 .

git ls-files -z | xargs -0 -n1 -I{} -- git log -1 --format="%ai {}" {} | sort

수정 타임 스탬프별로 정렬 할 수있는 방법이 있습니까?
Amelio Vazquez-Reina

1
@ AmelioVazquez-Reina : 그냥 추가`| 명령이 끝날 때까지 정렬합니다.
dotancohen

2
이것은 작동하지만 loooong 시간이 걸립니다 ...
Guillochon

5

이것은 Andrew M.의 대답을 약간 조정 한 것입니다. (나는 그의 답변에 대해 언급 할 수 없었다.)

공백이 포함 된 파일 이름을 지원 하려면 첫 번째 $ filename을 큰 따옴표로 묶습니다 .

git ls-tree -r --name-only HEAD | while read filename; do
    echo "$(git log -1 --format="%ad" -- "$filename") $filename"
done

샘플 출력 :

Tue Jun 21 11:38:43 2016 -0600 subdir/this is a filename with spaces.txt

Andrew의 솔루션 ( ls-tree 기반 )이 베어 리포지토리와 함께 작동 한다는 것에 감사드립니다 ! (ls 파일을 사용하는 솔루션에는 해당되지 않습니다.)


에코를 건너 뛸 수도 있습니다. git log -1 --format = "% ad $ filename"
Kevin Lyda

0

다음은 물고기를 사용하는 사람들을위한 Andrew M의 답변의 생선 껍질 버전입니다.

git ls-tree -r --name-only HEAD | while read -l filename
    printf '%s %s\n' (git log -1 --format="%ai" -- $filename) $filename
end

나는 이것을 쉽게 접근 할 수 있도록 물고기 함수로 저장합니다.


0

Andrew M의 대답은 Windows와 PowerShell을 사용하는 사람들에게는 컴퓨터에서 읽을 수있는 조정 기능이 있습니다.

git ls-tree -r --name-only HEAD | ForEach-Object { "$(git log -1 --format="%ai" -- "$_")`t$_" }

출력 예 :

2019-05-07 12:00:37 -0500   .editorconfig
2016-07-13 14:03:49 -0500   .gitattributes
2019-05-07 12:00:37 -0500   .gitignore
2018-02-03 22:01:17 -0600   .mailmap
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.