힘내 로그 날짜 형식을 변경하는 방법


150

Git 내에서 마지막 커밋을 표시하려고하지만 특수 형식의 날짜가 필요합니다.

로그 형식 %ad--date형식과 관련 이 있다는 것을 알고 있지만 --date찾을 수 있는 유일한 형식은 "짧음"입니다. 나는 다른 사람들을 알고 싶어하며 다음과 같은 사용자 정의 항목을 만들 수 있는지 여부를 알고 싶습니다.

git -n 1 --date=**YYMMDDHHmm** --pretty=format:"Last committed item in this release was by %%an, %%aD, message: %%s(%%h)[%%d]"

1
저는 항상 공식 Linux Kernel Git 문서 가 이런 종류의 질문에 대한 훌륭한 자료임을 알고 있습니다.

2
참고 : 지금 (2014 년 11 월, Git 2.2) 가지고있는 내용 --date=iso-strict: 아래 답변을
VonC

4
git 2.7 (Q4 2015)을 사용하면 모든 날짜 형식에 현지 시간대 를 사용하도록 요청할 수 있습니다 ! 아래 내 답변을 참조하십시오 . 의 의미 --date=(relative|local|default|iso|iso-strict|rfc|short|raw)는 다음과 같습니다.--date=(relative-local|default-local|iso-local|iso-strict-local|rfc-local|short-local|raw-local)
VonC

답변:


167

다른 사람은 (에서 git help log) :

--date=(relative|local|default|iso|rfc|short|raw)
  Only takes effect for dates shown in human-readable format,
  such as when using "--pretty".  log.date config variable
  sets a default value for log command’s --date option.

--date=relative shows dates relative to the current time, e.g. "2 hours ago".

--date=local shows timestamps in user’s local timezone.

--date=iso (or --date=iso8601) shows timestamps in ISO 8601 format.

--date=rfc (or --date=rfc2822) shows timestamps in RFC 2822 format,
  often found in E-mail messages.

--date=short shows only date but not time, in YYYY-MM-DD format.

--date=raw shows the date in the internal raw git format %s %z format.

--date=default shows timestamps in the original timezone
  (either committer’s or author’s).

사용자 정의 형식을 만드는 기본 방법은 없지만 쉘 마법을 수행 할 수 있습니다.

timestamp=`git log -n1 --format="%at"`
my_date=`perl -e "print scalar localtime ($timestamp)"`
git log -n1 --pretty=format:"Blah-blah $my_date"

첫 번째 단계는 밀리 초 타임 스탬프입니다. 그러나 원하는 타임 스탬프 형식을 지정하기 위해 두 번째 줄을 변경할 수 있습니다. 이 예제는 --date=local패딩 일과 비슷한 것을 제공합니다 .


매번 입력하지 않고 영구적 인 효과를 원한다면

git config log.date iso 

또는이 계정의 모든 자식 사용법에 영향을 미치기 위해

git config --global log.date iso

15
매번 이것을 입력하지 않고 영구적 인 효과를 원한다면 git config log.date iso이 계정으로 모든 자식 사용법에 영향을 미치거나 비슷한 효과를 시도해보십시오git config --global log.date iso
Stéphane Gourichon

12
자신의 형식을 사용할 수 있습니다. Ben Allred의 답변을 참조하십시오 . strftime으로 --format:<args>전달 <args>됩니다.
Captain Man

190

이외에도 --date=(relative|local|default|iso|iso-strict|rfc|short|raw)다른 사람들이 언급했듯이 사용자 정의 로그 날짜 형식을

--date=format:'%Y-%m-%d %H:%M:%S'

이것은 다음과 같은 것을 출력합니다 2016-01-13 11:32:13.

참고 : 아래에 연결된 커밋을 살펴보면 적어도 Git v2.6.0-rc0이것이 작동 해야한다고 생각합니다 .

전체 명령에서 다음과 같습니다.

git config --global alias.lg "log --graph --decorate 
-30 --all --date-order --date=format:'%Y-%m-%d %H:%M:%S' 
--pretty=format:'%C(cyan)%h%Creset %C(black bold)%ad%Creset%C(auto)%d %s'" 

나는 어디서나 문서에서 이것을 찾을 수 없었습니다.

