Gitログの日付形式を変更する方法


150

Git内で最後のコミットを表示しようとしていますが、特別な形式の日付が必要です。

log prettyフォーマット%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カーネルGit公式ドキュメントは、常にこの種の質問に対する優れたリソースであると思います。

2
注:あなたは今(2014年11月、Git 2.2)を持っています--date=iso-strict以下の私の回答を
VonC '25

4
git 2.7(2015年第4四半期)では、任意の日付形式にローカルタイムゾーンを使用するよう要求できます。以下の私の答えを参照しください。これは、に加えて--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"

ここの最初のステップは、ミリ秒のタイムスタンプを取得します。2行目を変更して、タイムスタンプの形式を自由に設定できます。この例では--date=local、に似たものがあり、日が埋め込まれています。


そして、毎回これを入力せずに永続的な効果が必要な場合は、

git config log.date iso 

または、このアカウントでのすべてのgit使用に影響を与えるには

git config --global log.date iso

15
そして、あなたはこのを毎回入力しなくても永久的な効果をしたい場合は、トライのようなものgit config log.date iso、このアカウントを持つすべてのあなたのgitの使用状況への影響のためか、git config --global log.date iso
ステフェイン・グーリッホン

12
独自のフォーマットを使用できます。Ben Allredの回答を参照してください。strftimeに--format:<args>渡さ<args>れます。
キャプテンマン

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
@Shiva:私は最近それがうまくいかなかったケースに遭遇しました、そしてそれはあなたが遭遇しているのと同じものかもしれません。古いバージョンの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バージョンです。git version 1.9.5.msysgit.1。では、新しいバージョンにアップグレードする必要がありますか?
Shiva

こんにちは、ベン、私は古いバージョンでした。私は最新にアップグレードし、これは動作します。そのため、私はあなたの回答を編集してそれをより明確にし(コメントを先頭に移動)、+ 1しました ありがとう!!
シバ

これはごちそうです!単純なbashスクリプトを使用してcsvをエクスポートすると、年、月、週などの列を持つことができます。
ジェイミーテイラー

1
@EdRandall:を参照している場合%X、~~私は自分のマシンで試してみて、確実に自分のタイムゾーンで時間を取得しています。~~うーん、今はわかりません。私は自分のタイムゾーンにない誰かからレポを複製して、再試行しました。現在のロケール設定を使用してフォーマットされた時間を取得していると思いますが、タイムゾーンが省略されています。
Ben Allred、2016年

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 2013

7
何について--date=short shows only date but not time, in YYYY-MM-DD format.
Paaske 14年

3
zshとbashでは、ターミナルに出力が表示されますが、パイプを使用して何かにパイプすると、「バックスペース」データがまだ残っています。これは、機能| sort | uniqしないなどのことを意味します。
chmac、2014年

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 2015年

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

どのバージョンのgitをお持ちですか?
lac_dev


git log --pretty=format:"%h%x09%cd%x09%s" --date=format:'%Y-%m-%d %H:%M:%S %p'
アマチュアバリスタ2017

最後のコミットを表示しない@amateurbaristaの場合は、リクエストを読んでください。ar3は、最後のいくつかのコミットではなく、最後のコミットを表示しようとしています。
lac_dev 2017

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

-local手順としてGit 2.7(2015年第4四半期)が導入されます。
これは、以下に加えて、

--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 add00bacommit 547ed71(2015年9月3日)を参照してください。(による合併Junio C浜野- -7b09c45コミット、2015年10月5日)をpeff
gitster

特に、上記の最後の部分(commit add00ba)では次のように述べています。

date: " local"を日付形式に直交させます:

ほとんどの " --date"モードは日付の形式に関するものです。どのアイテムをどの順序で表示するかです。
しかし、「--date=local」は少し変わったものです。「通常の形式で日付を表示しますが、ローカルタイムゾーンを使用する」という意味です。
私たちが使用するタイムゾーンは実際のフォーマットに直交しており、「ローカライズされたiso8601」などを作成できなかった理由はありません。

このパッチは、 " local"ブールフィールドを " struct date_mode"に追加し、DATE_LOCAL要素をdate_mode_type列挙型から削除します(現在は単なるDATE_NORMALプラスですlocal=1)。
ユーザーは、新しい機能-localに任意の日付モード(「iso-local」など)に「」を追加することでアクセスできます。下位互換性のlocalため、「default-local」のエイリアスとして「」を保持しています。


2
format-localも作品に注意する必要があります!したがって、お気に入りのフォーマットとローカルフォーマットの力を融合させることは非常に完璧です。
責任者、

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、2019年2月7日)torvalds
gitster

「人間の」日付形式のドキュメントを追加

他のコンテキストで日付を書き込む方法と同様の形式で日付と時刻の情報を表示します。
年が指定されていない場合、読者は日付が現在の年であると推測します

冗長な情報を表示しないことで、読者は異なる情報に集中します。
パッチはgit、コマンドの実行時にコマンドを実行しているマシンの日付から推測された情報に基づいて相対日付を報告します。

この形式は推測された情報を削除することで人間にとってより有用ですが、実際に人間のものになるものはありません。
' relative'日付形式がまだ実装されていない場合は、 ' 'の使用relativeが適切でした。

human日付形式のテストを追加します。

human複数のフィールドを使用する場合、参照日付とローカルコンピュータの日付の時間差に応じて抑制されます。

  • 差が1年未満の場合、年フィールドは抑制されます。
  • 時間が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四半期)はコードを簡略化しました。

Stephen P.Smith ( ``)によるコミット47b27c9コミット29f4332(2019年9月12日)を参照してください。(合併によりJunio C浜野- -36d2fcaコミット 2019年10月7日)
gitster

「今」を日付コードに渡すのをやめる

コミットb841d4fhumantest-toolへのフォーマットの追加、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]"

詳しく説明しますか?また、あなたの回答にはすでに作者フィールドと履歴があります。署名する必要はありません。
Kissaki

2

Bashとdateコマンドを使用して、ISOのような形式から必要な形式に変換します。私が欲しかったORG-モード私はこれをしたので、日付形式(およびリスト項目を):

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.