Cách thay đổi định dạng ngày đăng nhập Git


150

Tôi đang cố gắng hiển thị cam kết cuối cùng trong Git, nhưng tôi cần ngày ở định dạng đặc biệt.

Tôi biết rằng định dạng nhật ký khá %adtôn trọng --dateđịnh dạng, nhưng --dateđịnh dạng duy nhất tôi có thể tìm thấy là "ngắn". Tôi muốn biết những người khác và liệu tôi có thể tạo một tùy chỉnh như:

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

1
Tôi luôn thấy tài liệu Linux Kernel Git chính thức là một tài nguyên tuyệt vời cho các loại câu hỏi này.

2
Lưu ý: bạn bây giờ (tháng 11 năm 2014, Git 2.2) có --date=iso-strict: xem câu trả lời của tôi bên dưới
VonC

4
Với git 2.7 (Q4 2015), bạn có thể yêu cầu sử dụng múi giờ địa phương cho bất kỳ định dạng ngày nào! Xem câu trả lời của tôi dưới đây . Điều đó có nghĩa là, ngoài ra --date=(relative|local|default|iso|iso-strict|rfc|short|raw), bạn cũng sẽ có:--date=(relative-local|default-local|iso-local|iso-strict-local|rfc-local|short-local|raw-local)
VonC

Câu trả lời:


167

Những người khác là (từ 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).

Không có cách tích hợp nào mà tôi biết để tạo định dạng tùy chỉnh, nhưng bạn có thể thực hiện một số phép thuật vỏ.

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

Bước đầu tiên ở đây giúp bạn có dấu thời gian một phần nghìn giây. Bạn có thể thay đổi dòng thứ hai để định dạng dấu thời gian đó theo cách bạn muốn. Ví dụ này cung cấp cho bạn một cái gì đó tương tự --date=local, với một ngày đệm.


Và nếu bạn muốn có hiệu ứng vĩnh viễn mà không cần gõ này mỗi lần, hãy thử

git config log.date iso 

Hoặc, để có hiệu lực đối với tất cả việc sử dụng git của bạn với tài khoản này

git config --global log.date iso

15
Và nếu bạn muốn có hiệu ứng vĩnh viễn mà không cần gõ cái này mỗi lần, hãy thử một cái gì đó như git config log.date isohoặc, để có hiệu lực đối với tất cả việc sử dụng git của bạn với tài khoản nàygit config --global log.date iso
Stéphane Gourichon 13/03/2016

12
Bạn có thể sử dụng các định dạng của riêng bạn. xem câu trả lời của Ben Allred . --format:<args>sẽ vượt qua <args>để thoát khỏi.
Thuyền trưởng Man

190

Ngoài ra --date=(relative|local|default|iso|iso-strict|rfc|short|raw), như những người khác đã đề cập, bạn cũng có thể sử dụng định dạng ngày đăng nhập tùy chỉnh với

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

Điều này xuất ra một cái gì đó như 2016-01-13 11:32:13.

LƯU Ý: Nếu bạn xem qua cam kết được liên kết bên dưới, tôi tin rằng ít nhất bạn sẽ cần Git v2.6.0-rc0điều này để hoạt động.

Trong một lệnh đầy đủ, nó sẽ là một cái gì đó như:

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'" 

Tôi chưa thể tìm thấy tài liệu này ở bất cứ đâu (nếu ai đó biết tìm nó ở đâu, vui lòng bình luận) vì vậy ban đầu tôi đã tìm thấy các trình giữ chỗ bằng cách dùng thử và lỗi.

Trong quá trình tìm kiếm tài liệu về điều này, tôi đã tìm thấy một cam kết với chính Git cho biết định dạng được cung cấp trực tiếp strftime. Nhìn lên strftime( ở đây hoặc ở đây ) các trình giữ chỗ tôi tìm thấy khớp với các trình giữ chỗ được liệt kê.

Các phần giữ chỗ bao gồm:

%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

Trong một lệnh đầy đủ, nó sẽ giống như

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
@Shiva: Gần đây tôi đã gặp phải một trường hợp không hoạt động và nó có thể giống với điều bạn đang gặp phải. Tôi đang sử dụng máy ghép nối với phiên bản Git cũ hơn. Khi tôi cập nhật Git, định dạng ngày tùy chỉnh bắt đầu hoạt động. Nếu bạn xem cam kết được liên kết ở trên, tôi tin rằng bạn sẽ cần ít nhất v2.6.0-rc0. Ví dụ đưa ra là chính xác những gì tôi sử dụng. Trong một lệnh đầy đủ, nó sẽ giống như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
Cảm ơn Ben! Tôi đã dán lệnh của bạn như hiện tại và chạy git lgvà tôi vẫn nhận được lỗi sau. fatal: unknown date format format:%Y-%m-%d %H:%M:%S. Tôi đang chạy git trên windows. Đây là phiên bản git của tôi. git version 1.9.5.msysgit.1. Vậy tôi có phải nâng cấp lên phiên bản mới hơn không?
Shiva