이것에 대한 문서를 검색 하면서 형식이 직접 제공되었음을 나타내는 Git 자체에 대한 커밋을 발견 했습니다strftime . 찾은 자리 표시자를 찾고 strftime( 여기 또는 여기 ) 나열된 자리 표시 자와 일치합니다.

자리 표시 자에는 다음이 포함됩니다.

%a      Abbreviated weekday name
%A      Full weekday name
%b      Abbreviated month name
%B      Full month name
%c      Date and time representation appropriate for locale
%d      Day of month as decimal number (01 – 31)
%H      Hour in 24-hour format (00 – 23)
%I      Hour in 12-hour format (01 – 12)
%j      Day of year as decimal number (001 – 366)
%m      Month as decimal number (01 – 12)
%M      Minute as decimal number (00 – 59)
%p      Current locale's A.M./P.M. indicator for 12-hour clock
%S      Second as decimal number (00 – 59)
%U      Week of year as decimal number, with Sunday as first day of week (00 – 53)
%w      Weekday as decimal number (0 – 6; Sunday is 0)
%W      Week of year as decimal number, with Monday as first day of week (00 – 53)
%x      Date representation for current locale
%X      Time representation for current locale
%y      Year without century, as decimal number (00 – 99)
%Y      Year with century, as decimal number
%z, %Z  Either the time-zone name or time zone abbreviation, depending on registry settings
%%      Percent sign

전체 명령에서 그것은 다음과 같습니다

git config --global alias.lg "log --graph --decorate -30 --all --date-order --date=format:'%Y-%m-%d %H:%M:%S' --pretty=format:'%C(cyan)%h%Creset %C(black bold)%ad%Creset%C(auto)%d %s'" 

4
@ 시바 : 최근에 작동하지 않는 사례가 발생하여 실행중인 것과 똑같을 수 있습니다. 구 버전의 Git과 페어링 머신을 사용하고있었습니다. Git을 업데이트하면 사용자 정의 날짜 형식이 작동하기 시작했습니다. 위의 커밋을 살펴보면 적어도 v2.6.0-rc0이 필요하다고 생각합니다. 주어진 예는 정확히 내가 사용하는 것입니다. 전체 명령에서 그것은 다음과 같을 것입니다git config --global alias.lg "log --graph --decorate -30 --all --date-order --date=format:'%Y-%m-%d %H:%M:%S' --pretty=format:'%C(cyan)%h%Creset %C(black bold)%ad%Creset%C(auto)%d %s'"
Ben Allred

1
고마워 벤! 나는 당신의 명령을 그대로 붙여 넣고 실행했는데 git lg여전히 다음과 같은 오류가 발생합니다. fatal: unknown date format format:%Y-%m-%d %H:%M:%S. Windows에서 git을 실행 중입니다. 여기 내 자식 버전이 있습니다. git version 1.9.5.msysgit.1. 최신 버전으로 업그레이드해야합니까?
Shiva

안녕 벤, 나는 이전 버전에 있었다. 나는 최신으로 업그레이드했고 이것이 작동합니다. 그래서 귀하의 답변을 더 명확하게하기 위해 편집하고 (댓글을 맨 위로 이동) +1했습니다! 감사!!
Shiva

이것은 치료를 작동합니다! 간단한 bash 스크립트를 사용하여 CSV를 내 보내면 이제 년, 월, 주 등의 열을 가질 수 있습니다. 좋아합니다.
Jamie Taylor

1
@EdRandall : 당신이 말하고 있다면 %X~~ 방금 내 컴퓨터에서 시도해 보았고 내 시간대에서 시간을 확실히 얻었습니다. ~~ 흠, 확실하지 않습니다. 시간대에없는 사람의 레포를 복제하고 다시 시도했습니다. 현재 로케일 설정을 사용하여 시간 형식을 지정하고 시간대를 뺀 것 같습니다.
벤 Allred

36

git log에서 YYYY-MM-DD작동하는 방식으로 형식으로 날짜를 출력 하는 방법을 찾고 오랜 시간을 보낸 후에 다음 형식 을 찾았 less습니다.

%ad%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08

스위치와 함께 --date=iso.

이렇게하면 날짜가 ISO 형식 (긴 것)으로 인쇄 된 다음 백 스페이스 문자 (0x08)의 14 배가 인쇄되어 내 터미널에서 YYYY-MM-DD 부분 이후의 모든 것을 효과적으로 제거합니다. 예를 들면 다음과 같습니다.

git log --date=iso --pretty=format:'%ad%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%aN %s'

이것은 다음과 같은 것을 제공합니다 :

2013-05-24 bruno This is the message of the latest commit.
2013-05-22 bruno This is an older commit.
...

내가 한 것은 l위 형식에 약간의 수정이 붙은 별칭을 만드는 것 입니다. 커밋 그래프가 왼쪽에 표시되고 커밋의 해시와 날짜, 짧은 이름, 참조 이름 및 제목이 차례로 표시됩니다. 별명은 다음과 같습니다 (~ / .gitconfig).

[alias]
        l = log --date-order --date=iso --graph --full-history --all --pretty=format:'%x08%x09%C(red)%h %C(cyan)%ad%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08 %C(bold blue)%aN%C(reset)%C(bold yellow)%d %C(reset)%s'

2
이것은 나를 위해 아주 잘 작동합니다. % x08 중 6을 사용하면 후행 시간대가 정확하게 제거됩니다.
Penghe Geng 2016

7
어때--date=short shows only date but not time, in YYYY-MM-DD format.
Paaske

3
zsh와 bash에서 이것은 터미널에서의 출력을 보여 주지만, 어떤 것을 파이프하면 "백 스페이스"데이터가 여전히 존재합니다. 이것은 | sort | uniq작동하지 않는 것과 같은 것을 의미 합니다.
chmac

5
이것은 동시에 우스꽝스럽고 굉장합니다. %C(bold cyan)%ai%x08%x08%x08%x08%x08%x08%x08%x08%x08%C(reset) %C(bold green)(%ar%x08%x08%x08%x08)%C(reset)형식을 얻는 데 사용 하고 2015-01-19 11:27 (11 days)있습니다. +1
naught101

2
이제이 답변 stackoverflow.com/a/34778736/907576 이 더 적합합니다 (Git v2.6.0-rc0부터)
radistao

25

필드 잘림 옵션을 사용하면 너무 많은 %x08문자 를 피할 수 있습니다 . 예를 들면 다음과 같습니다.

git log --pretty='format:%h %s%n\t%<(12,trunc)%ci%x08%x08, %an <%ae>'

다음과 같습니다.

git log --pretty='format:%h %s%n\t%ci%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08, %an <%ae>'

그리고 눈에 약간 더 쉽습니다.

더 나은 아직,이 특정 예를 들어, 사용 %cd을 존중한다는 --date=<format>당신이 원하는 경우에, 그래서 YYYY-MM-DD, 당신이하고 피하는 할 수 %<%x08전체를 :

git log --date=short --pretty='format:%h %s%n\t%cd, %an <%ae>'

방금 이것이 원래 게시물과 관련하여 약간 원형이라는 것을 알았지 만 다른 사람들이 내가했던 것과 동일한 검색 매개 변수로 여기에 도착한 경우 그대로 두겠습니다.


23

나는 똑같은 것이 필요했고 나를 위해 다음과 같은 것을 발견했다.

git log -n1 --pretty='format:%cd' --date=format:'%Y-%m-%d %H:%M:%S'

--date=format(가) 어디에 날짜 출력 형식을 --pretty인쇄하는 것을 말한다.


2
이것은 나를 위해 작동하지 않습니다. "알 수없는 날짜 형식"을 얻었습니다
Ray

어떤 버전의 자식이 있습니까?
lac_dev


git log --pretty=format:"%h%x09%cd%x09%s" --date=format:'%Y-%m-%d %H:%M:%S %p'
아마추어 바리 스타

마지막 커밋을 표시하지 않는 @amateurbarista는 요청을 읽으십시오. ar3은 마지막 커밋이 아닌 마지막 커밋을 표시하려고합니다.
lac_dev

16

" date=iso"형식에 유의하십시오 . 정확히 ISO 8601 이 아닙니다 . Git 2.2.0 (2014 년 11 월)에 대한 Beat Bolli ( )의
커밋 " 466fb67 " 참조bbolli

pretty : 엄격한 ISO 8601 날짜 형식을 제공하십시오

Git의 "ISO"날짜 형식은 약간의 차이로 인해 실제로 ISO 8601 표준을 따르지 않으며 XML 도구 체인과 같은 ISO 8601 전용 파서로는 파싱 할 수 없습니다.