Xin chào Ben, tôi đã ở phiên bản cũ hơn. Tôi đã nâng cấp lên mới nhất và điều này hoạt động. Vì vậy, tôi đã chỉnh sửa câu trả lời của bạn để làm cho nó rõ ràng hơn (chuyển bình luận của bạn lên đầu trang) và cả + 1-ed bạn! Cảm ơn!!
Shiva

Điều này làm việc một điều trị! Sử dụng một tập lệnh bash đơn giản để xuất một csv, bây giờ tôi có thể có các cột cho năm, tháng, tuần, v.v. Yêu nó.
Jamie Taylor

1
@EdRandall: Nếu bạn đang đề cập đến %X, ~ ~ Tôi vừa thử nó trên máy của mình và chắc chắn nhận được thời gian trong múi giờ của tôi. ~ ~ Hmm, bây giờ tôi không chắc chắn. Tôi đã nhân bản một repo từ một người không thuộc múi giờ của mình và thử lại. Tôi nghĩ rằng tôi chỉ nhận được thời gian được định dạng bằng cách sử dụng cài đặt ngôn ngữ hiện tại nhưng với múi giờ bị tắt.
Ben Allred

36

Sau một thời gian dài tìm cách để có được git logđầu ra ngày ở định dạng YYYY-MM-DDtheo cách sẽ hoạt động less, tôi đã đưa ra định dạng sau:

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

cùng với công tắc --date=iso.

Điều này sẽ in ngày ở định dạng ISO (dài) và sau đó in 14 lần ký tự backspace (0x08), trong thiết bị đầu cuối của tôi, loại bỏ hiệu quả mọi thứ sau phần YYYY-MM-DD. Ví dụ:

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

Điều này mang lại một cái gì đó như:

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

Những gì tôi đã làm là tạo một bí danh có tên lvới một số điều chỉnh về định dạng ở trên. Nó hiển thị biểu đồ cam kết ở bên trái, sau đó là hàm băm của cam kết, tiếp theo là ngày, tên viết tắt, tên gọi và chủ đề. Bí danh như sau (trong ~ / .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
Điều này làm việc rất tốt cho tôi. Sử dụng 6 trên% x08 sẽ loại bỏ chính xác múi giờ theo dõi đối với tôi.
Penghe Geng

7
Thế còn--date=short shows only date but not time, in YYYY-MM-DD format.
Paaske

3
Trong zsh và bash, điều này cho thấy bạn xuất ra trên thiết bị đầu cuối, nhưng nếu bạn đưa nó vào bất cứ thứ gì, dữ liệu "backspaces" vẫn còn đó. Điều này có nghĩa là những thứ như | sort | uniqkhông hoạt động.
chmac

5
Điều này là vô lý và tuyệt vời cùng một lúc. Tôi đang sử dụng %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)để có được định dạng 2015-01-19 11:27 (11 days). +1
ness101

2
bây giờ câu trả lời này stackoverflow.com/a/34778736/907576 phù hợp hơn (kể từ Git v2.6.0-rc0)
radistao

25

Bạn có thể sử dụng tùy chọn cắt ngắn trường để tránh khá nhiều %x08ký tự. Ví dụ:

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

tương đương với:

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>'

Và khá dễ dàng hơn trên mắt.

Vẫn tốt hơn, đối với ví dụ cụ thể này, việc sử dụng %cdsẽ tôn vinh --date=<format>, vì vậy nếu bạn muốn YYYY-MM-DD, bạn có thể làm điều này và tránh %<%x08hoàn toàn:

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

Tôi chỉ nhận thấy đây là một chút thông tin liên quan đến bài viết gốc nhưng tôi sẽ để nó trong trường hợp những người khác đến đây với cùng thông số tìm kiếm tôi đã làm.


23

Tôi cần điều tương tự và tìm thấy những điều sau đây làm việc cho tôi:

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

Các --date=formatđịnh dạng đầu ra ngày trong đó --prettycho biết những gì cần in.