" --date=iso" 의 출력은 다음과 같은 방식으로 ISO 8601과 다릅니다.

  • T날짜 / 시간 분리 문자 대신 공백
  • 시간대와 시간대
  • 시간대의 시간과 분 사이에 콜론 없음

커미터 및 작성자 날짜를 표시하기 위해 엄격한 ISO 8601 날짜 형식을 추가하십시오.
' %aI'및 ' %cI'형식 지정자를 사용하고 ' --date=iso-strict'또는 ' --date=iso8601-strict'날짜 형식 이름을 추가하십시오.

토론하려면 이 스레드 를 참조하십시오 .


11
date -d @$(git log -n1 --format="%at") +%Y%m%d%H%M

유스 케이스에 중요한 경우 현지 시간대로 변환됩니다.


감사. 나는 그것을 % ct로 ​​조정했다
cagney

5

Git 2.7 (2015 년 4 분기)이 -local지침으로 소개 됩니다.
다음과 같은 의미입니다.

--date=(relative|local|default|iso|iso-strict|rfc|short|raw)

당신은 또한 :

--date=(default-local|iso-local|iso-strict-local|rfc-local|short-local)

-local접미사는 사용할 수 없습니다 rawrelative. 참조 .

이제 현지 시간대를 사용하여 날짜 형식 요청할 수 있습니다 . 보다

Jeff King ( )의 commit add00ba , commit 547ed71 (2015 년 9 월 3 일)을 참조하십시오 . (가 합병 - Junio C 하마노 -7b09c45 커밋 2015 05 시월)peff
gitster

특히 위에서 마지막 (commit add00ba)은 다음과 같습니다.

date: 만들기 "local "를 날짜 형식과 직교로 :

" --date"모드 의 대부분은 날짜 형식에 관한 것입니다 : 어떤 항목을 어떤 순서로 표시합니다.
그러나 " --date=local"은 약간의 괴짜입니다. "표준 형식으로 날짜를 표시하지만 현지 시간대를 사용하여"를 의미합니다.
우리가 사용하는 시간대는 실제 형식과 직교하므로 "localized iso8601"등을 가질 수없는 이유는 없습니다.

이 패치는 " local"부울 필드를 " struct date_mode"에 추가 DATE_LOCAL하고 date_mode_type열거 에서 요소를 삭제합니다 (이제 DATE_NORMAL플러스입니다 local=1).
새 기능은 -local날짜 모드 (예 : " iso-local")에 " "를 추가하여 사용자가 액세스 할 수 있으며 이전 버전과의 호환성을 local위해 " default-local" 의 별칭으로 " "을 유지합니다.


2
나는 format-local작품들도 주목해야한다 ! 따라서 좋아하는 형식과 로컬 형식 사이의 힘을 통합하는 것이 매우 완벽합니다.
acgtyrant

5

형식 옵션 %ai은 내가 원했던 것입니다.

%ai: 작성자 날짜, ISO 8601과 같은 형식

--format="%ai"

5

특별한 형식의 날짜가 필요합니다.

Git 2.21 (2019 년 1 분기)에서는 현재 시간과 시간이 얼마나 다른지에 따라 출력--date=human 을 변경 하는 새로운 날짜 형식 " " 이 도입되었습니다 .

" --date=auto"를 사용하면 출력이 호출기 나 터미널로 이동하거나 기본 형식이 아닌 경우이 새로운 형식을 사용할 수 있습니다.

참조 110a6a1 커밋 , b841d4f 커밋 (2019년 1월 29일을), 및 038a878 커밋 , 2fd7c22 커밋 에 의해 (2019년 1월 21일를) 스티븐 P. 스미스 (``) . Linus Torvalds ( )의 commit acdd377 (2019 년 1 월 18 일)을
참조하십시오 . (의해 병합 Junio C 하마노 - -커밋 ecbe1be 07 이월 2019)torvalds
gitster

'휴먼'날짜 형식 문서 추가

사람들이 다른 상황에서 날짜를 쓰는 방식과 유사한 형식으로 날짜 및 시간 정보를 표시합니다.
연도가 지정되지 않은 경우 독자는 주어진 날짜가 현재 연도임을 유추합니다 .