2
Điều này không làm việc cho tôi. Tôi nhận được "định dạng ngày không xác định"
Ray

bạn có phiên bản nào của git?
lac_dev


git log --pretty=format:"%h%x09%cd%x09%s" --date=format:'%Y-%m-%d %H:%M:%S %p'
barista nghiệp dư

@am Nghiệpbarista không hiển thị cam kết cuối cùng, hãy đọc yêu cầu. ar3 đang cố gắng thể hiện cam kết cuối cùng, chứ không phải vài cam kết cuối cùng.
lac_dev

16

Lưu ý về date=isođịnh dạng "": nó không chính xác là ISO 8601 .
Xem cam kết " 466fb67 " từ Beat Bolli ( bbolli) , cho Git 2.2.0 (tháng 11 năm 2014)

khá: cung cấp định dạng ngày nghiêm ngặt ISO 8601

Định dạng ngày "ISO" của Git không thực sự phù hợp với tiêu chuẩn ISO 8601 do những khác biệt nhỏ và nó không thể được phân tích cú pháp bởi các trình phân tích cú pháp chỉ ISO 8601, ví dụ như các công cụ XML.

Đầu ra từ " --date=iso" lệch khỏi ISO 8601 theo những cách sau:

  • một khoảng trắng thay cho Tdấu phân cách ngày / giờ
  • một không gian giữa thời gian và múi giờ
  • không có dấu hai chấm giữa giờ và phút của múi giờ

Thêm định dạng ngày ISO 8601 nghiêm ngặt để hiển thị ngày của tác giả và ngày của tác giả.
Sử dụng các chỉ định định dạng ' %aI' và ' %cI' và thêm tên định dạng ngày ' --date=iso-strict' hoặc ' --date=iso8601-strict'.

Xem chủ đề này để thảo luận.


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

Lưu ý rằng điều này sẽ chuyển đổi sang múi giờ địa phương của bạn, trong trường hợp quan trọng đối với trường hợp sử dụng của bạn.


Cảm ơn. Tôi đã điều chỉnh nó với% ct
cagney

5

Git 2.7 (Q4 2015) sẽ giới thiệu -localnhư một hướng dẫn.
Nó có nghĩa là, ngoài:

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

bạn cũng sẽ có:

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

Các -localhậu tố không thể được sử dụng với rawhoặc relative. Tham khảo .

Bây giờ bạn có thể yêu cầu bất kỳ định dạng ngày bằng cách sử dụng múi giờ địa phương . Xem

Xem cam kết add00ba , cam kết 547ed71 (03 tháng 9 năm 2015) bởi Jeff King ( peff) .
(Được hợp nhất bởi Junio ​​C Hamano - gitster- trong cam kết 7b09c45 , ngày 05 tháng 10 năm 2015)

Đặc biệt, đề cập cuối cùng từ phía trên (cam kết add00ba):

date: tạo " local" trực giao cho định dạng ngày:

Hầu hết các --datechế độ "" của chúng tôi là về định dạng của ngày: những mặt hàng chúng tôi hiển thị và theo thứ tự nào.
Nhưng " --date=local" là một chút kỳ quặc. Nó có nghĩa là "hiển thị ngày ở định dạng bình thường, nhưng sử dụng múi giờ địa phương".
Múi giờ chúng tôi sử dụng là trực giao với định dạng thực tế và không có lý do gì chúng tôi không thể có "iso8601 cục bộ", v.v.

Bản vá này thêm " local" trường boolean vào " struct date_mode" và bỏ DATE_LOCALphần tử từ date_mode_typeenum (bây giờ chỉ là DATE_NORMALcộng local=1).
Người dùng có thể truy cập tính năng mới bằng cách thêm " -local" vào bất kỳ chế độ ngày nào (ví dụ: " iso-local") và chúng tôi giữ lại " local" dưới dạng bí danh cho " default-local" để tương thích ngược.


2
Tôi phải lưu ý rằng các format-localcông trình quá! Vì vậy, nó rất hoàn hảo khi hợp nhất sức mạnh giữa định dạng yêu thích và cục bộ.
acgtyrant

5

Tùy chọn định dạng %ailà những gì tôi muốn:

%ai: ngày tác giả, định dạng giống ISO 8601

--format="%ai"

5

Tôi cần ngày ở một định dạng đặc biệt.

Với Git 2.21 (Q1 2019), định dạng ngày mới " --date=human" sẽ điều chỉnh đầu ra của nó tùy thuộc vào khoảng thời gian từ thời điểm hiện tại đã được giới thiệu .

" --date=auto" Có thể được sử dụng để sử dụng định dạng mới này khi đầu ra đi đến máy nhắn tin hoặc đến thiết bị đầu cuối và nếu không thì định dạng mặc định.

Xem cam kết 110a6a1 , cam kết b841d4f (29 tháng 1 năm 2019) và cam kết 038a878 , cam kết 2fd7c22 (21 tháng 1 năm 2019) của Stephen P. Smith (``) .
Xem cam kết acdd377 (18 tháng 1 năm 2019) của Linus Torvalds ( torvalds) .
(Được hợp nhất bởi Junio ​​C Hamano - gitster- trong cam kết ecbe1be , 07 tháng 2 năm 2019)

Thêm tài liệu định dạng ngày của "con người"

Hiển thị thông tin ngày và thời gian theo định dạng tương tự như cách mọi người viết ngày trong các ngữ cảnh khác.
Nếu năm không được chỉ định thì độc giả sẽ ghi ngày được đưa ra là vào năm hiện tại .

Bằng cách không hiển thị thông tin dư thừa, người đọc tập trung vào thông tin khác biệt .
Bản vá báo cáo ngày tương đối dựa trên thông tin được suy ra từ ngày trên máy đang chạy gitlệnh tại thời điểm lệnh được thực thi.

Mặc dù định dạng này hữu ích hơn cho con người bằng cách bỏ thông tin suy luận, nhưng không có gì làm cho nó thực sự là con người.
Nếu relativeđịnh dạng ' ' ngày chưa được triển khai, thì sử dụng ' relative' sẽ phù hợp.

Thêm humankiểm tra định dạng ngày.

Khi sử dụng humanmột số trường bị loại bỏ tùy thuộc vào chênh lệch thời gian giữa ngày tham chiếu và ngày máy tính cục bộ.

  • Trong trường hợp chênh lệch dưới một năm, trường năm bị triệt tiêu.
  • Nếu thời gian ít hơn một ngày; tháng và năm bị đàn áp.
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

## Thay thế autochế độ ' ' được đề xuất bằng ' auto:'

Ngoài việc thêm humanđịnh dạng '', bản vá đã thêm autotừ khóa có thể được sử dụng trong tệp cấu hình như một cách thay thế để chỉ định định dạng của con người. Xóa 'tự động' sẽ dọn sạch humangiao diện định dạng ''.

Đã thêm khả năng chỉ định chế độ ' foo' nếu máy nhắn tin đang được sử dụng bằng cách sử dụng auto:foocú pháp.
Do đó, ' auto:human' chế độ ngày mặc định là humannếu chúng ta đang sử dụng máy nhắn tin.
Vì vậy, bạn có thể làm:

git config --add log.date auto:human

git logcác lệnh " " của bạn sẽ hiển thị định dạng dễ đọc của con người trừ khi bạn viết kịch bản.


Git 2.24 (Q4 2019) đã đơn giản hóa mã.

Xem cam kết 47b27c9 , cam kết 29f4332 (12 tháng 9 năm 2019) của Stephen P. Smith (``) .
(Được hợp nhất bởi Junio ​​C Hamano - gitster- trong cam kết 36d2fca , ngày 07 tháng 10 năm 2019)

Thoát khỏi 'bây giờ' để mã ngày

Cam kết b841d4f (Thêm humanđịnh dạng vào công cụ kiểm tra, 2019-01-28, Git v2.21.0-rc0) đã thêm một get_time()chức năng cho phép $GIT_TEST_DATE_NOWtrong môi trường ghi đè thời gian hiện tại.
Vì vậy, chúng ta không còn cần phải giải thích biến đó trong cmd__date().

Do đó, chúng ta có thể dừng truyền nowtham số "" xuống thông qua các hàm ngày, vì không ai sử dụng chúng.
Lưu ý rằng chúng tôi cần đảm bảo rằng tất cả những người gọi trước đó đã nowsử dụng tham số "" đều được sử dụng đúng 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]"

Quan tâm đến công phu? Ngoài ra, câu trả lời của bạn đã có một trường tác giả và lịch sử. không cần phải ký tên
Kissaki

2

Sử dụng Bash và lệnh date để chuyển đổi từ định dạng giống ISO sang định dạng bạn muốn. Tôi muốn một định dạng ngày chế độ org (và mục danh sách), vì vậy tôi đã làm điều này:

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

Và kết quả là ví dụ:

+ [2015-09-13 Sun 22:44] 2b0ad02e6cec Merge pull request #72 from 3b/bug-1474631
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.