중복 정보를 표시하지 않으면 독자는 다른 정보에 집중합니다 .
패치 git는 명령이 실행될 때 명령을 실행하는 머신의 날짜에서 유추 된 정보를 기반으로 상대 날짜를보고합니다 .

형식은 유추 된 정보를 삭제하여 사람에게 더 유용하지만 실제로 사람을 만드는 것은 없습니다.
' relative'날짜 형식이 아직 구현되지 않았다면 ' relative' 를 사용하는 것이 적절했을 것입니다.

human날짜 형식 테스트를 추가하십시오 .

사용시 human여러 필드는 기준 일자 및 로컬 컴퓨터 일 사이의 시간 차이에 따라 억제된다.

  • 차이가 1 년 미만인 경우 연도 필드가 억제됩니다.
  • 시간이 하루 미만인 경우; 월과 연도가 억제됩니다.
check_date_format_human 18000       "5 hours ago"       #  5 hours ago
check_date_format_human 432000      "Tue Aug 25 19:20"  #  5 days ago
check_date_format_human 1728000     "Mon Aug 10 19:20"  #  3 weeks ago
check_date_format_human 13000000    "Thu Apr 2 08:13"   #  5 months ago
check_date_format_human 31449600    "Aug 31 2008"       # 12 months ago
check_date_format_human 37500000    "Jun 22 2008"       #  1 year, 2 months ago
check_date_format_human 55188000    "Dec 1 2007"        #  1 year, 9 months ago
check_date_format_human 630000000   "Sep 13 1989"       # 20 years ago

## 제안 된 ' auto'모드를 ' auto:'로 바꾸십시오.

human패치 는 ' '형식 을 추가하는 것 외에도 auto사람 형식을 지정하는 다른 방법으로 구성 파일에서 사용할 수있는 키워드를 추가했습니다 . 'auto'를 제거하면 ' human'형식 인터페이스가 정리됩니다 .

구문 foo분석기를 사용하여 호출기를 사용중인 경우 ' ' 모드를 지정하는 기능이 추가되었습니다 auto:foo.
따라서 호출기를 사용하는 경우 ' auto:human'날짜 모드가 기본적으로 human사용됩니다.
그래서 당신은 할 수 있습니다 :

git config --add log.date auto:human

" git log"명령은 스크립트를 작성하지 않는 한 사람이 읽을 수있는 형식을 보여줍니다.


Git 2.24 (2019 년 4 분기)는 코드를 단순화했습니다.

참조 47b27c9 커밋 , 29f4332 커밋 에 의해 (2019년 9월 12일를) (``) 스티븐 P. 스미스 .
(가 합병 - Junio C 하마노 gitster-36d2fca 커밋 2019 07 시월)

날짜 코드에 '지금'을 전달하지 마십시오

커밋 b841d4f ( human테스트 도구에 형식 추가 , 2019-01-28, Git v2.21.0-rc0) 는 환경에서 현재 시간을 무시할 get_time()수 있는 기능을 추가했습니다 $GIT_TEST_DATE_NOW.
따라서 더 이상에서 해당 변수를 해석 할 필요가 없습니다 cmd__date().

따라서 now아무도 사용하지 않기 때문에 날짜 함수에 " "매개 변수를 전달하는 것을 중지 할 수 있습니다.
" now"매개 변수를 사용한 이전의 모든 발신자 가 올바르게 사용 하고 있는지 확인해야합니다 get_time().


2
git log -n1 --format="Last committed item in this release was by %an, `git log -n1 --format=%at | awk '{print strftime("%y%m%d%H%M",$1)}'`, message: %s (%h) [%d]"

정교하게 관리? 또한 귀하의 답변에는 이미 저자 필드와 기록이 있습니다. 서명 할 필요가 없습니다.
사키

2

Bash와 date 명령을 사용하여 ISO와 같은 형식에서 원하는 형식으로 변환하십시오. 조직 모드 날짜 형식 (및 목록 항목)을 원했기 때문에 다음과 같이했습니다.

echo + [$(date -d "$(git log --pretty=format:%ai -1)" +"%Y-%m-%d %a %H:%M")] \
    $(git log --pretty=format:"%h %s" --abbrev=12 -1)

결과는 다음과 같습니다.

+ [2015-09-13 Sun 22:44] 2b0ad02e6cec Merge pull request #72 from 3b/bug-1474631
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.